From 92a7a5d84edf50e703f69e2ab0fd642c8de5f35c Mon Sep 17 00:00:00 2001 From: "cool.gitter.not.me.again.duh" Date: Fri, 30 May 2025 21:28:21 -0600 Subject: [PATCH] first commit --- .github/ISSUE_TEMPLATE/bug_report.md | 32 + .github/ISSUE_TEMPLATE/feature_request.md | 20 + .github/dependabot.yml | 11 + .github/workflows/codeql-analysis.yml | 67 + .gitignore | 145 + README.md | 106 + librespot/__init__.py | 34 + librespot/audio/__init__.py | 912 ++++ librespot/audio/decoders.py | 81 + librespot/audio/decrypt.py | 45 + librespot/audio/format.py | 32 + librespot/audio/storage.py | 139 + librespot/cache.py | 18 + librespot/core.py | 2307 ++++++++++ librespot/crypto.py | 412 ++ librespot/dealer.py | 11 + librespot/mercury.py | 394 ++ librespot/metadata.py | 283 ++ librespot/proto/Authentication_pb2.py | 1984 +++++++++ librespot/proto/CanvazMeta_pb2.py | 91 + librespot/proto/Canvaz_pb2.py | 564 +++ librespot/proto/ClientToken_pb2.py | 63 + librespot/proto/Connect_pb2.py | 2340 +++++++++++ librespot/proto/Connectivity_pb2.py | 36 + librespot/proto/ContextPage_pb2.py | 239 ++ librespot/proto/ContextPlayerOptions_pb2.py | 215 + librespot/proto/ContextTrack_pb2.py | 214 + librespot/proto/Context_pb2.py | 260 ++ librespot/proto/ExplicitContentPubsub_pb2.py | 147 + librespot/proto/Keyexchange_pb2.py | 2497 +++++++++++ librespot/proto/Mercury_pb2.py | 625 +++ librespot/proto/Metadata_pb2.py | 3698 +++++++++++++++++ librespot/proto/PlayOrigin_pb2.py | 193 + librespot/proto/Playback_pb2.py | 162 + librespot/proto/Player_pb2.py | 1851 +++++++++ librespot/proto/Playlist4External_pb2.py | 3221 ++++++++++++++ librespot/proto/PlaylistAnnotate3_pb2.py | 460 ++ librespot/proto/Pubsub_pb2.py | 112 + librespot/proto/Queue_pb2.py | 104 + librespot/proto/Restrictions_pb2.py | 480 +++ librespot/proto/Session_pb2.py | 149 + librespot/proto/StorageResolve_pb2.py | 154 + librespot/proto/TransferState_pb2.py | 174 + librespot/proto/__init__.py | 0 librespot/proto/spotify/__init__.py | 0 librespot/proto/spotify/login5/__init__.py | 0 .../proto/spotify/login5/v3/ClientInfo_pb2.py | 98 + .../proto/spotify/login5/v3/Login5_pb2.py | 972 +++++ .../proto/spotify/login5/v3/UserInfo_pb2.py | 263 ++ librespot/proto/spotify/login5/v3/__init__.py | 0 .../spotify/login5/v3/challenges/Code_pb2.py | 224 + .../login5/v3/challenges/Hashcash_pb2.py | 176 + .../spotify/login5/v3/challenges/__init__.py | 0 .../login5/v3/credentials/Credentials_pb2.py | 483 +++ .../spotify/login5/v3/credentials/__init__.py | 0 .../login5/v3/identifiers/Identifiers.py | 119 + .../spotify/login5/v3/identifiers/__init__.py | 0 librespot/structure.py | 103 + librespot/util.py | 117 + librespot/zeroconf.py | 417 ++ librespot_player/__init__.py | 205 + proto/authentication.proto | 168 + proto/canvaz-meta.proto | 14 + proto/canvaz.proto | 40 + proto/client_token.proto | 125 + proto/connect.proto | 173 + proto/connectivity.proto | 51 + proto/context.proto | 18 + proto/context_page.proto | 16 + proto/context_player_options.proto | 18 + proto/context_track.proto | 13 + proto/explicit_content_pubsub.proto | 15 + proto/keyexchange.proto | 231 + proto/mercury.proto | 49 + proto/metadata.proto | 279 ++ proto/play_origin.proto | 16 + proto/playback.proto | 16 + proto/player.proto | 102 + proto/playlist4_external.proto | 229 + proto/playlist_annotate3.proto | 39 + proto/pubsub.proto | 11 + proto/queue.proto | 13 + proto/restrictions.proto | 30 + proto/session.proto | 17 + proto/spotify/login5/v3/challenges/code.proto | 19 + .../login5/v3/challenges/hashcash.proto | 16 + proto/spotify/login5/v3/client_info.proto | 9 + .../login5/v3/credentials/credentials.proto | 35 + .../login5/v3/identifiers/identifiers.proto | 10 + proto/spotify/login5/v3/login5.proto | 75 + proto/spotify/login5/v3/user_info.proto | 21 + proto/storage-resolve.proto | 18 + proto/transfer_state.proto | 19 + requirements.txt | 7 + setup.py | 17 + 95 files changed, 30188 insertions(+) create mode 100644 .github/ISSUE_TEMPLATE/bug_report.md create mode 100644 .github/ISSUE_TEMPLATE/feature_request.md create mode 100644 .github/dependabot.yml create mode 100644 .github/workflows/codeql-analysis.yml create mode 100644 .gitignore create mode 100644 README.md create mode 100644 librespot/__init__.py create mode 100644 librespot/audio/__init__.py create mode 100644 librespot/audio/decoders.py create mode 100644 librespot/audio/decrypt.py create mode 100644 librespot/audio/format.py create mode 100644 librespot/audio/storage.py create mode 100644 librespot/cache.py create mode 100644 librespot/core.py create mode 100644 librespot/crypto.py create mode 100644 librespot/dealer.py create mode 100644 librespot/mercury.py create mode 100644 librespot/metadata.py create mode 100644 librespot/proto/Authentication_pb2.py create mode 100644 librespot/proto/CanvazMeta_pb2.py create mode 100644 librespot/proto/Canvaz_pb2.py create mode 100644 librespot/proto/ClientToken_pb2.py create mode 100644 librespot/proto/Connect_pb2.py create mode 100644 librespot/proto/Connectivity_pb2.py create mode 100644 librespot/proto/ContextPage_pb2.py create mode 100644 librespot/proto/ContextPlayerOptions_pb2.py create mode 100644 librespot/proto/ContextTrack_pb2.py create mode 100644 librespot/proto/Context_pb2.py create mode 100644 librespot/proto/ExplicitContentPubsub_pb2.py create mode 100644 librespot/proto/Keyexchange_pb2.py create mode 100644 librespot/proto/Mercury_pb2.py create mode 100644 librespot/proto/Metadata_pb2.py create mode 100644 librespot/proto/PlayOrigin_pb2.py create mode 100644 librespot/proto/Playback_pb2.py create mode 100644 librespot/proto/Player_pb2.py create mode 100644 librespot/proto/Playlist4External_pb2.py create mode 100644 librespot/proto/PlaylistAnnotate3_pb2.py create mode 100644 librespot/proto/Pubsub_pb2.py create mode 100644 librespot/proto/Queue_pb2.py create mode 100644 librespot/proto/Restrictions_pb2.py create mode 100644 librespot/proto/Session_pb2.py create mode 100644 librespot/proto/StorageResolve_pb2.py create mode 100644 librespot/proto/TransferState_pb2.py create mode 100644 librespot/proto/__init__.py create mode 100644 librespot/proto/spotify/__init__.py create mode 100644 librespot/proto/spotify/login5/__init__.py create mode 100644 librespot/proto/spotify/login5/v3/ClientInfo_pb2.py create mode 100644 librespot/proto/spotify/login5/v3/Login5_pb2.py create mode 100644 librespot/proto/spotify/login5/v3/UserInfo_pb2.py create mode 100644 librespot/proto/spotify/login5/v3/__init__.py create mode 100644 librespot/proto/spotify/login5/v3/challenges/Code_pb2.py create mode 100644 librespot/proto/spotify/login5/v3/challenges/Hashcash_pb2.py create mode 100644 librespot/proto/spotify/login5/v3/challenges/__init__.py create mode 100644 librespot/proto/spotify/login5/v3/credentials/Credentials_pb2.py create mode 100644 librespot/proto/spotify/login5/v3/credentials/__init__.py create mode 100644 librespot/proto/spotify/login5/v3/identifiers/Identifiers.py create mode 100644 librespot/proto/spotify/login5/v3/identifiers/__init__.py create mode 100644 librespot/structure.py create mode 100644 librespot/util.py create mode 100644 librespot/zeroconf.py create mode 100644 librespot_player/__init__.py create mode 100644 proto/authentication.proto create mode 100644 proto/canvaz-meta.proto create mode 100644 proto/canvaz.proto create mode 100644 proto/client_token.proto create mode 100644 proto/connect.proto create mode 100644 proto/connectivity.proto create mode 100644 proto/context.proto create mode 100644 proto/context_page.proto create mode 100644 proto/context_player_options.proto create mode 100644 proto/context_track.proto create mode 100644 proto/explicit_content_pubsub.proto create mode 100644 proto/keyexchange.proto create mode 100644 proto/mercury.proto create mode 100644 proto/metadata.proto create mode 100644 proto/play_origin.proto create mode 100644 proto/playback.proto create mode 100644 proto/player.proto create mode 100644 proto/playlist4_external.proto create mode 100644 proto/playlist_annotate3.proto create mode 100644 proto/pubsub.proto create mode 100644 proto/queue.proto create mode 100644 proto/restrictions.proto create mode 100644 proto/session.proto create mode 100644 proto/spotify/login5/v3/challenges/code.proto create mode 100644 proto/spotify/login5/v3/challenges/hashcash.proto create mode 100644 proto/spotify/login5/v3/client_info.proto create mode 100644 proto/spotify/login5/v3/credentials/credentials.proto create mode 100644 proto/spotify/login5/v3/identifiers/identifiers.proto create mode 100644 proto/spotify/login5/v3/login5.proto create mode 100644 proto/spotify/login5/v3/user_info.proto create mode 100644 proto/storage-resolve.proto create mode 100644 proto/transfer_state.proto create mode 100644 requirements.txt create mode 100644 setup.py diff --git a/.github/ISSUE_TEMPLATE/bug_report.md b/.github/ISSUE_TEMPLATE/bug_report.md new file mode 100644 index 0000000..b71303d --- /dev/null +++ b/.github/ISSUE_TEMPLATE/bug_report.md @@ -0,0 +1,32 @@ +--- +name: Bug report +about: Create a report to help us improve +title: "[BUG]" +labels: bug +assignees: '' + +--- + +**Describe the bug** +A clear and concise description of what the bug is. + +**To Reproduce** +Steps to reproduce the behavior: +1. Go to '...' +2. Click on '....' +3. Scroll down to '....' +4. See error + +**Expected behavior** +A clear and concise description of what you expected to happen. + +**Screenshots** +If applicable, add screenshots to help explain your problem. + +**Client Information (please complete the following information):** + - OS: [e.g. Windows] + - Python Version [e.g. 3.9.0] + - Library Version [e.g. 0.0.1] + +**Additional context** +Add any other context about the problem here. diff --git a/.github/ISSUE_TEMPLATE/feature_request.md b/.github/ISSUE_TEMPLATE/feature_request.md new file mode 100644 index 0000000..9cde18a --- /dev/null +++ b/.github/ISSUE_TEMPLATE/feature_request.md @@ -0,0 +1,20 @@ +--- +name: Feature request +about: Suggest an idea for this project +title: "[REQUEST]" +labels: enhancement +assignees: '' + +--- + +**Is your feature request related to a problem? Please describe.** +A clear and concise description of what the problem is. Ex. I'm always frustrated when [...] + +**Describe the solution you'd like** +A clear and concise description of what you want to happen. + +**Describe alternatives you've considered** +A clear and concise description of any alternative solutions or features you've considered. + +**Additional context** +Add any other context or screenshots about the feature request here. diff --git a/.github/dependabot.yml b/.github/dependabot.yml new file mode 100644 index 0000000..cf7a39f --- /dev/null +++ b/.github/dependabot.yml @@ -0,0 +1,11 @@ +# To get started with Dependabot version updates, you'll need to specify which +# package ecosystems to update and where the package manifests are located. +# Please see the documentation for all configuration options: +# https://help.github.com/github/administering-a-repository/configuration-options-for-dependency-updates + +version: 2 +updates: + - package-ecosystem: "pip" # See documentation for possible values + directory: "/" # Location of package manifests + schedule: + interval: "daily" diff --git a/.github/workflows/codeql-analysis.yml b/.github/workflows/codeql-analysis.yml new file mode 100644 index 0000000..51d5ddf --- /dev/null +++ b/.github/workflows/codeql-analysis.yml @@ -0,0 +1,67 @@ +# For most projects, this workflow file will not need changing; you simply need +# to commit it to your repository. +# +# You may wish to alter this file to override the set of languages analyzed, +# or to provide custom queries or build logic. +# +# ******** NOTE ******** +# We have attempted to detect the languages in your repository. Please check +# the `language` matrix defined below to confirm you have the correct set of +# supported CodeQL languages. +# +name: "CodeQL" + +on: + push: + branches: [ main ] + pull_request: + # The branches below must be a subset of the branches above + branches: [ main ] + schedule: + - cron: '30 5 * * 4' + +jobs: + analyze: + name: Analyze + runs-on: ubuntu-latest + + strategy: + fail-fast: false + matrix: + language: [ 'python' ] + # CodeQL supports [ 'cpp', 'csharp', 'go', 'java', 'javascript', 'python' ] + # Learn more: + # https://docs.github.com/en/free-pro-team@latest/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#changing-the-languages-that-are-analyzed + + steps: + - name: Checkout repository + uses: actions/checkout@v2 + + # Initializes the CodeQL tools for scanning. + - name: Initialize CodeQL + uses: github/codeql-action/init@v1 + with: + languages: ${{ matrix.language }} + # If you wish to specify custom queries, you can do so here or in a config file. + # By default, queries listed here will override any specified in a config file. + # Prefix the list here with "+" to use these queries and those in the config file. + # queries: ./path/to/local/query, your-org/your-repo/queries@main + + # Autobuild attempts to build any compiled languages (C/C++, C#, or Java). + # If this step fails, then you should remove it and run the build manually (see below) + - name: Autobuild + uses: github/codeql-action/autobuild@v1 + + # â„šī¸ Command-line programs to run using the OS shell. + # 📚 https://git.io/JvXDl + + # âœī¸ If the Autobuild fails above, remove it and uncomment the following three lines + # and modify them (or add more) to build your code if your project + # uses a compiled language + + #- run: | + # make bootstrap + # make release + + - name: Perform CodeQL Analysis + uses: github/codeql-action/analyze@v1 diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1443123 --- /dev/null +++ b/.gitignore @@ -0,0 +1,145 @@ +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# for PyCharm +.idea/ + +# ignore Some (Files/Directories) +credentials.json +test.py diff --git a/README.md b/README.md new file mode 100644 index 0000000..24e5854 --- /dev/null +++ b/README.md @@ -0,0 +1,106 @@ +# librespot-spotizerr + +Open Source Spotify Client + +## About The Project + +This project is to further add more features for the spotizerr project, forked from [librespot-python](https://github.com/Xoconoch/librespot-spotizerr) + +## Note + +It is still in the idea stage, so there is a possibility of unintended behavior +or major specification changes.
+We **DO NOT** encourage piracy and **DO NOT** support any form of downloader/recorder designed with the help of this repository and in general anything that goes against the Spotify ToS.
+ +## Getting Started + +### Prerequisites + +- [Python](https://python.org/) + +### Installation + +Stable Version + +```commandline +pip install librespot +``` + +Snapshot Version \***Recommended** + +```commandline +pip install git+https://github.com/Xoconoch/librespot-spotizerr +``` + +## Usage + +### Use Zeroconf for Login (no premium required) + +```python +from librespot.zeroconf import ZeroconfServer +import time +import logging +import pathlib + +zs = ZeroconfServer.Builder().create() +logging.warning("Transfer playback from desktop client to librespot-spotizerr via Spotify Connect in order to store session") + +while True: + time.sleep(1) + if zs._ZeroconfServer__session: + logging.warning(f"Grabbed {zs._ZeroconfServer__session} for {zs._ZeroconfServer__session.username()}") + + if pathlib.Path("credentials.json").exists(): + logging.warning("Session stored in credentials.json. Now you can Ctrl+C") + break +``` + +### Get Music Stream + +*Currently, music streaming is supported, but it may cause unintended behavior.
+ +```python +from librespot.core import Session +from librespot.metadata import TrackId +from librespot.audio.decoders import AudioQuality, VorbisOnlyAudioQuality + +session = Session.Builder() \ + .user_pass("Username", "Password") \ + .create() + +track_id = TrackId.from_uri("spotify:track:xxxxxxxxxxxxxxxxxxxxxx") +stream = session.content_feeder().load(track_id, VorbisOnlyAudioQuality(AudioQuality.VERY_HIGH), False, None) +# stream.input_stream.stream().read() to get one byte of the music stream. +``` + +Other uses are +[examples](https://github.com/Xoconoch/librespot-spotizerr/tree/main/examples) +or read [this document](https://librespot-spotizerr.rtfd.io) for detailed +specifications. + +## Debug + +To display the debug information, you need to inject the following code at the +top of the code. + +```python +import logging + + +logging.basicConfig(level=logging.DEBUG) +``` + +## Contributing + +Pull requests are welcome. + +## License + +Distributed under the GPL yada yada, See +[LICENSE](https://github.com/Xoconoch/librespot-spotizerr/blob/main/LICENSE) +for more information. + +## Related Projects + +- [Librespot](https://github.com/librespot-org/librespot) (Concept) +- [Librespot-Java](https://github.com/librespot-org/librespot-java) (Core) diff --git a/librespot/__init__.py b/librespot/__init__.py new file mode 100644 index 0000000..484d0b3 --- /dev/null +++ b/librespot/__init__.py @@ -0,0 +1,34 @@ +from __future__ import annotations +from librespot.crypto import DiffieHellman +from librespot.proto.Keyexchange_pb2 import BuildInfo, Platform, Product, ProductFlags +from librespot.structure import Closeable, Runnable +import platform + + +class Version: + version_name = "0.0.9" + + @staticmethod + def platform() -> Platform: + if platform.system() == "Windows": + return Platform.PLATFORM_WIN32_X86 + if platform.system() == "Darwin": + return Platform.PLATFORM_OSX_X86 + return Platform.PLATFORM_LINUX_X86 + + @staticmethod + def version_string(): + return "librespot-spotizerr " + Version.version_name + + @staticmethod + def system_info_string(): + return Version.version_string() + \ + "; Python " + platform.python_version() + \ + "; " + platform.system() + + @staticmethod + def standard_build_info() -> BuildInfo: + return BuildInfo(product=Product.PRODUCT_CLIENT, + product_flags=[ProductFlags.PRODUCT_FLAG_NONE], + platform=Version.platform(), + version=117300517) diff --git a/librespot/audio/__init__.py b/librespot/audio/__init__.py new file mode 100644 index 0000000..423c59c --- /dev/null +++ b/librespot/audio/__init__.py @@ -0,0 +1,912 @@ +from __future__ import annotations +from librespot import util +from librespot.audio.decrypt import AesAudioDecrypt +from librespot.audio.format import SuperAudioFormat +from librespot.audio.storage import ChannelManager +from librespot.cache import CacheManager +from librespot.crypto import Packet +from librespot.metadata import EpisodeId, PlayableId, TrackId +from librespot.proto import Metadata_pb2 as Metadata, StorageResolve_pb2 as StorageResolve +from librespot.structure import AudioDecrypt, AudioQualityPicker, Closeable, FeederException, GeneralAudioStream, GeneralWritableStream, HaltListener, NoopAudioDecrypt, PacketsReceiver +import concurrent.futures +import io +import logging +import math +import queue +import random +import struct +import threading +import time +import typing +import urllib.parse + +if typing.TYPE_CHECKING: + from librespot.core import Session + + +class AbsChunkedInputStream(io.BytesIO, HaltListener): + chunk_exception = None + closed = False + max_chunk_tries = 128 + preload_ahead = 3 + preload_chunk_retries = 2 + retries: typing.List[int] + retry_on_chunk_error: bool + wait_lock: threading.Condition = threading.Condition() + wait_for_chunk = -1 + __decoded_length = 0 + __mark = 0 + __pos = 0 + + def __init__(self, retry_on_chunk_error: bool): + super().__init__() + self.retries = [0] * self.chunks() + self.retry_on_chunk_error = retry_on_chunk_error + + def is_closed(self) -> bool: + return self.closed + + def buffer(self) -> typing.List[bytes]: + raise NotImplementedError() + + def size(self) -> int: + raise NotImplementedError() + + def close(self) -> None: + self.closed = True + with self.wait_lock: + self.wait_lock.notify_all() + + def available(self): + return self.size() - self.__pos + + def mark_supported(self) -> bool: + return True + + def mark(self, read_ahead_limit: int) -> None: + self.__mark = self.__pos + + def reset(self) -> None: + self.__pos = self.__mark + + def pos(self) -> int: + return self.__pos + + def seek(self, where: int, **kwargs) -> None: + if where < 0: + raise TypeError() + if self.closed: + raise IOError("Stream is closed!") + self.__pos = where + self.check_availability(int(self.__pos / (128 * 1024)), False, False) + + def skip(self, n: int) -> int: + if n < 0: + raise TypeError() + if self.closed: + raise IOError("Stream is closed!") + k = self.size() - self.__pos + if n < k: + k = n + self.__pos += k + chunk = int(self.__pos / (128 * 1024)) + self.check_availability(chunk, False, False) + return k + + def requested_chunks(self) -> typing.List[bool]: + raise NotImplementedError() + + def available_chunks(self) -> typing.List[bool]: + raise NotImplementedError() + + def chunks(self) -> int: + raise NotImplementedError() + + def request_chunk_from_stream(self, index: int) -> None: + raise NotImplementedError() + + def should_retry(self, chunk: int) -> bool: + if self.retries[chunk] < 1: + return True + if self.retries[chunk] > self.max_chunk_tries: + return False + return self.retry_on_chunk_error + + def check_availability(self, chunk: int, wait: bool, halted: bool) -> None: + if halted and not wait: + raise TypeError() + if not self.requested_chunks()[chunk]: + self.request_chunk_from_stream(chunk) + self.requested_chunks()[chunk] = True + for i in range(chunk + 1, + min(self.chunks() - 1, chunk + self.preload_ahead) + 1): + if (self.requested_chunks()[i] + and self.retries[i] < self.preload_chunk_retries): + self.request_chunk_from_stream(i) + self.requested_chunks()[chunk] = True + if wait: + if self.available_chunks()[chunk]: + return + retry = False + with self.wait_lock: + if not halted: + self.stream_read_halted(chunk, int(time.time() * 1000)) + self.chunk_exception = None + self.wait_for_chunk = chunk + self.wait_lock.wait_for(lambda: self.available_chunks()[chunk]) + if self.closed: + return + if self.chunk_exception is not None: + if self.should_retry(chunk): + retry = True + else: + raise AbsChunkedInputStream.ChunkException + if not retry: + self.stream_read_halted(chunk, int(time.time() * 1000)) + if retry: + time.sleep(math.log10(self.retries[chunk])) + self.check_availability(chunk, True, True) + + def read(self, __size: int = 0) -> bytes: + if self.closed: + raise IOError("Stream is closed!") + if __size <= 0: + if self.__pos == self.size(): + return b"" + buffer = io.BytesIO() + total_size = self.size() + chunk = int(self.__pos / (128 * 1024)) + chunk_off = int(self.__pos % (128 * 1024)) + chunk_total = int(math.ceil(total_size / (128 * 1024))) + self.check_availability(chunk, True, False) + buffer.write(self.buffer()[chunk][chunk_off:]) + chunk += 1 + if chunk != chunk_total: + while chunk <= chunk_total - 1: + self.check_availability(chunk, True, False) + buffer.write(self.buffer()[chunk]) + chunk += 1 + buffer.seek(0) + self.__pos += buffer.getbuffer().nbytes + return buffer.read() + buffer = io.BytesIO() + chunk = int(self.__pos / (128 * 1024)) + chunk_off = int(self.__pos % (128 * 1024)) + chunk_end = int(__size / (128 * 1024)) + chunk_end_off = int(__size % (128 * 1024)) + if chunk_end > self.size(): + chunk_end = int(self.size() / (128 * 1024)) + chunk_end_off = int(self.size() % (128 * 1024)) + self.check_availability(chunk, True, False) + if chunk_off + __size > len(self.buffer()[chunk]): + buffer.write(self.buffer()[chunk][chunk_off:]) + chunk += 1 + while chunk <= chunk_end: + self.check_availability(chunk, True, False) + if chunk == chunk_end: + buffer.write(self.buffer()[chunk][:chunk_end_off]) + else: + buffer.write(self.buffer()[chunk]) + chunk += 1 + else: + buffer.write(self.buffer()[chunk][chunk_off:chunk_off + __size]) + buffer.seek(0) + self.__pos += buffer.getbuffer().nbytes + return buffer.read() + + def notify_chunk_available(self, index: int) -> None: + self.available_chunks()[index] = True + self.__decoded_length += len(self.buffer()[index]) + with self.wait_lock: + if index == self.wait_for_chunk and not self.closed: + self.wait_for_chunk = -1 + self.wait_lock.notify_all() + + def notify_chunk_error(self, index: int, ex): + self.available_chunks()[index] = False + self.requested_chunks()[index] = False + self.retries[index] += 1 + with self.wait_lock: + if index == self.wait_for_chunk and not self.closed: + self.chunk_exception = ex + self.wait_for_chunk = -1 + self.wait_lock.notify_all() + + def decoded_length(self): + return self.__decoded_length + + class ChunkException(IOError): + + @staticmethod + def from_stream_error(stream_error: int): + return AbsChunkedInputStream \ + .ChunkException("Failed due to stream error, code: {}".format(stream_error)) + + +class AudioKeyManager(PacketsReceiver, Closeable): + audio_key_request_timeout = 20 + logger = logging.getLogger("Librespot:AudioKeyManager") + __callbacks: typing.Dict[int, Callback] = {} + __seq_holder = 0 + __seq_holder_lock = threading.Condition() + __session: Session + __zero_short = b"\x00\x00" + + def __init__(self, session: Session): + self.__session = session + + def dispatch(self, packet: Packet) -> None: + payload = io.BytesIO(packet.payload) + seq = struct.unpack(">i", payload.read(4))[0] + callback = self.__callbacks.get(seq) + if callback is None: + self.logger.warning( + "Couldn't find callback for seq: {}".format(seq)) + return + if packet.is_cmd(Packet.Type.aes_key): + key = payload.read(16) + callback.key(key) + elif packet.is_cmd(Packet.Type.aes_key_error): + code = struct.unpack(">H", payload.read(2))[0] + callback.error(code) + else: + self.logger.warning( + "Couldn't handle packet, cmd: {}, length: {}".format( + packet.cmd, len(packet.payload))) + + def get_audio_key(self, + gid: bytes, + file_id: bytes, + retry: bool = True) -> bytes: + seq: int + with self.__seq_holder_lock: + seq = self.__seq_holder + self.__seq_holder += 1 + out = io.BytesIO() + out.write(file_id) + out.write(gid) + out.write(struct.pack(">i", seq)) + out.write(self.__zero_short) + out.seek(0) + self.__session.send(Packet.Type.request_key, out.read()) + callback = AudioKeyManager.SyncCallback(self) + self.__callbacks[seq] = callback + key = callback.wait_response() + if key is None: + if retry: + return self.get_audio_key(gid, file_id, False) + raise RuntimeError( + "Failed fetching audio key! gid: {}, fileId: {}".format( + util.bytes_to_hex(gid), util.bytes_to_hex(file_id))) + return key + + class Callback: + + def key(self, key: bytes) -> None: + raise NotImplementedError + + def error(self, code: int) -> None: + raise NotImplementedError + + class SyncCallback(Callback): + __audio_key_manager: AudioKeyManager + __reference = queue.Queue() + __reference_lock = threading.Condition() + + def __init__(self, audio_key_manager: AudioKeyManager): + self.__audio_key_manager = audio_key_manager + + def key(self, key: bytes) -> None: + with self.__reference_lock: + self.__reference.put(key) + self.__reference_lock.notify_all() + + def error(self, code: int) -> None: + self.__audio_key_manager.logger.fatal( + "Audio key error, code: {}".format(code)) + with self.__reference_lock: + self.__reference.put(None) + self.__reference_lock.notify_all() + + def wait_response(self) -> bytes: + with self.__reference_lock: + self.__reference_lock.wait( + AudioKeyManager.audio_key_request_timeout) + return self.__reference.get(block=False) + + +class CdnFeedHelper: + _LOGGER: logging = logging.getLogger(__name__) + + @staticmethod + def get_url(resp: StorageResolve.StorageResolveResponse) -> str: + selected_url = random.choice(resp.cdnurl) + while "audio4-gm-fb" in selected_url or "audio-gm-fb" in selected_url: + selected_url = random.choice(resp.cdnurl) + return selected_url + + @staticmethod + def load_track( + session: Session, track: Metadata.Track, file: Metadata.AudioFile, + resp_or_url: typing.Union[StorageResolve.StorageResolveResponse, + str], preload: bool, + halt_listener: HaltListener) -> PlayableContentFeeder.LoadedStream: + if type(resp_or_url) is str: + url = resp_or_url + else: + url = CdnFeedHelper.get_url(resp_or_url) + start = int(time.time() * 1000) + key = session.audio_key().get_audio_key(track.gid, file.file_id) + audio_key_time = int(time.time() * 1000) - start + + streamer = session.cdn().stream_file(file, key, url, halt_listener) + input_stream = streamer.stream() + normalization_data = NormalizationData.read(input_stream) + if input_stream.skip(0xA7) != 0xA7: + raise IOError("Couldn't skip 0xa7 bytes!") + return PlayableContentFeeder.LoadedStream( + track, + streamer, + normalization_data, + PlayableContentFeeder.Metrics(file.file_id, preload, + -1 if preload else audio_key_time), + ) + + @staticmethod + def load_episode_external( + session: Session, episode: Metadata.Episode, + halt_listener: HaltListener) -> PlayableContentFeeder.LoadedStream: + resp = session.client().head(episode.external_url) + + if resp.status_code != 200: + CdnFeedHelper._LOGGER.warning("Couldn't resolve redirect!") + + url = resp.url + CdnFeedHelper._LOGGER.debug("Fetched external url for {}: {}".format( + util.bytes_to_hex(episode.gid), url)) + + streamer = session.cdn().stream_external_episode( + episode, url, halt_listener) + return PlayableContentFeeder.LoadedStream( + episode, + streamer, + None, + PlayableContentFeeder.Metrics(None, False, -1), + ) + + @staticmethod + def load_episode( + session: Session, + episode: Metadata.Episode, + file: Metadata.AudioFile, + resp_or_url: typing.Union[StorageResolve.StorageResolveResponse, str], + preload: bool, + halt_listener: HaltListener, + ) -> PlayableContentFeeder.LoadedStream: + if type(resp_or_url) is str: + url = resp_or_url + else: + url = CdnFeedHelper.get_url(resp_or_url) + start = int(time.time() * 1000) + key = session.audio_key().get_audio_key(episode.gid, file.file_id) + audio_key_time = int(time.time() * 1000) - start + + streamer = session.cdn().stream_file(file, key, url, halt_listener) + input_stream = streamer.stream() + normalization_data = NormalizationData.read(input_stream) + if input_stream.skip(0xA7) != 0xA7: + raise IOError("Couldn't skip 0xa7 bytes!") + return PlayableContentFeeder.LoadedStream( + episode, + streamer, + normalization_data, + PlayableContentFeeder.Metrics(file.file_id, preload, + -1 if preload else audio_key_time), + ) + + +class CdnManager: + logger: logging = logging.getLogger("Librespot:CdnManager") + __session: Session + + def __init__(self, session: Session): + self.__session = session + + def get_head(self, file_id: bytes): + response = self.__session.client() \ + .get(self.__session.get_user_attribute("head-files-url", "https://heads-fa.spotify.com/head/{file_id}") + .replace("{file_id}", util.bytes_to_hex(file_id))) + if response.status_code != 200: + raise IOError("{}".format(response.status_code)) + body = response.content + if body is None: + raise IOError("Response body is empty!") + return body + + def stream_external_episode(self, episode: Metadata.Episode, + external_url: str, + halt_listener: HaltListener): + return CdnManager.Streamer( + self.__session, + StreamId(episode=episode), + SuperAudioFormat.MP3, + CdnManager.CdnUrl(self, None, external_url), + self.__session.cache(), + NoopAudioDecrypt(), + halt_listener, + ) + + def stream_file(self, file: Metadata.AudioFile, key: bytes, url: str, + halt_listener: HaltListener): + return CdnManager.Streamer( + self.__session, + StreamId(file=file), + SuperAudioFormat.get(file.format), + CdnManager.CdnUrl(self, file.file_id, url), + self.__session.cache(), + AesAudioDecrypt(key), + halt_listener, + ) + + def get_audio_url(self, file_id: bytes): + response = self.__session.api()\ + .send("GET", "/storage-resolve/files/audio/interactive/{}".format(util.bytes_to_hex(file_id)), None, None) + if response.status_code != 200: + raise IOError(response.status_code) + body = response.content + if body is None: + raise IOError("Response body is empty!") + proto = StorageResolve.StorageResolveResponse() + proto.ParseFromString(body) + if proto.result == StorageResolve.StorageResolveResponse.Result.CDN: + url = random.choice(proto.cdnurl) + self.logger.debug("Fetched CDN url for {}: {}".format( + util.bytes_to_hex(file_id), url)) + return url + raise CdnManager.CdnException( + "Could not retrieve CDN url! result: {}".format(proto.result)) + + class CdnException(Exception): + pass + + class InternalResponse: + buffer: bytes + headers: typing.Dict[str, str] + + def __init__(self, buffer: bytes, headers: typing.Dict[str, str]): + self.buffer = buffer + self.headers = headers + + class CdnUrl: + __cdn_manager = None + __file_id: bytes + __expiration: int + url: str + + def __init__(self, cdn_manager, file_id: typing.Union[bytes, None], + url: str): + self.__cdn_manager: CdnManager = cdn_manager + self.__file_id = file_id + self.set_url(url) + + def url(self): + if self.__expiration == -1: + return self.url + if self.__expiration <= int(time.time() * 1000) + 5 * 60 * 1000: + self.url = self.__cdn_manager.get_audio_url(self.__file_id) + return self.url + + def set_url(self, url: str): + self.url = url + if self.__file_id is not None: + token_url = urllib.parse.urlparse(url) + token_query = urllib.parse.parse_qs(token_url.query) + token_list = token_query.get("__token__") + try: + token_str = str(token_list[0]) + except TypeError: + token_str = "" + expires_list = token_query.get("Expires") + try: + expires_str = str(expires_list[0]) + except TypeError: + expires_str = "" + if token_str != "None" and len(token_str) != 0: + expire_at = None + split = token_str.split("~") + for s in split: + try: + i = s.index("=") + except ValueError: + continue + if s[:i] == "exp": + expire_at = int(s[i + 1:]) + break + if expire_at is None: + self.__expiration = -1 + self.__cdn_manager.logger.warning( + "Invalid __token__ in CDN url: {}".format(url)) + return + self.__expiration = expire_at * 1000 + elif expires_str != "None" and len(expires_str) != 0: + expires_at = None + expires_str = expires_str.split("~")[0] + expires_at = int(expires_str) + if expires_at is None: + self.__expiration = -1 + self.__cdn_manager.logger.warning("Invalid Expires param in CDN url: {}".format(url)) + return + self.__expiration = expires_at * 1000 + else: + try: + i = token_url.query.index("_") + except ValueError: + self.__expiration = -1 + self.__cdn_manager.logger \ + .warning("Couldn't extract expiration, invalid parameter in CDN url: {}".format(url)) + return + self.__expiration = int(token_url.query[:i]) * 1000 + + else: + self.__expiration = -1 + + class Streamer(GeneralAudioStream, GeneralWritableStream): + available: typing.List[bool] + buffer: typing.List[bytes] + chunks: int + executor_service = concurrent.futures.ThreadPoolExecutor() + halt_listener: HaltListener + requested: typing.List[bool] + size: int + __audio_format: SuperAudioFormat + __audio_decrypt: AudioDecrypt + __cdn_url: CdnManager.CdnUrl + __internal_stream: InternalStream + __session: Session + __stream_id: StreamId + + def __init__(self, session: Session, stream_id: StreamId, + audio_format: SuperAudioFormat, + cdn_url: CdnManager.CdnUrl, cache: CacheManager, + audio_decrypt: AudioDecrypt, halt_listener: HaltListener): + self.__session = session + self.__stream_id = stream_id + self.__audio_format = audio_format + self.__audio_decrypt = audio_decrypt + self.__cdn_url = cdn_url + self.halt_listener = halt_listener + response = self.request(range_start=0, + range_end=ChannelManager.chunk_size - 1) + content_range = response.headers.get("Content-Range") + if content_range is None: + raise IOError("Missing Content-Range header!") + split = content_range.split("/") + self.size = int(split[1]) + self.chunks = int(math.ceil(self.size / ChannelManager.chunk_size)) + first_chunk = response.buffer + self.available = [False for _ in range(self.chunks)] + self.requested = [False for _ in range(self.chunks)] + self.buffer = [b"" for _ in range(self.chunks)] + self.__internal_stream = CdnManager.Streamer.InternalStream( + self, False) + self.requested[0] = True + self.write_chunk(first_chunk, 0, False) + + def write_chunk(self, chunk: bytes, chunk_index: int, + cached: bool) -> None: + if self.__internal_stream.is_closed(): + return + self.__session.logger.debug( + "Chunk {}/{} completed, cached: {}, stream: {}".format( + chunk_index + 1, self.chunks, cached, self.describe())) + self.buffer[chunk_index] = self.__audio_decrypt.decrypt_chunk( + chunk_index, chunk) + self.__internal_stream.notify_chunk_available(chunk_index) + + def stream(self) -> AbsChunkedInputStream: + return self.__internal_stream + + def codec(self) -> SuperAudioFormat: + return self.__audio_format + + def describe(self) -> str: + if self.__stream_id.is_episode(): + return "episode_gid: {}".format( + self.__stream_id.get_episode_gid()) + return "file_id: {}".format(self.__stream_id.get_file_id()) + + def decrypt_time_ms(self) -> int: + return self.__audio_decrypt.decrypt_time_ms() + + def request_chunk(self, index: int) -> None: + response = self.request(index) + self.write_chunk(response.buffer, index, False) + + def request(self, chunk: int = None, range_start: int = None, range_end: int = None)\ + -> CdnManager.InternalResponse: + if chunk is None and range_start is None and range_end is None: + raise TypeError() + if chunk is not None: + range_start = ChannelManager.chunk_size * chunk + range_end = (chunk + 1) * ChannelManager.chunk_size - 1 + response = self.__session.client().get( + self.__cdn_url.url, + headers={ + "Range": "bytes={}-{}".format(range_start, range_end) + }, + ) + if response.status_code != 206: + raise IOError(response.status_code) + body = response.content + if body is None: + raise IOError("Response body is empty!") + return CdnManager.InternalResponse(body, dict(response.headers)) + + class InternalStream(AbsChunkedInputStream): + streamer: CdnManager.Streamer + + def __init__(self, streamer, retry_on_chunk_error: bool): + self.streamer: CdnManager.Streamer = streamer + super().__init__(retry_on_chunk_error) + + def buffer(self) -> typing.List[bytes]: + return self.streamer.buffer + + def size(self) -> int: + return self.streamer.size + + def close(self) -> None: + super().close() + del self.streamer.buffer + + def requested_chunks(self) -> typing.List[bool]: + return self.streamer.requested + + def available_chunks(self) -> typing.List[bool]: + return self.streamer.available + + def chunks(self) -> int: + return self.streamer.chunks + + def request_chunk_from_stream(self, index: int) -> None: + self.streamer.executor_service \ + .submit(lambda: self.streamer.request_chunk(index)) + + def stream_read_halted(self, chunk: int, _time: int) -> None: + if self.streamer.halt_listener is not None: + self.streamer.executor_service\ + .submit(lambda: self.streamer.halt_listener.stream_read_halted(chunk, _time)) + + def stream_read_resumed(self, chunk: int, _time: int) -> None: + if self.streamer.halt_listener is not None: + self.streamer.executor_service \ + .submit(lambda: self.streamer.halt_listener.stream_read_resumed(chunk, _time)) + + +class NormalizationData: + _LOGGER: logging = logging.getLogger(__name__) + track_gain_db: float + track_peak: float + album_gain_db: float + album_peak: float + + def __init__(self, track_gain_db: float, track_peak: float, + album_gain_db: float, album_peak: float): + self.track_gain_db = track_gain_db + self.track_peak = track_peak + self.album_gain_db = album_gain_db + self.album_peak = album_peak + + self._LOGGER.debug( + "Loaded normalization data, track_gain: {}, track_peak: {}, album_gain: {}, album_peak: {}" + .format(track_gain_db, track_peak, album_gain_db, album_peak)) + + @staticmethod + def read(input_stream: AbsChunkedInputStream) -> NormalizationData: + input_stream.seek(144) + data = input_stream.read(4 * 4) + input_stream.seek(0) + buffer = io.BytesIO(data) + return NormalizationData( + struct.unpack(" float: + normalisation_factor = float( + math.pow(10, (self.track_gain_db + normalisation_pregain) / 20)) + if normalisation_factor * self.track_peak > 1: + self._LOGGER \ + .warning("Reducing normalisation factor to prevent clipping. Please add negative pregain to avoid.") + normalisation_factor = 1 / self.track_peak + return normalisation_factor + + +class PlayableContentFeeder: + logger = logging.getLogger("Librespot:PlayableContentFeeder") + storage_resolve_interactive = "/storage-resolve/files/audio/interactive/{}" + storage_resolve_interactive_prefetch = "/storage-resolve/files/audio/interactive_prefetch/{}" + __session: Session + + def __init__(self, session: Session): + self.__session = session + + def load(self, playable_id: PlayableId, + audio_quality_picker: AudioQualityPicker, preload: bool, + halt_listener: typing.Union[HaltListener, None]): + if type(playable_id) is TrackId: + return self.load_track(playable_id, audio_quality_picker, preload, + halt_listener) + if type(playable_id) is EpisodeId: + return self.load_episode(playable_id, audio_quality_picker, + preload, halt_listener) + raise TypeError("Unknown content: {}".format(playable_id)) + + def load_stream(self, file: Metadata.AudioFile, track: Metadata.Track, + episode: Metadata.Episode, preload: bool, + halt_lister: HaltListener): + if track is None and episode is None: + raise RuntimeError() + response = self.resolve_storage_interactive(file.file_id, preload) + if response.result == StorageResolve.StorageResolveResponse.Result.CDN: + if track is not None: + return CdnFeedHelper.load_track(self.__session, track, file, + response, preload, halt_lister) + return CdnFeedHelper.load_episode(self.__session, episode, file, + response, preload, halt_lister) + if response.result == StorageResolve.StorageResolveResponse.Result.STORAGE: + if track is None: + pass + elif response.result == StorageResolve.StorageResolveResponse.Result.RESTRICTED: + raise RuntimeError("Content is restricted!") + elif response.result == StorageResolve.StorageResolveResponse.Response.UNRECOGNIZED: + raise RuntimeError("Content is unrecognized!") + else: + raise RuntimeError("Unknown result: {}".format(response.result)) + + def load_episode(self, episode_id: EpisodeId, + audio_quality_picker: AudioQualityPicker, preload: bool, + halt_listener: HaltListener) -> LoadedStream: + episode = self.__session.api().get_metadata_4_episode(episode_id) + if episode.external_url: + return CdnFeedHelper.load_episode_external(self.__session, episode, + halt_listener) + file = audio_quality_picker.get_file(episode.audio) + if file is None: + self.logger.fatal( + "Couldn't find any suitable audio file, available: {}".format( + episode.audio)) + return self.load_stream(file, None, episode, preload, halt_listener) + + def load_track(self, track_id_or_track: typing.Union[TrackId, + Metadata.Track], + audio_quality_picker: AudioQualityPicker, preload: bool, + halt_listener: HaltListener): + if type(track_id_or_track) is TrackId: + original = self.__session.api().get_metadata_4_track( + track_id_or_track) + track = self.pick_alternative_if_necessary(original) + if track is None: + raise RuntimeError("Cannot get alternative track") + else: + track = track_id_or_track + file = audio_quality_picker.get_file(track.file) + if file is None: + self.logger.fatal( + "Couldn't find any suitable audio file, available: {}".format( + track.file)) + raise FeederException() + return self.load_stream(file, track, None, preload, halt_listener) + + def pick_alternative_if_necessary( + self, track: Metadata.Track) -> typing.Union[Metadata.Track, None]: + if len(track.file) > 0: + return track + for alt in track.alternative: + if len(alt.file) > 0: + return Metadata.Track( + gid=track.gid, + name=track.name, + album=track.album, + artist=track.artist, + number=track.number, + disc_number=track.disc_number, + duration=track.duration, + popularity=track.popularity, + explicit=track.explicit, + external_id=track.external_id, + restriction=track.restriction, + file=alt.file, + sale_period=track.sale_period, + preview=track.preview, + tags=track.tags, + earliest_live_timestamp=track.earliest_live_timestamp, + has_lyrics=track.has_lyrics, + availability=track.availability, + licensor=track.licensor) + return None + + def resolve_storage_interactive( + self, file_id: bytes, + preload: bool) -> StorageResolve.StorageResolveResponse: + resp = self.__session.api().send( + "GET", + (self.storage_resolve_interactive_prefetch + if preload else self.storage_resolve_interactive).format( + util.bytes_to_hex(file_id)), + None, + None, + ) + if resp.status_code != 200: + raise RuntimeError(resp.status_code) + body = resp.content + if body is None: + raise RuntimeError("Response body is empty!") + storage_resolve_response = StorageResolve.StorageResolveResponse() + storage_resolve_response.ParseFromString(body) + return storage_resolve_response + + class LoadedStream: + episode: Metadata.Episode + track: Metadata.Track + input_stream: GeneralAudioStream + normalization_data: NormalizationData + metrics: PlayableContentFeeder.Metrics + + def __init__(self, track_or_episode: typing.Union[Metadata.Track, + Metadata.Episode], + input_stream: GeneralAudioStream, + normalization_data: typing.Union[NormalizationData, None], + metrics: PlayableContentFeeder.Metrics): + if type(track_or_episode) is Metadata.Track: + self.track = track_or_episode + self.episode = None + elif type(track_or_episode) is Metadata.Episode: + self.track = None + self.episode = track_or_episode + else: + raise TypeError() + self.input_stream = input_stream + self.normalization_data = normalization_data + self.metrics = metrics + + class Metrics: + file_id: str + preloaded_audio_key: bool + audio_key_time: int + + def __init__(self, file_id: typing.Union[bytes, None], + preloaded_audio_key: bool, audio_key_time: int): + self.file_id = None if file_id is None else util.bytes_to_hex( + file_id) + self.preloaded_audio_key = preloaded_audio_key + self.audio_key_time = audio_key_time + if preloaded_audio_key and audio_key_time != -1: + raise RuntimeError() + + +class StreamId: + file_id: bytes + episode_gid: bytes + + def __init__(self, + file: Metadata.AudioFile = None, + episode: Metadata.Episode = None): + if file is None and episode is None: + return + self.file_id = None if file is None else file.file_id + self.episode_gid = None if episode is None else episode.gid + + def get_file_id(self): + if self.file_id is None: + raise RuntimeError("Not a file!") + return util.bytes_to_hex(self.file_id) + + def is_episode(self): + return self.episode_gid is not None + + def get_episode_gid(self): + if self.episode_gid is None: + raise RuntimeError("Not an episode!") + return util.bytes_to_hex(self.episode_gid) diff --git a/librespot/audio/decoders.py b/librespot/audio/decoders.py new file mode 100644 index 0000000..ddb726c --- /dev/null +++ b/librespot/audio/decoders.py @@ -0,0 +1,81 @@ +from __future__ import annotations +from librespot.audio import SuperAudioFormat +from librespot.proto import Metadata_pb2 as Metadata +from librespot.proto.Metadata_pb2 import AudioFile +from librespot.structure import AudioQualityPicker +import enum +import logging +import typing + + +class AudioQuality(enum.Enum): + NORMAL = 0x00 + HIGH = 0x01 + VERY_HIGH = 0x02 + + @staticmethod + def get_quality(audio_format: AudioFile.Format) -> AudioQuality: + if audio_format in [ + AudioFile.MP3_96, + AudioFile.OGG_VORBIS_96, + AudioFile.AAC_24_NORM, + ]: + return AudioQuality.NORMAL + if audio_format in [ + AudioFile.MP3_160, + AudioFile.MP3_160_ENC, + AudioFile.OGG_VORBIS_160, + AudioFile.AAC_24, + ]: + return AudioQuality.HIGH + if audio_format in [ + AudioFile.MP3_320, + AudioFile.MP3_256, + AudioFile.OGG_VORBIS_320, + AudioFile.AAC_48, + ]: + return AudioQuality.VERY_HIGH + raise RuntimeError("Unknown format: {}".format(format)) + + def get_matches(self, + files: typing.List[AudioFile]) -> typing.List[AudioFile]: + file_list = [] + for file in files: + if hasattr(file, "format") and AudioQuality.get_quality( + file.format) == self: + file_list.append(file) + return file_list + + +class VorbisOnlyAudioQuality(AudioQualityPicker): + logger = logging.getLogger("Librespot:Player:VorbisOnlyAudioQuality") + preferred: AudioQuality + + def __init__(self, preferred: AudioQuality): + self.preferred = preferred + + @staticmethod + def get_vorbis_file(files: typing.List[Metadata.AudioFile]): + for file in files: + if file.HasField("format") and SuperAudioFormat.get( + file.format) == SuperAudioFormat.VORBIS: + return file + return None + + def get_file(self, files: typing.List[Metadata.AudioFile]): + matches: typing.List[Metadata.AudioFile] = self.preferred.get_matches( + files) + vorbis: Metadata.AudioFile = VorbisOnlyAudioQuality.get_vorbis_file( + matches) + if vorbis is None: + vorbis: Metadata.AudioFile = VorbisOnlyAudioQuality.get_vorbis_file( + files) + if vorbis is not None: + self.logger.warning( + "Using {} because preferred {} couldn't be found.".format( + Metadata.AudioFile.Format.Name(vorbis.format), + self.preferred)) + else: + self.logger.fatal( + "Couldn't find any Vorbis file, available: {}") + return vorbis diff --git a/librespot/audio/decrypt.py b/librespot/audio/decrypt.py new file mode 100644 index 0000000..e72cd37 --- /dev/null +++ b/librespot/audio/decrypt.py @@ -0,0 +1,45 @@ +from __future__ import annotations +from Cryptodome.Cipher import AES +from Cryptodome.Util import Counter +from librespot.audio.storage import ChannelManager +from librespot.structure import AudioDecrypt +import io +import time + + +class AesAudioDecrypt(AudioDecrypt): + audio_aes_iv = b'r\xe0g\xfb\xdd\xcb\xcfw\xeb\xe8\xbcd?c\r\x93' + cipher = None + decrypt_count = 0 + decrypt_total_time = 0 + iv_int = int.from_bytes(audio_aes_iv, "big") + iv_diff = 0x100 + key: bytes + + def __init__(self, key: bytes): + self.key = key + + def decrypt_chunk(self, chunk_index: int, buffer: bytes): + new_buffer = io.BytesIO() + iv = self.iv_int + int(ChannelManager.chunk_size * chunk_index / 16) + start = time.time_ns() + for i in range(0, len(buffer), 4096): + cipher = AES.new(key=self.key, + mode=AES.MODE_CTR, + counter=Counter.new(128, initial_value=iv)) + count = min(4096, len(buffer) - i) + decrypted_buffer = cipher.decrypt(buffer[i:i + count]) + new_buffer.write(decrypted_buffer) + if count != len(decrypted_buffer): + raise RuntimeError( + "Couldn't process all data, actual: {}, expected: {}". + format(len(decrypted_buffer), count)) + iv += self.iv_diff + self.decrypt_total_time += time.time_ns() - start + self.decrypt_count += 1 + new_buffer.seek(0) + return new_buffer.read() + + def decrypt_time_ms(self): + return 0 if self.decrypt_count == 0 else int( + (self.decrypt_total_time / self.decrypt_count) / 1000000) diff --git a/librespot/audio/format.py b/librespot/audio/format.py new file mode 100644 index 0000000..24cb6d9 --- /dev/null +++ b/librespot/audio/format.py @@ -0,0 +1,32 @@ +from librespot.proto import Metadata_pb2 as Metadata +import enum + + +class SuperAudioFormat(enum.Enum): + MP3 = 0x00 + VORBIS = 0x01 + AAC = 0x02 + + @staticmethod + def get(audio_format: Metadata.AudioFile.Format): + if audio_format in [ + Metadata.AudioFile.Format.OGG_VORBIS_96, + Metadata.AudioFile.Format.OGG_VORBIS_160, + Metadata.AudioFile.Format.OGG_VORBIS_320, + ]: + return SuperAudioFormat.VORBIS + if audio_format in [ + Metadata.AudioFile.Format.MP3_256, + Metadata.AudioFile.Format.MP3_320, + Metadata.AudioFile.Format.MP3_160, + Metadata.AudioFile.Format.MP3_96, + Metadata.AudioFile.Format.MP3_160_ENC, + ]: + return SuperAudioFormat.MP3 + if audio_format in [ + Metadata.AudioFile.Format.AAC_24, + Metadata.AudioFile.Format.AAC_48, + Metadata.AudioFile.Format.AAC_24_NORM, + ]: + return SuperAudioFormat.AAC + raise RuntimeError("Unknown audio format: {}".format(audio_format)) diff --git a/librespot/audio/storage.py b/librespot/audio/storage.py new file mode 100644 index 0000000..51321e6 --- /dev/null +++ b/librespot/audio/storage.py @@ -0,0 +1,139 @@ +from __future__ import annotations +from librespot import util +from librespot.crypto import Packet +from librespot.proto.Metadata_pb2 import AudioFile +from librespot.structure import Closeable, PacketsReceiver +import concurrent.futures +import io +import logging +import queue +import struct +import threading +import typing + +if typing.TYPE_CHECKING: + from librespot.core import Session + + +class ChannelManager(Closeable, PacketsReceiver): + channels: typing.Dict[int, Channel] = {} + chunk_size = 128 * 1024 + executor_service = concurrent.futures.ThreadPoolExecutor() + logger = logging.getLogger("Librespot:ChannelManager") + seq_holder = 0 + seq_holder_lock = threading.Condition() + __session: Session = None + + def __init__(self, session: Session): + self.__session = session + + def request_chunk(self, file_id: bytes, index: int, file: AudioFile): + start = int(index * self.chunk_size / 4) + end = int((index + 1) * self.chunk_size / 4) + channel = ChannelManager.Channel(self, file, index) + self.channels[channel.chunk_id] = channel + out = io.BytesIO() + out.write(struct.pack(">H", channel.chunk_id)) + out.write(struct.pack(">i", 0x00000000)) + out.write(struct.pack(">i", 0x00000000)) + out.write(struct.pack(">i", 0x00004E20)) + out.write(struct.pack(">i", 0x00030D40)) + out.write(file_id) + out.write(struct.pack(">i", start)) + out.write(struct.pack(">i", end)) + out.seek(0) + self.__session.send(Packet.Type.stream_chunk, out.read()) + + def dispatch(self, packet: Packet) -> None: + payload = io.BytesIO(packet.payload) + if packet.is_cmd(Packet.Type.stream_chunk_res): + chunk_id = struct.unpack(">H", payload.read(2))[0] + channel = self.channels.get(chunk_id) + if channel is None: + self.logger.warning( + "Couldn't find channel, id: {}, received: {}".format( + chunk_id, len(packet.payload))) + return + channel.add_to_queue(payload) + elif packet.is_cmd(Packet.Type.channel_error): + chunk_id = struct.unpack(">H", payload.read(2))[0] + channel = self.channels.get(chunk_id) + if channel is None: + self.logger.warning( + "Dropping channel error, id: {}, code: {}".format( + chunk_id, + struct.unpack(">H", payload.read(2))[0])) + return + channel.stream_error(struct.unpack(">H", payload.read(2))[0]) + else: + self.logger.warning( + "Couldn't handle packet, cmd: {}, payload: {}".format( + packet.cmd, util.bytes_to_hex(packet.payload))) + + def close(self) -> None: + self.executor_service.shutdown() + + class Channel: + channel_manager: ChannelManager + chunk_id: int + q = queue.Queue() + __buffer: io.BytesIO + __chunk_index: int + __file: AudioFile + __header: bool = True + + def __init__(self, channel_manager: ChannelManager, file: AudioFile, + chunk_index: int): + self.__buffer = io.BytesIO() + self.channel_manager = channel_manager + self.__file = file + self.__chunk_index = chunk_index + with self.channel_manager.seq_holder_lock: + self.chunk_id = self.channel_manager.seq_holder + self.channel_manager.seq_holder += 1 + self.channel_manager.executor_service.submit( + lambda: ChannelManager.Channel.Handler(self)) + + def _handle(self, payload: bytes) -> bool: + if len(payload) == 0: + if not self.__header: + self.__file.write_chunk(payload, self.__chunk_index, False) + return True + self.channel_manager.logger.debug( + "Received empty chunk, skipping.") + return False + if self.__header: + length: int + while len(payload.buffer) > 0: + length = payload.read_short() + if not length > 0: + break + header_id = payload.read_byte() + header_data = payload.read(length - 1) + self.__file.write_header(int.from_bytes(header_id, "big"), + bytearray(header_data), False) + self.__header = False + else: + self.__buffer.write(payload.read(len(payload.buffer))) + return False + + def add_to_queue(self, payload): + self.q.put(payload) + + def stream_error(self, code: int) -> None: + self.__file.stream_error(self.__chunk_index, code) + + class Handler: + __channel: ChannelManager.Channel = None + + def __init__(self, channel: ChannelManager.Channel): + self.__channel = channel + + def run(self) -> None: + self.__channel.channel_manager.logger.debug( + "ChannelManager.Handler is starting") + with self.__channel.q.all_tasks_done: + self.__channel.channel_manager.channels.pop( + self.__channel.chunk_id) + self.__channel.channel_manager.logger.debug( + "ChannelManager.Handler is shutting down") diff --git a/librespot/cache.py b/librespot/cache.py new file mode 100644 index 0000000..7937c46 --- /dev/null +++ b/librespot/cache.py @@ -0,0 +1,18 @@ +from __future__ import annotations +import typing + +if typing.TYPE_CHECKING: + from librespot.core import Session + + +class CacheManager: + clean_up_threshold = 604800000 + header_hash = 253 + header_timestamp = 254 + parent: str + + def __init__(self, session: Session): + """ + @Todo Implement function + :param session: + """ diff --git a/librespot/core.py b/librespot/core.py new file mode 100644 index 0000000..14149bb --- /dev/null +++ b/librespot/core.py @@ -0,0 +1,2307 @@ +from __future__ import annotations + +import base64 +import binascii +import concurrent.futures +import enum +import gzip +import io +import json +import logging +import os +import random +import sched +import socket +import struct +import threading +import time +import typing +import urllib.parse + +import defusedxml.ElementTree +import requests +import websocket +from Cryptodome import Random +from Cryptodome.Cipher import AES +from Cryptodome.Hash import HMAC +from Cryptodome.Hash import SHA1 +from Cryptodome.Protocol.KDF import PBKDF2 +from Cryptodome.PublicKey import RSA +from Cryptodome.Signature import PKCS1_v1_5 + +from librespot import util +from librespot import Version +from librespot.audio import AudioKeyManager +from librespot.audio import CdnManager +from librespot.audio import PlayableContentFeeder +from librespot.audio.storage import ChannelManager +from librespot.cache import CacheManager +from librespot.crypto import CipherPair +from librespot.crypto import DiffieHellman +from librespot.crypto import Packet +from librespot.mercury import MercuryClient +from librespot.mercury import MercuryRequests +from librespot.mercury import RawMercuryRequest +from librespot.metadata import AlbumId +from librespot.metadata import ArtistId +from librespot.metadata import EpisodeId +from librespot.metadata import PlaylistId +from librespot.metadata import ShowId +from librespot.metadata import TrackId +from librespot.proto import Authentication_pb2 as Authentication +from librespot.proto import ClientToken_pb2 as ClientToken +from librespot.proto import Connect_pb2 as Connect +from librespot.proto import Connectivity_pb2 as Connectivity +from librespot.proto import Keyexchange_pb2 as Keyexchange +from librespot.proto import Metadata_pb2 as Metadata +from librespot.proto import Playlist4External_pb2 as Playlist4External +from librespot.proto.ExplicitContentPubsub_pb2 import UserAttributesUpdate +from librespot.structure import Closeable +from librespot.structure import MessageListener +from librespot.structure import RequestListener +from librespot.structure import SubListener + + +class ApiClient(Closeable): + """ """ + logger = logging.getLogger("Librespot:ApiClient") + __base_url: str + __client_token_str: str = None + __session: Session + + def __init__(self, session: Session): + self.__session = session + self.__base_url = "https://{}".format(ApResolver.get_random_spclient()) + + def build_request( + self, + method: str, + suffix: str, + headers: typing.Union[None, typing.Dict[str, str]], + body: typing.Union[None, bytes], + ) -> requests.PreparedRequest: + """ + + :param method: str: + :param suffix: str: + :param headers: typing.Union[None: + :param typing.Dict[str: + :param str]]: + :param body: typing.Union[None: + :param bytes]: + + """ + if self.__client_token_str is None: + resp = self.__client_token() + self.__client_token_str = resp.granted_token.token + self.logger.debug("Updated client token: {}".format( + self.__client_token_str)) + + request = requests.PreparedRequest() + request.method = method + request.data = body + request.headers = {} + if headers is not None: + request.headers = headers + request.headers["Authorization"] = "Bearer {}".format( + self.__session.tokens().get("playlist-read")) + request.headers["client-token"] = self.__client_token_str + request.url = self.__base_url + suffix + return request + + def send( + self, + method: str, + suffix: str, + headers: typing.Union[None, typing.Dict[str, str]], + body: typing.Union[None, bytes], + ) -> requests.Response: + """ + + :param method: str: + :param suffix: str: + :param headers: typing.Union[None: + :param typing.Dict[str: + :param str]]: + :param body: typing.Union[None: + :param bytes]: + + """ + response = self.__session.client().send( + self.build_request(method, suffix, headers, body)) + return response + + def put_connect_state(self, connection_id: str, + proto: Connect.PutStateRequest) -> None: + """ + + :param connection_id: str: + :param proto: Connect.PutStateRequest: + + """ + response = self.send( + "PUT", + "/connect-state/v1/devices/{}".format(self.__session.device_id()), + { + "Content-Type": "application/protobuf", + "X-Spotify-Connection-Id": connection_id, + }, + proto.SerializeToString(), + ) + if response.status_code == 413: + self.logger.warning( + "PUT state payload is too large: {} bytes uncompressed.". + format(len(proto.SerializeToString()))) + elif response.status_code != 200: + self.logger.warning("PUT state returned {}. headers: {}".format( + response.status_code, response.headers)) + + def get_metadata_4_track(self, track: TrackId) -> Metadata.Track: + """ + + :param track: TrackId: + + """ + response = self.send("GET", + "/metadata/4/track/{}".format(track.hex_id()), + None, None) + ApiClient.StatusCodeException.check_status(response) + body = response.content + if body is None: + raise RuntimeError() + proto = Metadata.Track() + proto.ParseFromString(body) + return proto + + def get_metadata_4_episode(self, episode: EpisodeId) -> Metadata.Episode: + """ + + :param episode: EpisodeId: + + """ + response = self.send("GET", + "/metadata/4/episode/{}".format(episode.hex_id()), + None, None) + ApiClient.StatusCodeException.check_status(response) + body = response.content + if body is None: + raise IOError() + proto = Metadata.Episode() + proto.ParseFromString(body) + return proto + + def get_metadata_4_album(self, album: AlbumId) -> Metadata.Album: + """ + + :param album: AlbumId: + + """ + response = self.send("GET", + "/metadata/4/album/{}".format(album.hex_id()), + None, None) + ApiClient.StatusCodeException.check_status(response) + + body = response.content + if body is None: + raise IOError() + proto = Metadata.Album() + proto.ParseFromString(body) + return proto + + def get_metadata_4_artist(self, artist: ArtistId) -> Metadata.Artist: + """ + + :param artist: ArtistId: + + """ + response = self.send("GET", + "/metadata/4/artist/{}".format(artist.hex_id()), + None, None) + ApiClient.StatusCodeException.check_status(response) + body = response.content + if body is None: + raise IOError() + proto = Metadata.Artist() + proto.ParseFromString(body) + return proto + + def get_metadata_4_show(self, show: ShowId) -> Metadata.Show: + """ + + :param show: ShowId: + + """ + response = self.send("GET", + "/metadata/4/show/{}".format(show.hex_id()), None, + None) + ApiClient.StatusCodeException.check_status(response) + body = response.content + if body is None: + raise IOError() + proto = Metadata.Show() + proto.ParseFromString(body) + return proto + + def get_playlist(self, + _id: PlaylistId) -> Playlist4External.SelectedListContent: + """ + + :param _id: PlaylistId: + + """ + response = self.send("GET", + "/playlist/v2/playlist/{}".format(_id.id()), None, + None) + ApiClient.StatusCodeException.check_status(response) + body = response.content + if body is None: + raise IOError() + proto = Playlist4External.SelectedListContent() + proto.ParseFromString(body) + return proto + + def set_client_token(self, client_token): + """ + + :param client_token: + + """ + self.__client_token_str = client_token + + def __client_token(self): + proto_req = ClientToken.ClientTokenRequest( + request_type=ClientToken.ClientTokenRequestType. + REQUEST_CLIENT_DATA_REQUEST, + client_data=ClientToken.ClientDataRequest( + client_id=MercuryRequests.keymaster_client_id, + client_version=Version.version_name, + connectivity_sdk_data=Connectivity.ConnectivitySdkData( + device_id=self.__session.device_id(), + platform_specific_data=Connectivity.PlatformSpecificData( + windows=Connectivity.NativeWindowsData( + something1=10, + something3=21370, + something4=2, + something6=9, + something7=332, + something8=33404, + something10=True, + ), ), + ), + ), + ) + + resp = requests.post( + "https://clienttoken.spotify.com/v1/clienttoken", + proto_req.SerializeToString(), + headers={ + "Accept": "application/x-protobuf", + "Content-Encoding": "", + }, + ) + + ApiClient.StatusCodeException.check_status(resp) + + proto_resp = ClientToken.ClientTokenResponse() + proto_resp.ParseFromString(resp.content) + return proto_resp + + class StatusCodeException(IOError): + """ """ + code: int + + def __init__(self, response: requests.Response): + super().__init__(response.status_code) + self.code = response.status_code + + @staticmethod + def check_status(response: requests.Response) -> None: + """ + + :param response: requests.Response: + + """ + if response.status_code != 200: + raise ApiClient.StatusCodeException(response) + + +class ApResolver: + """ """ + base_url = "https://apresolve.spotify.com/" + + @staticmethod + def request(service_type: str) -> typing.Any: + """Gets the specified ApResolve + + :param service_type: str: + :returns: The resulting object will be returned + + """ + response = requests.get("{}?type={}".format(ApResolver.base_url, + service_type)) + if response.status_code != 200: + if response.status_code == 502: + raise RuntimeError( + f"ApResolve request failed with the following return value: {response.content}. Servers might be down!" + ) + return response.json() + + @staticmethod + def get_random_of(service_type: str) -> str: + """Gets the specified random ApResolve url + + :param service_type: str: + :returns: A random ApResolve url will be returned + + """ + pool = ApResolver.request(service_type) + urls = pool.get(service_type) + if urls is None or len(urls) == 0: + raise RuntimeError("No ApResolve url available") + return random.choice(urls) + + @staticmethod + def get_random_dealer() -> str: + """Get dealer endpoint url + + + :returns: dealer endpoint url + + """ + return ApResolver.get_random_of("dealer") + + @staticmethod + def get_random_spclient() -> str: + """Get spclient endpoint url + + + :returns: spclient endpoint url + + """ + return ApResolver.get_random_of("spclient") + + @staticmethod + def get_random_accesspoint() -> str: + """Get accesspoint endpoint url + + + :returns: accesspoint endpoint url + + """ + return ApResolver.get_random_of("accesspoint") + + +class DealerClient(Closeable): + """ """ + logger = logging.getLogger("Librespot:DealerClient") + __connection: typing.Union[ConnectionHolder, None] + __last_scheduled_reconnection: typing.Union[sched.Event, None] + __message_listeners: typing.Dict[MessageListener, typing.List[str]] = {} + __message_listeners_lock = threading.Condition() + __request_listeners: typing.Dict[str, RequestListener] = {} + __request_listeners_lock = threading.Condition() + __scheduler = sched.scheduler() + __session: Session + __worker = concurrent.futures.ThreadPoolExecutor() + + def __init__(self, session: Session): + self.__session = session + + def add_message_listener(self, listener: MessageListener, + uris: list[str]) -> None: + """ + + :param listener: MessageListener: + :param uris: list[str]: + + """ + with self.__message_listeners_lock: + if listener in self.__message_listeners: + raise TypeError( + "A listener for {} has already been added.".format(uris)) + self.__message_listeners[listener] = uris + self.__message_listeners_lock.notify_all() + + def add_request_listener(self, listener: RequestListener, uri: str): + """ + + :param listener: RequestListener: + :param uri: str: + + """ + with self.__request_listeners_lock: + if uri in self.__request_listeners: + raise TypeError( + "A listener for '{}' has already been added.".format(uri)) + self.__request_listeners[uri] = listener + self.__request_listeners_lock.notify_all() + + def close(self) -> None: + """ """ + self.__worker.shutdown() + + def connect(self) -> None: + """ """ + self.__connection = DealerClient.ConnectionHolder( + self.__session, + self, + "wss://{}/?access_token={}".format( + ApResolver.get_random_dealer(), + self.__session.tokens().get("playlist-read"), + ), + ) + + def connection_invalided(self) -> None: + """ """ + self.__connection = None + self.logger.debug("Scheduled reconnection attempt in 10 seconds...") + + def anonymous(): + """ """ + self.__last_scheduled_reconnection = None + self.connect() + + self.__last_scheduled_reconnection = self.__scheduler.enter( + 10, 1, anonymous) + + def handle_message(self, obj: typing.Any) -> None: + """ + + :param obj: typing.Any: + + """ + uri = obj.get("uri") + headers = self.__get_headers(obj) + payloads = obj.get("payloads") + decoded_payloads: typing.Any + if payloads is not None: + if headers.get("Content-Type") == "application/json": + decoded_payloads = payloads + elif headers.get("Content-Type") == "plain/text": + decoded_payloads = payloads + else: + decoded_payloads = base64.b64decode(payloads) + if headers.get("Transfer-Encoding") == "gzip": + decoded_payloads = gzip.decompress(decoded_payloads) + else: + decoded_payloads = b"" + interesting = False + with self.__message_listeners_lock: + for listener in self.__message_listeners: + dispatched = False + keys = self.__message_listeners.get(listener) + for key in keys: + if uri.startswith(key) and not dispatched: + interesting = True + + def anonymous(): + """ """ + listener.on_message(uri, headers, decoded_payloads) + + self.__worker.submit(anonymous) + dispatched = True + if not interesting: + self.logger.debug("Couldn't dispatch message: {}".format(uri)) + + def handle_request(self, obj: typing.Any) -> None: + """ + + :param obj: typing.Any: + + """ + mid = obj.get("message_ident") + key = obj.get("key") + headers = self.__get_headers(obj) + payload = obj.get("payload") + if headers.get("Transfer-Encoding") == "gzip": + gz = base64.b64decode(payload.get("compressed")) + payload = json.loads(gzip.decompress(gz)) + pid = payload.get("message_id") + sender = payload.get("sent_by_device_id") + command = payload.get("command") + self.logger.debug( + "Received request. [mid: {}, key: {}, pid: {}, sender: {}, command: {}]" + .format(mid, key, pid, sender, command)) + interesting = False + with self.__request_listeners_lock: + for mid_prefix in self.__request_listeners: + if mid.startswith(mid_prefix): + listener = self.__request_listeners.get(mid_prefix) + interesting = True + + def anonymous(): + """ """ + result = listener.on_request(mid, pid, sender, command) + if self.__connection is not None: + self.__connection.send_reply(key, result) + self.logger.warning( + "Handled request. [key: {}, result: {}]".format( + key, result)) + + self.__worker.submit(anonymous) + if not interesting: + self.logger.debug("Couldn't dispatch request: {}".format(mid)) + + def remove_message_listener(self, listener: MessageListener) -> None: + """ + + :param listener: MessageListener: + + """ + with self.__message_listeners_lock: + self.__message_listeners.pop(listener) + + def remove_request_listener(self, listener: RequestListener) -> None: + """ + + :param listener: RequestListener: + + """ + with self.__request_listeners_lock: + request_listeners = {} + for key, value in self.__request_listeners.items(): + if value != listener: + request_listeners[key] = value + self.__request_listeners = request_listeners + + def wait_for_listener(self) -> None: + """ """ + with self.__message_listeners_lock: + if self.__message_listeners == {}: + return + self.__message_listeners_lock.wait() + + def __get_headers(self, obj: typing.Any) -> dict[str, str]: + headers = obj.get("headers") + if headers is None: + return {} + return headers + + class ConnectionHolder(Closeable): + """ """ + __closed = False + __dealer_client: DealerClient + __last_scheduled_ping: sched.Event + __received_pong = False + __scheduler = sched.scheduler() + __session: Session + __url: str + __ws: websocket.WebSocketApp + + def __init__(self, session: Session, dealer_client: DealerClient, + url: str): + self.__session = session + self.__dealer_client = dealer_client + self.__url = url + self.__ws = websocket.WebSocketApp(url) + + def close(self): + """ """ + if not self.__closed: + self.__ws.close() + self.__closed = True + if self.__last_scheduled_ping is not None: + self.__scheduler.cancel(self.__last_scheduled_ping) + + def on_failure(self, ws: websocket.WebSocketApp, error): + """ + + :param ws: websocket.WebSocketApp: + :param error: + + """ + if self.__closed: + return + self.__dealer_client.logger.warning( + "An exception occurred. Reconnecting...") + self.close() + + def on_message(self, ws: websocket.WebSocketApp, text: str): + """ + + :param ws: websocket.WebSocketApp: + :param text: str: + + """ + obj = json.loads(text) + self.__dealer_client.wait_for_listener() + typ = MessageType.parse(obj.get("type")) + if typ == MessageType.MESSAGE: + self.__dealer_client.handle_message(obj) + elif typ == MessageType.REQUEST: + self.__dealer_client.handle_request(obj) + elif typ == MessageType.PONG: + self.__received_pong = True + elif typ == MessageType.PING: + pass + else: + raise RuntimeError("Unknown message type for {}".format( + typ.value)) + + def on_open(self, ws: websocket.WebSocketApp): + """ + + :param ws: websocket.WebSocketApp: + + """ + if self.__closed: + self.__dealer_client.logger.fatal( + "I wonder what happened here... Terminating. [closed: {}]". + format(self.__closed)) + self.__dealer_client.logger.debug( + "Dealer connected! [url: {}]".format(self.__url)) + + def anonymous(): + """ """ + self.send_ping() + self.__received_pong = False + + def anonymous2(): + """ """ + if self.__last_scheduled_ping is None: + return + if not self.__received_pong: + self.__dealer_client.logger.warning( + "Did not receive ping in 3 seconds. Reconnecting..." + ) + self.close() + return + self.__received_pong = False + + self.__scheduler.enter(3, 1, anonymous2) + self.__last_scheduled_ping = self.__scheduler.enter( + 30, 1, anonymous) + + self.__last_scheduled_ping = self.__scheduler.enter( + 30, 1, anonymous) + + def send_ping(self): + """ """ + self.__ws.send('{"type":"ping"}') + + def send_reply(self, key: str, result: DealerClient.RequestResult): + """ + + :param key: str: + :param result: DealerClient.RequestResult: + + """ + success = ("true" if result == DealerClient.RequestResult.SUCCESS + else "false") + self.__ws.send( + '{"type":"reply","key":"%s","payload":{"success":%s}' % + (key, success)) + + class RequestResult(enum.Enum): + """ """ + UNKNOWN_SEND_COMMAND_RESULT = 0 + SUCCESS = 1 + DEVICE_NOT_FOUND = 2 + CONTEXT_PLAYER_ERROR = 3 + DEVICE_DISAPPEARED = 4 + UPSTREAM_ERROR = 5 + DEVICE_DOES_NOT_SUPPORT_COMMAND = 6 + RATE_LIMITED = 7 + + +class EventService(Closeable): + """ """ + logger = logging.getLogger("Librespot:EventService") + __session: Session + __worker = concurrent.futures.ThreadPoolExecutor() + + def __init__(self, session: Session): + self.__session = session + + def __worker_callback(self, event_builder: EventBuilder): + try: + body = event_builder.to_array() + resp = self.__session.mercury().send_sync( + RawMercuryRequest.Builder().set_uri( + "hm://event-service/v1/events").set_method("POST"). + add_user_field("Accept-Language", "en").add_user_field( + "X-ClientTimeStamp", + int(time.time() * 1000)).add_payload_part(body).build()) + self.logger.debug("Event sent. body: {}, result: {}".format( + body, resp.status_code)) + except IOError as ex: + self.logger.error("Failed sending event: {} {}".format( + event_builder, ex)) + + def send_event(self, event_or_builder: typing.Union[GenericEvent, + EventBuilder]): + """ + + :param event_or_builder: typing.Union[GenericEvent: + :param EventBuilder]: + + """ + if type(event_or_builder) is EventService.GenericEvent: + builder = event_or_builder.build() + elif type(event_or_builder) is EventService.EventBuilder: + builder = event_or_builder + else: + raise TypeError() + self.__worker.submit(lambda: self.__worker_callback(builder)) + + def language(self, lang: str): + """ + + :param lang: str: + + """ + event = EventService.EventBuilder(EventService.Type.LANGUAGE) + event.append(s=lang) + + def close(self): + """ """ + self.__worker.shutdown() + + class Type(enum.Enum): + """ """ + LANGUAGE = ("812", 1) + FETCHED_FILE_ID = ("274", 3) + NEW_SESSION_ID = ("557", 3) + NEW_PLAYBACK_ID = ("558", 1) + TRACK_PLAYED = ("372", 1) + TRACK_TRANSITION = ("12", 37) + CDN_REQUEST = ("10", 20) + + eventId: str + unknown: str + + def __init__(self, event_id: str, unknown: str): + self.eventId = event_id + self.unknown = unknown + + class GenericEvent: + """ """ + + def build(self) -> EventService.EventBuilder: + """ """ + raise NotImplementedError + + class EventBuilder: + """ """ + body: io.BytesIO + + def __init__(self, event_type: EventService.Type): + self.body = io.BytesIO() + self.append_no_delimiter(event_type.value[0]) + self.append(event_type.value[1]) + + def append_no_delimiter(self, s: str = None) -> None: + """ + + :param s: str: (Default value = None) + + """ + if s is None: + s = "" + self.body.write(s.encode()) + + def append(self, + c: int = None, + s: str = None) -> EventService.EventBuilder: + """ + + :param c: int: (Default value = None) + :param s: str: (Default value = None) + + """ + if c is None and s is None or c is not None and s is not None: + raise TypeError() + if c is not None: + self.body.write(b"\x09") + self.body.write(bytes([c])) + return self + if s is not None: + self.body.write(b"\x09") + self.append_no_delimiter(s) + return self + + def to_array(self) -> bytes: + """ """ + pos = self.body.tell() + self.body.seek(0) + data = self.body.read() + self.body.seek(pos) + return data + + +class MessageType(enum.Enum): + """ """ + MESSAGE = "message" + PING = "ping" + PONG = "pong" + REQUEST = "request" + + @staticmethod + def parse(_typ: str): + """ + + :param _typ: str: + + """ + if _typ == MessageType.MESSAGE.value: + return MessageType.MESSAGE + if _typ == MessageType.PING.value: + return MessageType.PING + if _typ == MessageType.PONG.value: + return MessageType.PONG + if _typ == MessageType.REQUEST.value: + return MessageType.REQUEST + raise TypeError("Unknown MessageType: {}".format(_typ)) + + +class Session(Closeable, MessageListener, SubListener): + """ """ + cipher_pair: typing.Union[CipherPair, None] + country_code: str = "EN" + connection: typing.Union[ConnectionHolder, None] + logger = logging.getLogger("Librespot:Session") + scheduled_reconnect: typing.Union[sched.Event, None] = None + scheduler = sched.scheduler(time.time) + __api: ApiClient + __ap_welcome: Authentication.APWelcome + __audio_key_manager: typing.Union[AudioKeyManager, None] = None + __auth_lock = threading.Condition() + __auth_lock_bool = False + __cache_manager: typing.Union[CacheManager, None] + __cdn_manager: typing.Union[CdnManager, None] + __channel_manager: typing.Union[ChannelManager, None] = None + __client: typing.Union[requests.Session, None] + __closed = False + __closing = False + __content_feeder: typing.Union[PlayableContentFeeder, None] + __dealer_client: typing.Union[DealerClient, None] = None + __event_service: typing.Union[EventService, None] = None + __keys: DiffieHellman + __mercury_client: MercuryClient + __receiver: typing.Union[Receiver, None] = None + __search: typing.Union[SearchManager, None] + __server_key = (b"\xac\xe0F\x0b\xff\xc20\xaf\xf4k\xfe\xc3\xbf\xbf\x86=" + b"\xa1\x91\xc6\xcc3l\x93\xa1O\xb3\xb0\x16\x12\xac\xacj" + b"\xf1\x80\xe7\xf6\x14\xd9B\x9d\xbe.4fC\xe3b\xd22z\x1a" + b"\r\x92;\xae\xdd\x14\x02\xb1\x81U\x05a\x04\xd5,\x96\xa4" + b"L\x1e\xcc\x02J\xd4\xb2\x0c\x00\x1f\x17\xed\xc2/\xc45" + b"!\xc8\xf0\xcb\xae\xd2\xad\xd7+\x0f\x9d\xb3\xc52\x1a*" + b"\xfeY\xf3Z\r\xach\xf1\xfab\x1e\xfb,\x8d\x0c\xb79-\x92" + b"G\xe3\xd75\x1am\xbd$\xc2\xae%[\x88\xff\xabs)\x8a\x0b" + b"\xcc\xcd\x0cXg1\x89\xe8\xbd4\x80xJ_\xc9k\x89\x9d\x95k" + b"\xfc\x86\xd7O3\xa6x\x17\x96\xc9\xc3-\r2\xa5\xab\xcd\x05'" + b"\xe2\xf7\x10\xa3\x96\x13\xc4/\x99\xc0'\xbf\xed\x04\x9c" + b"<'X\x04\xb6\xb2\x19\xf9\xc1/\x02\xe9Hc\xec\xa1\xb6B\xa0" + b"\x9dH%\xf8\xb3\x9d\xd0\xe8j\xf9HM\xa1\xc2\xba\x860B\xea" + b"\x9d\xb3\x08l\x19\x0eH\xb3\x9df\xeb\x00\x06\xa2Z\xee\xa1" + b"\x1b\x13\x87<\xd7\x19\xe6U\xbd") + __stored_str: str = "" + __token_provider: typing.Union[TokenProvider, None] + __user_attributes = {} + + def __init__(self, inner: Inner, address: str) -> None: + self.__client = Session.create_client(inner.conf) + self.connection = Session.ConnectionHolder.create(address, None) + self.__inner = inner + self.__keys = DiffieHellman() + self.logger.info("Created new session! device_id: {}, ap: {}".format( + inner.device_id, address)) + + def api(self) -> ApiClient: + """ """ + self.__wait_auth_lock() + if self.__api is None: + raise RuntimeError("Session isn't authenticated!") + return self.__api + + def ap_welcome(self): + """ """ + self.__wait_auth_lock() + if self.__ap_welcome is None: + raise RuntimeError("Session isn't authenticated!") + return self.__ap_welcome + + def audio_key(self) -> AudioKeyManager: + """ """ + self.__wait_auth_lock() + if self.__audio_key_manager is None: + raise RuntimeError("Session isn't authenticated!") + return self.__audio_key_manager + + def authenticate(self, + credential: Authentication.LoginCredentials) -> None: + """Log in to Spotify + + :param credential: Spotify account login information + :param credential: Authentication.LoginCredentials: + + """ + self.__authenticate_partial(credential, False) + with self.__auth_lock: + self.__mercury_client = MercuryClient(self) + self.__token_provider = TokenProvider(self) + self.__audio_key_manager = AudioKeyManager(self) + self.__channel_manager = ChannelManager(self) + self.__api = ApiClient(self) + self.__cdn_manager = CdnManager(self) + self.__content_feeder = PlayableContentFeeder(self) + self.__cache_manager = CacheManager(self) + self.__dealer_client = DealerClient(self) + self.__search = SearchManager(self) + self.__event_service = EventService(self) + self.__auth_lock_bool = False + self.__auth_lock.notify_all() + self.dealer().connect() + self.logger.info("Authenticated as {}!".format( + self.__ap_welcome.canonical_username)) + self.mercury().interested_in("spotify:user:attributes:update", self) + self.dealer().add_message_listener( + self, ["hm://connect-state/v1/connect/logout"]) + + def cache(self) -> CacheManager: + """ """ + self.__wait_auth_lock() + if self.__cache_manager is None: + raise RuntimeError("Session isn't authenticated!") + return self.__cache_manager + + def cdn(self) -> CdnManager: + """ """ + self.__wait_auth_lock() + if self.__cdn_manager is None: + raise RuntimeError("Session isn't authenticated!") + return self.__cdn_manager + + def channel(self) -> ChannelManager: + """ """ + self.__wait_auth_lock() + if self.__channel_manager is None: + raise RuntimeError("Session isn't authenticated!") + return self.__channel_manager + + def client(self) -> requests.Session: + """ """ + return self.__client + + def close(self) -> None: + """Close instance""" + self.logger.info("Closing session. device_id: {}".format( + self.__inner.device_id)) + self.__closing = True + if self.__dealer_client is not None: + self.__dealer_client.close() + self.__dealer_client = None + if self.__audio_key_manager is not None: + self.__audio_key_manager = None + if self.__channel_manager is not None: + self.__channel_manager.close() + self.__channel_manager = None + if self.__event_service is not None: + self.__event_service.close() + self.__event_service = None + if self.__receiver is not None: + self.__receiver.stop() + self.__receiver = None + if self.__client is not None: + self.__client.close() + self.__client = None + if self.connection is not None: + self.connection.close() + self.connection = None + with self.__auth_lock: + self.__ap_welcome = None + self.cipher_pair = None + self.__closed = True + self.logger.info("Closed session. device_id: {}".format( + self.__inner.device_id)) + + def connect(self) -> None: + """Connect to the Spotify Server""" + acc = Session.Accumulator() + # Send ClientHello + nonce = Random.get_random_bytes(0x10) + client_hello_proto = Keyexchange.ClientHello( + build_info=Version.standard_build_info(), + client_nonce=nonce, + cryptosuites_supported=[ + Keyexchange.Cryptosuite.CRYPTO_SUITE_SHANNON + ], + login_crypto_hello=Keyexchange.LoginCryptoHelloUnion( + diffie_hellman=Keyexchange.LoginCryptoDiffieHellmanHello( + gc=self.__keys.public_key_bytes(), server_keys_known=1), ), + padding=b"\x1e", + ) + client_hello_bytes = client_hello_proto.SerializeToString() + self.connection.write(b"\x00\x04") + self.connection.write_int(2 + 4 + len(client_hello_bytes)) + self.connection.write(client_hello_bytes) + self.connection.flush() + acc.write(b"\x00\x04") + acc.write_int(2 + 4 + len(client_hello_bytes)) + acc.write(client_hello_bytes) + # Read APResponseMessage + ap_response_message_length = self.connection.read_int() + acc.write_int(ap_response_message_length) + ap_response_message_bytes = self.connection.read( + ap_response_message_length - 4) + acc.write(ap_response_message_bytes) + ap_response_message_proto = Keyexchange.APResponseMessage() + ap_response_message_proto.ParseFromString(ap_response_message_bytes) + shared_key = util.int_to_bytes( + self.__keys.compute_shared_key( + ap_response_message_proto.challenge.login_crypto_challenge. + diffie_hellman.gs)) + # Check gs_signature + rsa = RSA.construct((int.from_bytes(self.__server_key, "big"), 65537)) + pkcs1_v1_5 = PKCS1_v1_5.new(rsa) + sha1 = SHA1.new() + sha1.update(ap_response_message_proto.challenge.login_crypto_challenge. + diffie_hellman.gs) + if not pkcs1_v1_5.verify( + sha1, + ap_response_message_proto.challenge.login_crypto_challenge. + diffie_hellman.gs_signature, + ): + raise RuntimeError("Failed signature check!") + # Solve challenge + buffer = io.BytesIO() + for i in range(1, 6): + mac = HMAC.new(shared_key, digestmod=SHA1) + mac.update(acc.read()) + mac.update(bytes([i])) + buffer.write(mac.digest()) + buffer.seek(0) + mac = HMAC.new(buffer.read(20), digestmod=SHA1) + mac.update(acc.read()) + challenge = mac.digest() + client_response_plaintext_proto = Keyexchange.ClientResponsePlaintext( + crypto_response=Keyexchange.CryptoResponseUnion(), + login_crypto_response=Keyexchange.LoginCryptoResponseUnion( + diffie_hellman=Keyexchange.LoginCryptoDiffieHellmanResponse( + hmac=challenge)), + pow_response=Keyexchange.PoWResponseUnion(), + ) + client_response_plaintext_bytes = ( + client_response_plaintext_proto.SerializeToString()) + self.connection.write_int(4 + len(client_response_plaintext_bytes)) + self.connection.write(client_response_plaintext_bytes) + self.connection.flush() + try: + self.connection.set_timeout(1) + scrap = self.connection.read(4) + if len(scrap) == 4: + payload = self.connection.read( + struct.unpack(">i", scrap)[0] - 4) + failed = Keyexchange.APResponseMessage() + failed.ParseFromString(payload) + raise RuntimeError(failed) + except socket.timeout: + pass + finally: + self.connection.set_timeout(0) + buffer.seek(20) + with self.__auth_lock: + self.cipher_pair = CipherPair(buffer.read(32), buffer.read(32)) + self.__auth_lock_bool = True + self.logger.info("Connection successfully!") + + def content_feeder(self) -> PlayableContentFeeder: + """ """ + self.__wait_auth_lock() + if self.__content_feeder is None: + raise RuntimeError("Session isn't authenticated!") + return self.__content_feeder + + @staticmethod + def create_client(conf: Configuration) -> requests.Session: + """ + + :param conf: Configuration: + + """ + client = requests.Session() + return client + + def dealer(self) -> DealerClient: + """ """ + self.__wait_auth_lock() + if self.__dealer_client is None: + raise RuntimeError("Session isn't authenticated!") + return self.__dealer_client + + def device_id(self) -> str: + """ """ + return self.__inner.device_id + + def device_name(self) -> str: + """ """ + return self.__inner.device_name + + def device_type(self) -> Connect.DeviceType: + """ """ + return self.__inner.device_type + + def event(self, resp: MercuryClient.Response) -> None: + """ + + :param resp: MercuryClient.Response: + + """ + if resp.uri == "spotify:user:attributes:update": + attributes_update = UserAttributesUpdate() + attributes_update.ParseFromString(resp.payload) + for pair in attributes_update.pairs_list: + self.__user_attributes[pair.key] = pair.value + self.logger.info("Updated user attribute: {} -> {}".format( + pair.key, pair.value)) + + def get_user_attribute(self, key: str, fallback: str = None) -> str: + """ + + :param key: str: + :param fallback: str: (Default value = None) + + """ + return (self.__user_attributes.get(key) + if self.__user_attributes.get(key) is not None else fallback) + + def is_valid(self) -> bool: + """ """ + if self.__closed: + return False + self.__wait_auth_lock() + return self.__ap_welcome is not None and self.connection is not None + + def mercury(self) -> MercuryClient: + """ """ + self.__wait_auth_lock() + if self.__mercury_client is None: + raise RuntimeError("Session isn't authenticated!") + return self.__mercury_client + + def on_message(self, uri: str, headers: typing.Dict[str, str], + payload: bytes): + """ + + :param uri: str: + :param headers: typing.Dict[str: + :param str]: + :param payload: bytes: + + """ + if uri == "hm://connect-state/v1/connect/logout": + self.close() + + def parse_product_info(self, data) -> None: + """Parse product information + + :param data: Raw product information + + """ + products = defusedxml.ElementTree.fromstring(data) + if products is None: + return + product = products[0] + if product is None: + return + for i in range(len(product)): + self.__user_attributes[product[i].tag] = product[i].text + self.logger.debug("Parsed product info: {}".format( + self.__user_attributes)) + + def preferred_locale(self) -> str: + """ """ + return self.__inner.preferred_locale + + def reconnect(self) -> None: + """Reconnect to the Spotify Server""" + if self.connection is not None: + self.connection.close() + self.__receiver.stop() + self.connection = Session.ConnectionHolder.create( + ApResolver.get_random_accesspoint(), self.__inner.conf) + self.connect() + self.__authenticate_partial( + Authentication.LoginCredentials( + typ=self.__ap_welcome.reusable_auth_credentials_type, + username=self.__ap_welcome.canonical_username, + auth_data=self.__ap_welcome.reusable_auth_credentials, + ), + True, + ) + self.logger.info("Re-authenticated as {}!".format( + self.__ap_welcome.canonical_username)) + + def reconnecting(self) -> bool: + """ """ + return not self.__closing and not self.__closed and self.connection is None + + def search(self) -> SearchManager: + """ """ + self.__wait_auth_lock() + if self.__search is None: + raise RuntimeError("Session isn't authenticated!") + return self.__search + + def send(self, cmd: bytes, payload: bytes): + """Send data to socket using send_unchecked + + :param cmd: Command + :param payload: Payload + :param cmd: bytes: + :param payload: bytes: + + """ + if self.__closing and self.connection is None: + self.logger.debug("Connection was broken while closing.") + return + if self.__closed: + raise RuntimeError("Session is closed!") + with self.__auth_lock: + if self.cipher_pair is None or self.__auth_lock_bool: + self.__auth_lock.wait() + self.__send_unchecked(cmd, payload) + + def tokens(self) -> TokenProvider: + """ """ + self.__wait_auth_lock() + if self.__token_provider is None: + raise RuntimeError("Session isn't authenticated!") + return self.__token_provider + + def username(self): + """ """ + return self.__ap_welcome.canonical_username + + def stored(self): + """ """ + return self.__stored_str + + def __authenticate_partial(self, + credential: Authentication.LoginCredentials, + remove_lock: bool) -> None: + """ + Login to Spotify + Args: + credential: Spotify account login information + """ + if self.cipher_pair is None: + raise RuntimeError("Connection not established!") + client_response_encrypted_proto = Authentication.ClientResponseEncrypted( + login_credentials=credential, + system_info=Authentication.SystemInfo( + os=Authentication.Os.OS_UNKNOWN, + cpu_family=Authentication.CpuFamily.CPU_UNKNOWN, + system_information_string=Version.system_info_string(), + device_id=self.__inner.device_id, + ), + version_string=Version.version_string(), + ) + self.__send_unchecked( + Packet.Type.login, + client_response_encrypted_proto.SerializeToString()) + packet = self.cipher_pair.receive_encoded(self.connection) + if packet.is_cmd(Packet.Type.ap_welcome): + self.__ap_welcome = Authentication.APWelcome() + self.__ap_welcome.ParseFromString(packet.payload) + self.__receiver = Session.Receiver(self) + bytes0x0f = Random.get_random_bytes(0x14) + self.__send_unchecked(Packet.Type.unknown_0x0f, bytes0x0f) + preferred_locale = io.BytesIO() + preferred_locale.write(b"\x00\x00\x10\x00\x02preferred-locale" + + self.__inner.preferred_locale.encode()) + preferred_locale.seek(0) + self.__send_unchecked(Packet.Type.preferred_locale, + preferred_locale.read()) + if remove_lock: + with self.__auth_lock: + self.__auth_lock_bool = False + self.__auth_lock.notify_all() + if self.__inner.conf.store_credentials: + reusable = self.__ap_welcome.reusable_auth_credentials + reusable_type = Authentication.AuthenticationType.Name( + self.__ap_welcome.reusable_auth_credentials_type) + if self.__inner.conf.stored_credentials_file is None: + raise TypeError( + "The file path to be saved is not specified") + self.__stored_str = base64.b64encode( + json.dumps({ + "username": + self.__ap_welcome.canonical_username, + "credentials": + base64.b64encode(reusable).decode(), + "type": + reusable_type, + }).encode()).decode() + with open(self.__inner.conf.stored_credentials_file, "w") as f: + json.dump( + { + "username": self.__ap_welcome.canonical_username, + "credentials": base64.b64encode(reusable).decode(), + "type": reusable_type, + }, + f, + ) + + elif packet.is_cmd(Packet.Type.auth_failure): + ap_login_failed = Keyexchange.APLoginFailed() + ap_login_failed.ParseFromString(packet.payload) + self.close() + raise Session.SpotifyAuthenticationException(ap_login_failed) + else: + raise RuntimeError("Unknown CMD 0x" + packet.cmd.hex()) + + def __send_unchecked(self, cmd: bytes, payload: bytes) -> None: + self.cipher_pair.send_encoded(self.connection, cmd, payload) + + def __wait_auth_lock(self) -> None: + if self.__closing and self.connection is None: + self.logger.debug("Connection was broken while closing.") + return + if self.__closed: + raise RuntimeError("Session is closed!") + with self.__auth_lock: + if self.cipher_pair is None or self.__auth_lock_bool: + self.__auth_lock.wait() + + class AbsBuilder: + """ """ + conf = None + device_id = None + device_name = "librespot-spotizerr" + device_type = Connect.DeviceType.COMPUTER + preferred_locale = "en" + + def __init__(self, conf: Session.Configuration = None): + if conf is None: + self.conf = Session.Configuration.Builder().build() + else: + self.conf = conf + + def set_preferred_locale(self, locale: str) -> Session.AbsBuilder: + """ + + :param locale: str: + + """ + if len(locale) != 2: + raise TypeError("Invalid locale: {}".format(locale)) + self.preferred_locale = locale + return self + + def set_device_name(self, device_name: str) -> Session.AbsBuilder: + """ + + :param device_name: str: + + """ + self.device_name = device_name + return self + + def set_device_id(self, device_id: str) -> Session.AbsBuilder: + """ + + :param device_id: str: + + """ + if self.device_id is not None and len(device_id) != 40: + raise TypeError("Device ID must be 40 chars long.") + self.device_id = device_id + return self + + def set_device_type( + self, device_type: Connect.DeviceType) -> Session.AbsBuilder: + """ + + :param device_type: Connect.DeviceType: + + """ + self.device_type = device_type + return self + + class Accumulator: + """ """ + __buffer: io.BytesIO + + def __init__(self): + self.__buffer = io.BytesIO() + + def read(self) -> bytes: + """Read all buffer + + + :returns: All buffer + + """ + pos = self.__buffer.tell() + self.__buffer.seek(0) + data = self.__buffer.read() + self.__buffer.seek(pos) + return data + + def write(self, data: bytes) -> None: + """Write data to buffer + + :param data: Bytes to be written + :param data: bytes: + + """ + self.__buffer.write(data) + + def write_int(self, data: int) -> None: + """Write data to buffer + + :param data: Integer to be written + :param data: int: + + """ + self.write(struct.pack(">i", data)) + + def write_short(self, data: int) -> None: + """Write data to buffer + + :param data: Short integer to be written + :param data: int: + + """ + self.write(struct.pack(">h", data)) + + class Builder(AbsBuilder): + """ """ + login_credentials: Authentication.LoginCredentials = None + + def blob(self, username: str, blob: bytes) -> Session.Builder: + """ + + :param username: str: + :param blob: bytes: + + """ + if self.device_id is None: + raise TypeError("You must specify the device ID first.") + self.login_credentials = self.decrypt_blob(self.device_id, + username, blob) + return self + + def decrypt_blob( + self, device_id: str, username: str, + encrypted_blob: bytes) -> Authentication.LoginCredentials: + """ + + :param device_id: str: + :param username: str: + :param encrypted_blob: bytes: + + """ + encrypted_blob = base64.b64decode(encrypted_blob) + sha1 = SHA1.new() + sha1.update(device_id.encode()) + secret = sha1.digest() + base_key = PBKDF2(secret, + username.encode(), + 20, + 0x100, + hmac_hash_module=SHA1) + sha1 = SHA1.new() + sha1.update(base_key) + key = sha1.digest() + b"\x00\x00\x00\x14" + aes = AES.new(key, AES.MODE_ECB) + decrypted_blob = bytearray(aes.decrypt(encrypted_blob)) + l = len(decrypted_blob) + for i in range(0, l - 0x10): + decrypted_blob[l - i - 1] ^= decrypted_blob[l - i - 0x11] + blob = io.BytesIO(decrypted_blob) + blob.read(1) + le = self.read_blob_int(blob) + blob.read(le) + blob.read(1) + type_int = self.read_blob_int(blob) + type_ = Authentication.AuthenticationType.Name(type_int) + if type_ is None: + raise IOError( + TypeError( + "Unknown AuthenticationType: {}".format(type_int))) + blob.read(1) + l = self.read_blob_int(blob) + auth_data = blob.read(l) + return Authentication.LoginCredentials( + auth_data=auth_data, + typ=type_, + username=username, + ) + + def read_blob_int(self, buffer: io.BytesIO) -> int: + """ + + :param buffer: io.BytesIO: + + """ + lo = buffer.read(1) + if (int(lo[0]) & 0x80) == 0: + return int(lo[0]) + hi = buffer.read(1) + return int(lo[0]) & 0x7F | int(hi[0]) << 7 + + def stored(self, stored_credentials_str: str): + """Create credential from stored string + + :param stored_credentials_str: str: + :returns: Builder + + """ + try: + obj = json.loads(base64.b64decode(stored_credentials_str)) + except binascii.Error: + pass + except json.JSONDecodeError: + pass + else: + try: + self.login_credentials = Authentication.LoginCredentials( + typ=Authentication.AuthenticationType.Value( + obj["type"]), + username=obj["username"], + auth_data=base64.b64decode(obj["credentials"]), + ) + except KeyError: + pass + return self + + def stored_file(self, + stored_credentials: str = None) -> Session.Builder: + """Create credential from stored file + + :param stored_credentials: str: (Default value = None) + :returns: Builder + + """ + if stored_credentials is None: + stored_credentials = self.conf.stored_credentials_file + if os.path.isfile(stored_credentials): + try: + with open(stored_credentials) as f: + obj = json.load(f) + except json.JSONDecodeError: + pass + else: + try: + self.login_credentials = Authentication.LoginCredentials( + typ=Authentication.AuthenticationType.Value( + obj["type"]), + username=obj["username"], + auth_data=base64.b64decode(obj["credentials"]), + ) + except KeyError: + pass + return self + + def user_pass(self, username: str, password: str) -> Session.Builder: + """Create credential from username and password + + :param username: Spotify's account username + :param username: str: + :param password: str: + :returns: Builder + + """ + self.login_credentials = Authentication.LoginCredentials( + username=username, + typ=Authentication.AuthenticationType.AUTHENTICATION_USER_PASS, + auth_data=password.encode(), + ) + return self + + def create(self) -> Session: + """Create the Session instance + + + :returns: Session instance + + """ + if self.login_credentials is None: + raise RuntimeError("You must select an authentication method.") + session = Session( + Session.Inner( + self.device_type, + self.device_name, + self.preferred_locale, + self.conf, + self.device_id, + ), + ApResolver.get_random_accesspoint(), + ) + session.connect() + session.authenticate(self.login_credentials) + return session + + class Configuration: + """ """ + # Proxy + # proxyEnabled: bool + # proxyType: Proxy.Type + # proxyAddress: str + # proxyPort: int + # proxyAuth: bool + # proxyUsername: str + # proxyPassword: str + + # Cache + cache_enabled: bool + cache_dir: str + do_cache_clean_up: bool + + # Stored credentials + store_credentials: bool + stored_credentials_file: str + + # Fetching + retry_on_chunk_error: bool + + def __init__( + self, + # proxy_enabled: bool, + # proxy_type: Proxy.Type, + # proxy_address: str, + # proxy_port: int, + # proxy_auth: bool, + # proxy_username: str, + # proxy_password: str, + cache_enabled: bool, + cache_dir: str, + do_cache_clean_up: bool, + store_credentials: bool, + stored_credentials_file: str, + retry_on_chunk_error: bool, + ): + # self.proxyEnabled = proxy_enabled + # self.proxyType = proxy_type + # self.proxyAddress = proxy_address + # self.proxyPort = proxy_port + # self.proxyAuth = proxy_auth + # self.proxyUsername = proxy_username + # self.proxyPassword = proxy_password + self.cache_enabled = cache_enabled + self.cache_dir = cache_dir + self.do_cache_clean_up = do_cache_clean_up + self.store_credentials = store_credentials + self.stored_credentials_file = stored_credentials_file + self.retry_on_chunk_error = retry_on_chunk_error + + class Builder: + """ """ + # Proxy + # proxyEnabled: bool = False + # proxyType: Proxy.Type = Proxy.Type.DIRECT + # proxyAddress: str = None + # proxyPort: int = None + # proxyAuth: bool = None + # proxyUsername: str = None + # proxyPassword: str = None + + # Cache + cache_enabled: bool = True + cache_dir: str = os.path.join(os.getcwd(), "cache") + do_cache_clean_up: bool = True + + # Stored credentials + store_credentials: bool = True + stored_credentials_file: str = os.path.join( + os.getcwd(), "credentials.json") + + # Fetching + retry_on_chunk_error: bool = True + + # def set_proxy_enabled( + # self, + # proxy_enabled: bool) -> Session.Configuration.Builder: + # self.proxyEnabled = proxy_enabled + # return self + + # def set_proxy_type( + # self, + # proxy_type: Proxy.Type) -> Session.Configuration.Builder: + # self.proxyType = proxy_type + # return self + + # def set_proxy_address( + # self, proxy_address: str) -> Session.Configuration.Builder: + # self.proxyAddress = proxy_address + # return self + + # def set_proxy_auth( + # self, proxy_auth: bool) -> Session.Configuration.Builder: + # self.proxyAuth = proxy_auth + # return self + + # def set_proxy_username( + # self, + # proxy_username: str) -> Session.Configuration.Builder: + # self.proxyUsername = proxy_username + # return self + + # def set_proxy_password( + # self, + # proxy_password: str) -> Session.Configuration.Builder: + # self.proxyPassword = proxy_password + # return self + + def set_cache_enabled( + self, + cache_enabled: bool) -> Session.Configuration.Builder: + """Set cache_enabled + + :param cache_enabled: bool: + :returns: Builder + + """ + self.cache_enabled = cache_enabled + return self + + def set_cache_dir(self, + cache_dir: str) -> Session.Configuration.Builder: + """Set cache_dir + + :param cache_dir: str: + :returns: Builder + + """ + self.cache_dir = cache_dir + return self + + def set_do_cache_clean_up( + self, + do_cache_clean_up: bool) -> Session.Configuration.Builder: + """Set do_cache_clean_up + + :param do_cache_clean_up: bool: + :returns: Builder + + """ + self.do_cache_clean_up = do_cache_clean_up + return self + + def set_store_credentials( + self, + store_credentials: bool) -> Session.Configuration.Builder: + """Set store_credentials + + :param store_credentials: bool: + :returns: Builder + + """ + self.store_credentials = store_credentials + return self + + def set_stored_credential_file( + self, stored_credential_file: str + ) -> Session.Configuration.Builder: + """Set stored_credential_file + + :param stored_credential_file: str: + :returns: Builder + + """ + self.stored_credentials_file = stored_credential_file + return self + + def set_retry_on_chunk_error( + self, retry_on_chunk_error: bool + ) -> Session.Configuration.Builder: + """Set retry_on_chunk_error + + :param retry_on_chunk_error: bool: + :returns: Builder + + """ + self.retry_on_chunk_error = retry_on_chunk_error + return self + + def build(self) -> Session.Configuration: + """Build Configuration instance + + + :returns: Session.Configuration + + """ + return Session.Configuration( + # self.proxyEnabled, + # self.proxyType, + # self.proxyAddress, + # self.proxyPort, + # self.proxyAuth, + # self.proxyUsername, + # self.proxyPassword, + self.cache_enabled, + self.cache_dir, + self.do_cache_clean_up, + self.store_credentials, + self.stored_credentials_file, + self.retry_on_chunk_error, + ) + + class ConnectionHolder: + """ """ + __buffer: io.BytesIO + __socket: socket.socket + + def __init__(self, sock: socket.socket): + self.__buffer = io.BytesIO() + self.__socket = sock + + @staticmethod + def create(address: str, conf) -> Session.ConnectionHolder: + """Create the ConnectionHolder instance + + :param address: Address to connect + :param address: str: + :param conf: + :returns: ConnectionHolder instance + + """ + ap_address = address.split(":")[0] + ap_port = int(address.split(":")[1]) + sock = socket.socket() + sock.connect((ap_address, ap_port)) + return Session.ConnectionHolder(sock) + + def close(self) -> None: + """Close the connection""" + self.__socket.close() + + def flush(self) -> None: + """Flush data to socket""" + try: + self.__buffer.seek(0) + self.__socket.send(self.__buffer.read()) + self.__buffer = io.BytesIO() + except BrokenPipeError: + pass + + def read(self, length: int) -> bytes: + """Read data from socket + + :param length: int: + :returns: Bytes data from socket + + """ + return self.__socket.recv(length) + + def read_int(self) -> int: + """Read integer from socket + + + :returns: integer from socket + + """ + return struct.unpack(">i", self.read(4))[0] + + def read_short(self) -> int: + """Read short integer from socket + + + :returns: short integer from socket + + """ + return struct.unpack(">h", self.read(2))[0] + + def set_timeout(self, seconds: float) -> None: + """Set socket's timeout + + :param seconds: Number of seconds until timeout + :param seconds: float: + + """ + self.__socket.settimeout(None if seconds == 0 else seconds) + + def write(self, data: bytes) -> None: + """Write data to buffer + + :param data: Bytes to be written + :param data: bytes: + + """ + self.__buffer.write(data) + + def write_int(self, data: int) -> None: + """Write data to buffer + + :param data: Integer to be written + :param data: int: + + """ + self.write(struct.pack(">i", data)) + + def write_short(self, data: int) -> None: + """Write data to buffer + + :param data: Short integer to be written + :param data: int: + + """ + self.write(struct.pack(">h", data)) + + class Inner: + """ """ + device_type: Connect.DeviceType = None + device_name: str + device_id: str + conf = None + preferred_locale: str + + def __init__( + self, + device_type: Connect.DeviceType, + device_name: str, + preferred_locale: str, + conf: Session.Configuration, + device_id: str = None, + ): + self.preferred_locale = preferred_locale + self.conf = conf + self.device_type = device_type + self.device_name = device_name + self.device_id = (device_id if device_id is not None else + util.random_hex_string(40)) + + class Receiver: + """ """ + __session: Session + __thread: threading.Thread + __running: bool = True + + def __init__(self, session): + self.__session = session + self.__thread = threading.Thread(target=self.run) + self.__thread.daemon = True + self.__thread.name = "session-packet-receiver" + self.__thread.start() + + def stop(self) -> None: + """ """ + self.__running = False + + def run(self) -> None: + """Receive Packet thread function""" + self.__session.logger.info("Session.Receiver started") + while self.__running: + packet: Packet + cmd: bytes + try: + packet = self.__session.cipher_pair.receive_encoded( + self.__session.connection) + cmd = Packet.Type.parse(packet.cmd) + if cmd is None: + self.__session.logger.info( + "Skipping unknown command cmd: 0x{}, payload: {}". + format(util.bytes_to_hex(packet.cmd), + packet.payload)) + continue + except (RuntimeError, ConnectionResetError) as ex: + if self.__running: + self.__session.logger.fatal( + "Failed reading packet! {}".format(ex)) + self.__session.reconnect() + break + if not self.__running: + break + if cmd == Packet.Type.ping: + if self.__session.scheduled_reconnect is not None: + self.__session.scheduler.cancel( + self.__session.scheduled_reconnect) + + def anonymous(): + """ """ + self.__session.logger.warning( + "Socket timed out. Reconnecting...") + self.__session.reconnect() + + self.__session.scheduled_reconnect = self.__session.scheduler.enter( + 2 * 60 + 5, 1, anonymous) + self.__session.send(Packet.Type.pong, packet.payload) + elif cmd == Packet.Type.pong_ack: + continue + elif cmd == Packet.Type.country_code: + self.__session.__country_code = packet.payload.decode() + self.__session.logger.info( + "Received country_code: {}".format( + self.__session.__country_code)) + elif cmd == Packet.Type.license_version: + license_version = io.BytesIO(packet.payload) + license_id = struct.unpack(">h", + license_version.read(2))[0] + if license_id != 0: + buffer = license_version.read() + self.__session.logger.info( + "Received license_version: {}, {}".format( + license_id, buffer.decode())) + else: + self.__session.logger.info( + "Received license_version: {}".format(license_id)) + elif cmd == Packet.Type.unknown_0x10: + self.__session.logger.debug("Received 0x10: {}".format( + util.bytes_to_hex(packet.payload))) + elif cmd in [ + Packet.Type.mercury_sub, + Packet.Type.mercury_unsub, + Packet.Type.mercury_event, + Packet.Type.mercury_req, + ]: + self.__session.mercury().dispatch(packet) + elif cmd in [Packet.Type.aes_key, Packet.Type.aes_key_error]: + self.__session.audio_key().dispatch(packet) + elif cmd in [ + Packet.Type.channel_error, Packet.Type.stream_chunk_res + ]: + self.__session.channel().dispatch(packet) + elif cmd == Packet.Type.product_info: + self.__session.parse_product_info(packet.payload) + else: + self.__session.logger.info("Skipping {}".format( + util.bytes_to_hex(cmd))) + + class SpotifyAuthenticationException(Exception): + """ """ + + def __init__(self, login_failed: Keyexchange.APLoginFailed): + super().__init__( + Keyexchange.ErrorCode.Name(login_failed.error_code)) + + +class SearchManager: + """ """ + base_url = "hm://searchview/km/v4/search/" + __session: Session + + def __init__(self, session: Session): + self.__session = session + + def request(self, request: SearchRequest) -> typing.Any: + """ + + :param request: SearchRequest: + + """ + if request.get_username() == "": + request.set_username(self.__session.username()) + if request.get_country() == "": + request.set_country(self.__session.country_code) + if request.get_locale() == "": + request.set_locale(self.__session.preferred_locale()) + response = self.__session.mercury().send_sync( + RawMercuryRequest.new_builder().set_method("GET").set_uri( + request.build_url()).build()) + if response.status_code != 200: + raise SearchManager.SearchException(response.status_code) + return json.loads(response.payload) + + class SearchException(Exception): + """ """ + + def __init__(self, status_code: int): + super().__init__("Search failed with code {}.".format(status_code)) + + class SearchRequest: + """ """ + query: typing.Final[str] + __catalogue = "" + __country = "" + __image_size = "" + __limit = 10 + __locale = "" + __username = "" + + def __init__(self, query: str): + self.query = query + if query == "": + raise TypeError + + def build_url(self) -> str: + """ """ + url = SearchManager.base_url + urllib.parse.quote(self.query) + url += "?entityVersion=2" + url += "&catalogue=" + urllib.parse.quote(self.__catalogue) + url += "&country=" + urllib.parse.quote(self.__country) + url += "&imageSize=" + urllib.parse.quote(self.__image_size) + url += "&limit=" + str(self.__limit) + url += "&locale=" + urllib.parse.quote(self.__locale) + url += "&username=" + urllib.parse.quote(self.__username) + return url + + def get_catalogue(self) -> str: + """ """ + return self.__catalogue + + def get_country(self) -> str: + """ """ + return self.__country + + def get_image_size(self) -> str: + """ """ + return self.__image_size + + def get_limit(self) -> int: + """ """ + return self.__limit + + def get_locale(self) -> str: + """ """ + return self.__locale + + def get_username(self) -> str: + """ """ + return self.__username + + def set_catalogue(self, catalogue: str) -> SearchManager.SearchRequest: + """ + + :param catalogue: str: + + """ + self.__catalogue = catalogue + return self + + def set_country(self, country: str) -> SearchManager.SearchRequest: + """ + + :param country: str: + + """ + self.__country = country + return self + + def set_image_size(self, + image_size: str) -> SearchManager.SearchRequest: + """ + + :param image_size: str: + + """ + self.__image_size = image_size + return self + + def set_limit(self, limit: int) -> SearchManager.SearchRequest: + """ + + :param limit: int: + + """ + self.__limit = limit + return self + + def set_locale(self, locale: str) -> SearchManager.SearchRequest: + """ + + :param locale: str: + + """ + self.__locale = locale + return self + + def set_username(self, username: str) -> SearchManager.SearchRequest: + """ + + :param username: str: + + """ + self.__username = username + return self + + +class TokenProvider: + """ """ + logger = logging.getLogger("Librespot:TokenProvider") + token_expire_threshold = 10 + __session: Session + __tokens: typing.List[StoredToken] = [] + + def __init__(self, session: Session): + self._session = session + + def find_token_with_all_scopes( + self, scopes: typing.List[str]) -> typing.Union[StoredToken, None]: + """ + + :param scopes: typing.List[str]: + + """ + for token in self.__tokens: + if token.has_scopes(scopes): + return token + return None + + def get(self, scope: str) -> str: + """ + + :param scope: str: + + """ + return self.get_token(scope).access_token + + def get_token(self, *scopes) -> StoredToken: + """ + + :param *scopes: + + """ + scopes = list(scopes) + if len(scopes) == 0: + raise RuntimeError("The token doesn't have any scope") + token = self.find_token_with_all_scopes(scopes) + if token is not None: + if token.expired(): + self.__tokens.remove(token) + else: + return token + self.logger.debug( + "Token expired or not suitable, requesting again. scopes: {}, old_token: {}" + .format(scopes, token)) + response = self._session.mercury().send_sync_json( + MercuryRequests.request_token(self._session.device_id(), + ",".join(scopes))) + token = TokenProvider.StoredToken(response) + self.logger.debug( + "Updated token successfully! scopes: {}, new_token: {}".format( + scopes, token)) + self.__tokens.append(token) + return token + + class StoredToken: + """ """ + expires_in: int + access_token: str + scopes: typing.List[str] + timestamp: int + + def __init__(self, obj): + self.timestamp = int(time.time_ns() / 1000) + self.expires_in = obj["expiresIn"] + self.access_token = obj["accessToken"] + self.scopes = obj["scope"] + + def expired(self) -> bool: + """ """ + return self.timestamp + (self.expires_in - TokenProvider. + token_expire_threshold) * 1000 * 1000 < int( + time.time_ns() / 1000) + + def has_scope(self, scope: str) -> bool: + """ + + :param scope: str: + + """ + for s in self.scopes: + if s == scope: + return True + return False + + def has_scopes(self, sc: typing.List[str]) -> bool: + """ + + :param sc: typing.List[str]: + + """ + for s in sc: + if not self.has_scope(s): + return False + return True diff --git a/librespot/crypto.py b/librespot/crypto.py new file mode 100644 index 0000000..6ae8c23 --- /dev/null +++ b/librespot/crypto.py @@ -0,0 +1,412 @@ +from __future__ import annotations +from Cryptodome import Random +from librespot import util +import io +import re +import struct +import typing + +if typing.TYPE_CHECKING: + from librespot.core import Session + + +class CipherPair: + __receive_cipher: Shannon + __receive_nonce = 0 + __send_cipher: Shannon + __send_nonce = 0 + + def __init__(self, send_key: bytes, receive_key: bytes): + self.__send_cipher = Shannon() + self.__send_cipher.key(send_key) + self.__receive_cipher = Shannon() + self.__receive_cipher.key(receive_key) + + def send_encoded(self, connection: Session.ConnectionHolder, cmd: bytes, + payload: bytes) -> None: + """ + Send decrypted data to the socket + :param connection: + :param cmd: + :param payload: + :return: + """ + self.__send_cipher.nonce(self.__send_nonce) + self.__send_nonce += 1 + buffer = io.BytesIO() + buffer.write(cmd) + buffer.write(struct.pack(">H", len(payload))) + buffer.write(payload) + buffer.seek(0) + contents = self.__send_cipher.encrypt(buffer.read()) + mac = self.__send_cipher.finish(4) + connection.write(contents) + connection.write(mac) + connection.flush() + + def receive_encoded(self, connection: Session.ConnectionHolder) -> Packet: + """ + Receive and parse decrypted data from the socket + Args: + connection: ConnectionHolder + Return: + The parsed packet will be returned + """ + try: + self.__receive_cipher.nonce(self.__receive_nonce) + self.__receive_nonce += 1 + header_bytes = self.__receive_cipher.decrypt(connection.read(3)) + cmd = struct.pack(">s", bytes([header_bytes[0]])) + payload_length = (header_bytes[1] << 8) | (header_bytes[2] & 0xff) + payload_bytes = self.__receive_cipher.decrypt( + connection.read(payload_length)) + mac = connection.read(4) + expected_mac = self.__receive_cipher.finish(4) + if mac != expected_mac: + raise RuntimeError() + return Packet(cmd, payload_bytes) + except IndexError: + raise RuntimeError("Failed to receive packet") + + +class DiffieHellman: + """ + DiffieHellman Keyexchange + """ + __prime = int.from_bytes( + b'\xff\xff\xff\xff\xff\xff\xff\xff\xc9\x0f' + b'\xda\xa2!h\xc24\xc4\xc6b\x8b\x80\xdc\x1c' + b'\xd1)\x02N\x08\x8ag\xcct\x02\x0b\xbe\xa6;' + b'\x13\x9b"QJ\x08y\x8e4\x04\xdd\xef\x95\x19' + b'\xb3\xcd:C\x1b0+\nm\xf2_\x147O\xe15mmQ\xc2' + b'E\xe4\x85\xb5vb^~\xc6\xf4LB\xe9\xa6:6 \xff' + b'\xff\xff\xff\xff\xff\xff\xff', + byteorder="big") + __private_key: int + __public_key: int + + def __init__(self): + key_data = Random.get_random_bytes(0x5f) + self.__private_key = int.from_bytes(key_data, byteorder="big") + self.__public_key = pow(2, self.__private_key, self.__prime) + + def compute_shared_key(self, remote_key_bytes: bytes): + """ + Compute shared_key + """ + remote_key = int.from_bytes(remote_key_bytes, "big") + return pow(remote_key, self.__private_key, self.__prime) + + def private_key(self) -> int: + """ + Return DiffieHellman's private key + Returns: + DiffieHellman's private key + """ + return self.__private_key + + def public_key(self) -> int: + """ + Return DiffieHellman's public key + Returns: + DiffieHellman's public key + """ + return self.__public_key + + def public_key_bytes(self) -> bytes: + """ + Return DiffieHellman's packed public key + Returns: + DiffieHellman's packed public key + """ + return util.int_to_bytes(self.__public_key) + + +class Packet: + cmd: bytes + payload: bytes + + def __init__(self, cmd: bytes, payload: bytes): + self.cmd = cmd + self.payload = payload + + def is_cmd(self, cmd: bytes) -> bool: + return cmd == self.cmd + + class Type: + secret_block = b"\x02" + ping = b"\x04" + stream_chunk = b"\x08" + stream_chunk_res = b"\x09" + channel_error = b"\x0a" + channel_abort = b"\x0b" + request_key = b"\x0c" + aes_key = b"\x0d" + aes_key_error = b"\x0e" + image = b"\x19" + country_code = b"\x1b" + pong = b"\x49" + pong_ack = b"\x4a" + pause = b"\x4b" + product_info = b"\x50" + legacy_welcome = b"\x69" + license_version = b"\x76" + login = b"\xab" + ap_welcome = b"\xac" + auth_failure = b"\xad" + mercury_req = b"\xb2" + mercury_sub = b"\xb3" + mercury_unsub = b"\xb4" + mercury_event = b"\xb5" + track_ended_time = b"\x82" + unknown_data_all_zeros = b"\x1f" + preferred_locale = b"\x74" + unknown_0x4f = b"\x4f" + unknown_0x0f = b"\x0f" + unknown_0x10 = b"\x10" + + @staticmethod + def parse(val: typing.Union[bytes, None]) -> typing.Union[bytes, None]: + for cmd in [ + Packet.Type.__dict__[attr] for attr in Packet.Type.__dict__ + if re.search("__.+?__", attr) is None + and type(Packet.Type.__dict__[attr]) is bytes + ]: + if cmd == val: + return cmd + return None + + @staticmethod + def for_method(method: str) -> bytes: + if method == "SUB": + return Packet.Type.mercury_sub + if method == "UNSUB": + return Packet.Type.mercury_unsub + return Packet.Type.mercury_req + + +class Shannon: + n = 16 + fold = n + initkonst = 0x6996c53a + keyp = 13 + r: list + crc: list + init_r: list + konst: int + sbuf: int + mbuf: int + nbuf: int + + def __init__(self): + self.r = [0 for _ in range(self.n)] + self.crc = [0 for _ in range(self.n)] + self.init_r = [0 for _ in range(self.n)] + + def rotl(self, i: int, distance: int) -> int: + return ((i << distance) | (i >> (32 - distance))) & 0xffffffff + + def sbox(self, i: int) -> int: + i ^= self.rotl(i, 5) | self.rotl(i, 7) + i ^= self.rotl(i, 19) | self.rotl(i, 22) + return i + + def sbox2(self, i: int) -> int: + i ^= self.rotl(i, 7) | self.rotl(i, 22) + i ^= self.rotl(i, 5) | self.rotl(i, 19) + return i + + def cycle(self) -> None: + t: int + t = self.r[12] ^ self.r[13] ^ self.konst + t = self.sbox(t) ^ self.rotl(self.r[0], 1) + for i in range(1, self.n): + self.r[i - 1] = self.r[i] + self.r[self.n - 1] = t + t = self.sbox2(self.r[2] ^ self.r[15]) + self.r[0] ^= t + self.sbuf = t ^ self.r[8] ^ self.r[12] + + def crc_func(self, i: int) -> None: + t: int + t = self.crc[0] ^ self.crc[2] ^ self.crc[15] ^ i + for j in range(1, self.n): + self.crc[j - 1] = self.crc[j] + self.crc[self.n - 1] = t + + def mac_func(self, i: int) -> None: + self.crc_func(i) + self.r[self.keyp] ^= i + + def init_state(self) -> None: + self.r[0] = 1 + self.r[1] = 1 + for i in range(2, self.n): + self.r[i] = self.r[i - 1] + self.r[i - 2] + self.konst = self.initkonst + + def save_state(self) -> None: + for i in range(self.n): + self.init_r[i] = self.r[i] + + def reload_state(self) -> None: + for i in range(self.n): + self.r[i] = self.init_r[i] + + def gen_konst(self) -> None: + self.konst = self.r[0] + + def add_key(self, k: int) -> None: + self.r[self.keyp] ^= k + + def diffuse(self) -> None: + for _ in range(self.fold): + self.cycle() + + def load_key(self, key: bytes) -> None: + i: int + j: int + t: int + padding_size = int((len(key) + 3) / 4) * 4 - len(key) + key = key + (b"\x00" * padding_size) + struct.pack(" None: + self.init_state() + self.load_key(key) + self.gen_konst() + self.save_state() + self.nbuf = 0 + + def nonce(self, nonce: typing.Union[bytes, int]) -> None: + if type(nonce) is int: + nonce = bytes(struct.pack(">I", nonce)) + self.reload_state() + self.konst = self.initkonst + self.load_key(nonce) + self.gen_konst() + self.nbuf = 0 + + def encrypt(self, buffer: bytes, n: int = None) -> bytes: + if n is None: + return self.encrypt(buffer, len(buffer)) + buffer = bytearray(buffer) + i = 0 + j: int + t: int + if self.nbuf != 0: + while self.nbuf != 0 and n != 0: + self.mbuf ^= (buffer[i] & 0xff) << (32 - self.nbuf) + buffer[i] ^= (self.sbuf >> (32 - self.nbuf)) & 0xff + i += 1 + self.nbuf -= 8 + n -= 1 + if self.nbuf != 0: + return b"" + self.mac_func(self.mbuf) + j = n & ~0x03 + while i < j: + self.cycle() + t = ((buffer[i + 3] & 0xFF) << 24) | \ + ((buffer[i + 2] & 0xFF) << 16) | \ + ((buffer[i + 1] & 0xFF) << 8) | \ + (buffer[i] & 0xFF) + self.mac_func(t) + t ^= self.sbuf + buffer[i + 3] = (t >> 24) & 0xFF + buffer[i + 2] = (t >> 16) & 0xFF + buffer[i + 1] = (t >> 8) & 0xFF + buffer[i] = t & 0xFF + i += 4 + n &= 0x03 + if n != 0: + self.cycle() + self.mbuf = 0 + self.nbuf = 32 + while self.nbuf != 0 and n != 0: + self.mbuf ^= (buffer[i] & 0xff) << (32 - self.nbuf) + buffer[i] ^= (self.sbuf >> (32 - self.nbuf)) & 0xff + i += 1 + self.nbuf -= 8 + n -= 1 + return bytes(buffer) + + def decrypt(self, buffer: bytes, n: int = None) -> bytes: + if n is None: + return self.decrypt(buffer, len(buffer)) + buffer = bytearray(buffer) + i = 0 + j: int + t: int + if self.nbuf != 0: + while self.nbuf != 0 and n != 0: + buffer[i] ^= (self.sbuf >> (32 - self.nbuf)) & 0xff + self.mbuf ^= (buffer[i] & 0xff) << (32 - self.nbuf) + i += 1 + self.nbuf -= 8 + n -= 1 + if self.nbuf != 0: + return b"" + self.mac_func(self.mbuf) + j = n & ~0x03 + while i < j: + self.cycle() + t = ((buffer[i + 3] & 0xFF) << 24) | \ + ((buffer[i + 2] & 0xFF) << 16) | \ + ((buffer[i + 1] & 0xFF) << 8) | \ + (buffer[i] & 0xFF) + t ^= self.sbuf + self.mac_func(t) + buffer[i + 3] = (t >> 24) & 0xFF + buffer[i + 2] = (t >> 16) & 0xFF + buffer[i + 1] = (t >> 8) & 0xFF + buffer[i] = t & 0xFF + i += 4 + n &= 0x03 + if n != 0: + self.cycle() + self.mbuf = 0 + self.nbuf = 32 + while self.nbuf != 0 and n != 0: + buffer[i] ^= (self.sbuf >> (32 - self.nbuf)) & 0xff + self.mbuf ^= (buffer[i] & 0xff) << (32 - self.nbuf) + i += 1 + self.nbuf -= 8 + n -= 1 + return bytes(buffer) + + def finish(self, n: int) -> bytes: + buffer = bytearray(4) + i = 0 + j: int + if self.nbuf != 0: + self.mac_func(self.mbuf) + self.cycle() + self.add_key(self.initkonst ^ (self.nbuf << 3)) + self.nbuf = 0 + for j in range(self.n): + self.r[j] ^= self.crc[j] + self.diffuse() + while n > 0: + self.cycle() + if n >= 4: + buffer[i + 3] = (self.sbuf >> 24) & 0xff + buffer[i + 2] = (self.sbuf >> 16) & 0xff + buffer[i + 1] = (self.sbuf >> 8) & 0xff + buffer[i] = self.sbuf & 0xff + n -= 4 + i += 4 + else: + for j in range(n): + buffer[i + j] = (self.sbuf >> (i * 8)) & 0xff + break + return bytes(buffer) diff --git a/librespot/dealer.py b/librespot/dealer.py new file mode 100644 index 0000000..143c256 --- /dev/null +++ b/librespot/dealer.py @@ -0,0 +1,11 @@ +from __future__ import annotations +from librespot.core import ApResolver +from librespot.metadata import AlbumId, ArtistId, EpisodeId, ShowId, TrackId +from librespot.proto import Connect_pb2 as Connect, Metadata_pb2 as Metadata +from librespot.structure import Closeable +import logging +import requests +import typing + +if typing.TYPE_CHECKING: + from librespot.core import Session diff --git a/librespot/mercury.py b/librespot/mercury.py new file mode 100644 index 0000000..450b98f --- /dev/null +++ b/librespot/mercury.py @@ -0,0 +1,394 @@ +from __future__ import annotations +from librespot import util +from librespot.crypto import Packet +from librespot.proto import Mercury_pb2 as Mercury, Pubsub_pb2 as Pubsub +from librespot.structure import Closeable, PacketsReceiver, SubListener +import io +import json +import logging +import queue +import struct +import threading +import typing + +if typing.TYPE_CHECKING: + from librespot.core import Session + + +class JsonMercuryRequest: + request: RawMercuryRequest + + def __init__(self, request: RawMercuryRequest): + self.request = request + + +class MercuryClient(Closeable, PacketsReceiver): + logger = logging.getLogger("Librespot:MercuryClient") + mercury_request_timeout = 3 + __callbacks: typing.Dict[int, Callback] = {} + __remove_callback_lock = threading.Condition() + __partials: typing.Dict[int, typing.List[bytes]] = {} + __seq_holder = 0 + __seq_holder_lock = threading.Condition() + __session: Session + __subscriptions: typing.List[InternalSubListener] = [] + __subscriptions_lock = threading.Condition() + + def __init__(self, session: Session): + self.__session = session + + def close(self) -> None: + """ + Close the MercuryClient instance + """ + if len(self.__subscriptions) != 0: + for listener in self.__subscriptions: + if listener.is_sub: + self.unsubscribe(listener.uri) + else: + self.not_interested_in(listener.listener) + if len(self.__callbacks) != 0: + with self.__remove_callback_lock: + self.__remove_callback_lock.wait(self.mercury_request_timeout) + self.__callbacks.clear() + + def dispatch(self, packet: Packet) -> None: + payload = io.BytesIO(packet.payload) + seq_length = struct.unpack(">H", payload.read(2))[0] + if seq_length == 2: + seq = struct.unpack(">H", payload.read(2))[0] + elif seq_length == 4: + seq = struct.unpack(">i", payload.read(4))[0] + elif seq_length == 8: + seq = struct.unpack(">q", payload.read(8))[0] + else: + raise RuntimeError("Unknown seq length: {}".format(seq_length)) + flags = payload.read(1) + parts = struct.unpack(">H", payload.read(2))[0] + partial = self.__partials.get(seq) + if partial is None or flags == 0: + partial = [] + self.__partials[seq] = partial + self.logger.debug( + "Handling packet, cmd: 0x{}, seq: {}, flags: {}, parts: {}".format( + util.bytes_to_hex(packet.cmd), seq, flags, parts)) + for _ in range(parts): + size = struct.unpack(">H", payload.read(2))[0] + buffer = payload.read(size) + partial.append(buffer) + self.__partials[seq] = partial + if flags != b"\x01": + return + self.__partials.pop(seq) + header = Mercury.Header() + header.ParseFromString(partial[0]) + response = MercuryClient.Response(header, partial) + if packet.is_cmd(Packet.Type.mercury_event): + dispatched = False + with self.__subscriptions_lock: + for sub in self.__subscriptions: + if sub.matches(header.uri): + sub.dispatch(response) + dispatched = True + if not dispatched: + self.logger.debug( + "Couldn't dispatch Mercury event seq: {}, uri: {}, code: {}, payload: {}" + .format(seq, header.uri, header.status_code, + response.payload)) + elif (packet.is_cmd(Packet.Type.mercury_req) + or packet.is_cmd(Packet.Type.mercury_sub) + or packet.is_cmd(Packet.Type.mercury_sub)): + callback = self.__callbacks.get(seq) + self.__callbacks.pop(seq) + if callback is not None: + callback.response(response) + else: + self.logger.warning( + "Skipped Mercury response, seq: {}, uri: {}, code: {}". + format(seq, response.uri, response.status_code)) + with self.__remove_callback_lock: + self.__remove_callback_lock.notify_all() + else: + self.logger.warning( + "Couldn't handle packet, seq: {}, uri: {}, code: {}".format( + seq, header.uri, header.status_code)) + + def interested_in(self, uri: str, listener: SubListener) -> None: + self.__subscriptions.append( + MercuryClient.InternalSubListener(uri, listener, False)) + + def not_interested_in(self, listener: SubListener) -> None: + try: + for subscription in self.__subscriptions: + if subscription.listener is listener: + self.__subscriptions.remove(subscription) + break + except ValueError: + pass + + def send(self, request: RawMercuryRequest, callback) -> int: + """ + Send the Mercury request + Args: + request: RawMercuryRequest + callback: Callback function + Returns: + MercuryClient.Response + """ + buffer = io.BytesIO() + seq: int + with self.__seq_holder_lock: + seq = self.__seq_holder + self.__seq_holder += 1 + self.logger.debug( + "Send Mercury request, seq: {}, uri: {}, method: {}".format( + seq, request.header.uri, request.header.method)) + buffer.write(struct.pack(">H", 4)) + buffer.write(struct.pack(">i", seq)) + buffer.write(b"\x01") + buffer.write(struct.pack(">H", 1 + len(request.payload))) + header_bytes = request.header.SerializeToString() + buffer.write(struct.pack(">H", len(header_bytes))) + buffer.write(header_bytes) + for part in request.payload: + buffer.write(struct.pack(">H", len(part))) + buffer.write(part) + buffer.seek(0) + cmd = Packet.Type.for_method(request.header.method) + self.__session.send(cmd, buffer.read()) + self.__callbacks[seq] = callback + return seq + + def send_sync(self, request: RawMercuryRequest) -> Response: + """ + Send the Mercury request + Args: + request: RawMercuryRequest + Returns: + MercuryClient.Response + """ + callback = MercuryClient.SyncCallback() + seq = self.send(request, callback) + try: + response = callback.wait_response() + if response is None: + raise IOError( + "Request timeout out, {} passed, yet no response. seq: {}". + format(self.mercury_request_timeout, seq)) + return response + except queue.Empty as e: + raise IOError(e) + + def send_sync_json(self, request: JsonMercuryRequest) -> typing.Any: + response = self.send_sync(request.request) + if 200 <= response.status_code < 300: + return json.loads(response.payload) + raise MercuryClient.MercuryException(response) + + def subscribe(self, uri: str, listener: SubListener) -> None: + """ + Subscribe URI + Args: + uri: + listener: + """ + response = self.send_sync(RawMercuryRequest.sub(uri)) + if response.status_code != 200: + raise RuntimeError(response) + if len(response.payload) > 0: + for payload in response.payload: + sub = Pubsub.Subscription() + sub.ParseFromString(payload) + self.__subscriptions.append( + MercuryClient.InternalSubListener(sub.uri, listener, True)) + else: + self.__subscriptions.append( + MercuryClient.InternalSubListener(uri, listener, True)) + self.logger.debug("Subscribed successfully to {}!".format(uri)) + + def unsubscribe(self, uri) -> None: + """ + Unsubscribe URI + Args: + uri: + """ + response = self.send_sync(RawMercuryRequest.unsub(uri)) + if response.status_code != 200: + raise RuntimeError(response) + for subscription in self.__subscriptions: + if subscription.matches(uri): + self.__subscriptions.remove(subscription) + break + self.logger.debug("Unsubscribed successfully from {}!".format(uri)) + + class Callback: + def response(self, response: MercuryClient.Response) -> None: + raise NotImplementedError + + class InternalSubListener: + uri: str + listener: SubListener + is_sub: bool + + def __init__(self, uri: str, listener: SubListener, is_sub: bool): + self.uri = uri + self.listener = listener + self.is_sub = is_sub + + def matches(self, uri: str) -> bool: + """ + Compare with the URI given + Args: + uri: URI to be compared + Returns: + bool + """ + return uri.startswith(self.uri) + + def dispatch(self, response: MercuryClient.Response) -> None: + """ + Dispatch the event response + Args: + response: Response generated by the event + """ + self.listener.event(response) + + class MercuryException(Exception): + code: int + + def __init__(self, response: MercuryClient.Response): + super().__init__("status: {}".format(response.status_code)) + self.code = response.status_code + + class PubSubException(MercuryException): + pass + + class Response: + uri: str + payload: bytes + status_code: int + + def __init__(self, header: Mercury.Header, payload: list[bytes]): + self.uri = header.uri + self.status_code = header.status_code + self.payload = b"".join(payload[1:]) + + class SyncCallback(Callback): + __reference = queue.Queue() + + def response(self, response: MercuryClient.Response) -> None: + """ + Set the response + :param response: + :return: + """ + self.__reference.put(response) + self.__reference.task_done() + + def wait_response(self) -> typing.Any: + return self.__reference.get( + timeout=MercuryClient.mercury_request_timeout) + + +class MercuryRequests: + keymaster_client_id = "65b708073fc0480ea92a077233ca87bd" + + @staticmethod + def get_root_playlists(username: str): + """ + @TODO implement function + """ + + @staticmethod + def request_token(device_id, scope): + return JsonMercuryRequest( + RawMercuryRequest.get( + "hm://keymaster/token/authenticated?scope={}&client_id={}&device_id={}" + .format(scope, MercuryRequests.keymaster_client_id, + device_id))) + + +class RawMercuryRequest: + header: Mercury.Header + payload: typing.List[bytes] + + def __init__(self, header: Mercury.Header, payload: typing.List[bytes]): + self.header = header + self.payload = payload + + @staticmethod + def sub(uri: str): + return RawMercuryRequest.new_builder().set_uri(uri).set_method( + "SUB").build() + + @staticmethod + def unsub(uri: str): + return RawMercuryRequest.new_builder().set_uri(uri).set_method( + "UNSUB").build() + + @staticmethod + def get(uri: str): + return RawMercuryRequest.new_builder().set_uri(uri).set_method( + "GET").build() + + @staticmethod + def send(uri: str, part: bytes): + return RawMercuryRequest.new_builder().set_uri(uri) \ + .add_payload_part(part).set_method("SEND").build() + + @staticmethod + def post(uri: str, part: bytes): + return RawMercuryRequest.new_builder().set_uri(uri) \ + .set_method("POST").add_payload_part(part).build() + + @staticmethod + def new_builder(): + return RawMercuryRequest.Builder() + + class Builder: + header_dict: dict + payload: typing.List[bytes] + + def __init__(self): + self.header_dict = {} + self.payload = [] + + def set_uri(self, uri: str): + self.header_dict["uri"] = uri + return self + + def set_content_type(self, content_type: str): + self.header_dict["content_type"] = content_type + return self + + def set_method(self, method: str): + self.header_dict["method"] = method + return self + + def add_user_field(self, + field: Mercury.UserField = None, + key: str = None, + value: str = None): + if field is None and (key is None or value is None): + return self + try: + self.header_dict["user_fields"] + except KeyError: + self.header_dict["user_fields"] = [] + if field is not None: + self.header_dict["user_fields"].append(field) + if key is not None and value is not None: + self.header_dict["user_fields"].append( + Mercury.UserField(key=key, value=value.encode())) + return self + + def add_payload_part(self, part: bytes): + self.payload.append(part) + return self + + def add_protobuf_payload(self, msg): + return self.add_payload_part(msg) + + def build(self): + return RawMercuryRequest(Mercury.Header(**self.header_dict), + self.payload) diff --git a/librespot/metadata.py b/librespot/metadata.py new file mode 100644 index 0000000..a5e01e9 --- /dev/null +++ b/librespot/metadata.py @@ -0,0 +1,283 @@ +from __future__ import annotations +from librespot import util +from librespot.proto.ContextTrack_pb2 import ContextTrack +from librespot.util import Base62 +import re + + +class SpotifyId: + STATIC_FROM_URI = "fromUri" + STATIC_FROM_BASE62 = "fromBase62" + STATIC_FROM_HEX = "fromHex" + + @staticmethod + def from_base62(base62: str): + raise NotImplementedError + + @staticmethod + def from_hex(hex_str: str): + raise NotImplementedError + + @staticmethod + def from_uri(uri: str): + raise NotImplementedError + + def to_spotify_uri(self) -> str: + raise NotImplementedError + + class SpotifyIdParsingException(Exception): + pass + + +class PlayableId: + base62 = Base62.create_instance_with_inverted_character_set() + + @staticmethod + def from_uri(uri: str) -> PlayableId: + if not PlayableId.is_supported(uri): + return UnsupportedId(uri) + if TrackId.pattern.search(uri) is not None: + return TrackId.from_uri(uri) + if EpisodeId.pattern.search(uri) is not None: + return EpisodeId.from_uri(uri) + raise TypeError("Unknown uri: {}".format(uri)) + + @staticmethod + def is_supported(uri: str): + return (not uri.startswith("spotify:local:") + and not uri == "spotify:delimiter" + and not uri == "spotify:meta:delimiter") + + @staticmethod + def should_play(track: ContextTrack): + return track.metadata_or_default + + def get_gid(self) -> bytes: + raise NotImplementedError + + def hex_id(self) -> str: + raise NotImplementedError + + def to_spotify_uri(self) -> str: + raise NotImplementedError + + +class PlaylistId(SpotifyId): + base62 = Base62.create_instance_with_inverted_character_set() + pattern = re.compile(r"spotify:playlist:(.{22})") + __id: str + + def __init__(self, _id: str): + self.__id = _id + + @staticmethod + def from_uri(uri: str) -> PlaylistId: + matcher = PlaylistId.pattern.search(uri) + if matcher is not None: + playlist_id = matcher.group(1) + return PlaylistId(playlist_id) + raise TypeError("Not a Spotify playlist ID: {}.".format(uri)) + + def id(self) -> str: + return self.__id + + def to_spotify_uri(self) -> str: + return "spotify:playlist:" + self.__id + + +class UnsupportedId(PlayableId): + uri: str + + def __init__(self, uri: str): + self.uri = uri + + def get_gid(self) -> bytes: + raise TypeError() + + def hex_id(self) -> str: + raise TypeError() + + def to_spotify_uri(self) -> str: + return self.uri + + +class AlbumId(SpotifyId): + base62 = Base62.create_instance_with_inverted_character_set() + pattern = re.compile(r"spotify:album:(.{22})") + __hex_id: str + + def __init__(self, hex_id: str): + self.__hex_id = hex_id.lower() + + @staticmethod + def from_uri(uri: str) -> AlbumId: + matcher = AlbumId.pattern.search(uri) + if matcher is not None: + album_id = matcher.group(1) + return AlbumId(util.bytes_to_hex(AlbumId.base62.decode(album_id.encode(), 16))) + raise TypeError("Not a Spotify album ID: {}.".format(uri)) + + @staticmethod + def from_base62(base62: str) -> AlbumId: + return AlbumId(util.bytes_to_hex(AlbumId.base62.decode(base62.encode(), 16))) + + @staticmethod + def from_hex(hex_str: str) -> AlbumId: + return AlbumId(hex_str) + + def to_mercury_uri(self) -> str: + return "hm://metadata/4/album/{}".format(self.__hex_id) + + def hex_id(self) -> str: + return self.__hex_id + + def to_spotify_uri(self) -> str: + return "spotify:album:{}".format( + AlbumId.base62.encode(util.hex_to_bytes(self.__hex_id)).decode()) + + +class ArtistId(SpotifyId): + base62 = Base62.create_instance_with_inverted_character_set() + pattern = re.compile("spotify:artist:(.{22})") + __hex_id: str + + def __init__(self, hex_id: str): + self.__hex_id = hex_id.lower() + + @staticmethod + def from_uri(uri: str) -> ArtistId: + matcher = ArtistId.pattern.search(uri) + if matcher is not None: + artist_id = matcher.group(1) + return ArtistId( + util.bytes_to_hex(ArtistId.base62.decode(artist_id.encode(), 16))) + raise TypeError("Not a Spotify artist ID: {}".format(uri)) + + @staticmethod + def from_base62(base62: str) -> ArtistId: + return ArtistId(util.bytes_to_hex(ArtistId.base62.decode(base62.encode(), 16))) + + @staticmethod + def from_hex(hex_str: str) -> ArtistId: + return ArtistId(hex_str) + + def to_mercury_uri(self) -> str: + return "hm://metadata/4/artist/{}".format(self.__hex_id) + + def to_spotify_uri(self) -> str: + return "spotify:artist:{}".format( + ArtistId.base62.encode(util.hex_to_bytes(self.__hex_id)).decode()) + + def hex_id(self) -> str: + return self.__hex_id + + +class EpisodeId(SpotifyId, PlayableId): + pattern = re.compile(r"spotify:episode:(.{22})") + __hex_id: str + + def __init__(self, hex_id: str): + self.__hex_id = hex_id.lower() + + @staticmethod + def from_uri(uri: str) -> EpisodeId: + matcher = EpisodeId.pattern.search(uri) + if matcher is not None: + episode_id = matcher.group(1) + return EpisodeId( + util.bytes_to_hex(PlayableId.base62.decode(episode_id.encode(), 16))) + raise TypeError("Not a Spotify episode ID: {}".format(uri)) + + @staticmethod + def from_base62(base62: str) -> EpisodeId: + return EpisodeId( + util.bytes_to_hex(PlayableId.base62.decode(base62.encode(), 16))) + + @staticmethod + def from_hex(hex_str: str) -> EpisodeId: + return EpisodeId(hex_str) + + def to_mercury_uri(self) -> str: + return "hm://metadata/4/episode/{}".format(self.__hex_id) + + def to_spotify_uri(self) -> str: + return "Spotify:episode:{}".format( + PlayableId.base62.encode(util.hex_to_bytes(self.__hex_id)).decode()) + + def hex_id(self) -> str: + return self.__hex_id + + def get_gid(self) -> bytes: + return util.hex_to_bytes(self.__hex_id) + + +class ShowId(SpotifyId): + base62 = Base62.create_instance_with_inverted_character_set() + pattern = re.compile("spotify:show:(.{22})") + __hex_id: str + + def __init__(self, hex_id: str): + self.__hex_id = hex_id + + @staticmethod + def from_uri(uri: str) -> ShowId: + matcher = ShowId.pattern.search(uri) + if matcher is not None: + show_id = matcher.group(1) + return ShowId(util.bytes_to_hex(ShowId.base62.decode(show_id.encode(), 16))) + raise TypeError("Not a Spotify show ID: {}".format(uri)) + + @staticmethod + def from_base62(base62: str) -> ShowId: + return ShowId(util.bytes_to_hex(ShowId.base62.decode(base62.encode(), 16))) + + @staticmethod + def from_hex(hex_str: str) -> ShowId: + return ShowId(hex_str) + + def to_mercury_uri(self) -> str: + return "hm://metadata/4/show/{}".format(self.__hex_id) + + def to_spotify_uri(self) -> str: + return "spotify:show:{}".format( + ShowId.base62.encode(util.hex_to_bytes(self.__hex_id)).decode()) + + def hex_id(self) -> str: + return self.__hex_id + + +class TrackId(PlayableId, SpotifyId): + pattern = re.compile("spotify:track:(.{22})") + __hex_id: str + + def __init__(self, hex_id: str): + self.__hex_id = hex_id.lower() + + @staticmethod + def from_uri(uri: str) -> TrackId: + search = TrackId.pattern.search(uri) + if search is not None: + track_id = search.group(1) + return TrackId( + util.bytes_to_hex(PlayableId.base62.decode(track_id.encode(), 16))) + raise RuntimeError("Not a Spotify track ID: {}".format(uri)) + + @staticmethod + def from_base62(base62: str) -> TrackId: + return TrackId(util.bytes_to_hex(PlayableId.base62.decode(base62.encode(), 16))) + + @staticmethod + def from_hex(hex_str: str) -> TrackId: + return TrackId(hex_str) + + def to_mercury_uri(self) -> str: + return "hm://metadata/4/track/{}".format(self.__hex_id) + + def to_spotify_uri(self) -> str: + return "spotify:track:{}".format(TrackId.base62.encode(util.hex_to_bytes(self.__hex_id)).decode()) + + def hex_id(self) -> str: + return self.__hex_id + + def get_gid(self) -> bytes: + return util.hex_to_bytes(self.__hex_id) diff --git a/librespot/proto/Authentication_pb2.py b/librespot/proto/Authentication_pb2.py new file mode 100644 index 0000000..b38baf1 --- /dev/null +++ b/librespot/proto/Authentication_pb2.py @@ -0,0 +1,1984 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: authentication.proto +"""Generated protocol buffer code.""" +from google.protobuf.internal import enum_type_wrapper +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + +DESCRIPTOR = _descriptor.FileDescriptor( + name='authentication.proto', + package='spotify', + syntax='proto2', + serialized_options=b'\n\013com.spotify', + create_key=_descriptor._internal_create_key, + serialized_pb= + b'\n\x14\x61uthentication.proto\x12\x07spotify\"\xa2\x03\n\x17\x43lientResponseEncrypted\x12\x34\n\x11login_credentials\x18\n \x02(\x0b\x32\x19.spotify.LoginCredentials\x12\x32\n\x10\x61\x63\x63ount_creation\x18\x14 \x01(\x0e\x32\x18.spotify.AccountCreation\x12?\n\x14\x66ingerprint_response\x18\x1e \x01(\x0b\x32!.spotify.FingerprintResponseUnion\x12-\n\x0bpeer_ticket\x18( \x01(\x0b\x32\x18.spotify.PeerTicketUnion\x12(\n\x0bsystem_info\x18\x32 \x02(\x0b\x32\x13.spotify.SystemInfo\x12\x16\n\x0eplatform_model\x18< \x01(\t\x12\x16\n\x0eversion_string\x18\x46 \x01(\t\x12)\n\x06\x61ppkey\x18P \x01(\x0b\x32\x19.spotify.LibspotifyAppKey\x12(\n\x0b\x63lient_info\x18Z \x01(\x0b\x32\x13.spotify.ClientInfo\"a\n\x10LoginCredentials\x12\x10\n\x08username\x18\n \x01(\t\x12(\n\x03typ\x18\x14 \x02(\x0e\x32\x1b.spotify.AuthenticationType\x12\x11\n\tauth_data\x18\x1e \x01(\x0c\"\x89\x01\n\x18\x46ingerprintResponseUnion\x12\x30\n\x05grain\x18\n \x01(\x0b\x32!.spotify.FingerprintGrainResponse\x12;\n\x0bhmac_ripemd\x18\x14 \x01(\x0b\x32&.spotify.FingerprintHmacRipemdResponse\"1\n\x18\x46ingerprintGrainResponse\x12\x15\n\rencrypted_key\x18\n \x02(\x0c\"-\n\x1d\x46ingerprintHmacRipemdResponse\x12\x0c\n\x04hmac\x18\n \x02(\x0c\"o\n\x0fPeerTicketUnion\x12\x30\n\npublic_key\x18\n \x01(\x0b\x32\x1c.spotify.PeerTicketPublicKey\x12*\n\nold_ticket\x18\x14 \x01(\x0b\x32\x16.spotify.PeerTicketOld\")\n\x13PeerTicketPublicKey\x12\x12\n\npublic_key\x18\n \x02(\x0c\"C\n\rPeerTicketOld\x12\x13\n\x0bpeer_ticket\x18\n \x02(\x0c\x12\x1d\n\x15peer_ticket_signature\x18\x14 \x02(\x0c\"\x81\x02\n\nSystemInfo\x12&\n\ncpu_family\x18\n \x02(\x0e\x32\x12.spotify.CpuFamily\x12\x13\n\x0b\x63pu_subtype\x18\x14 \x01(\r\x12\x0f\n\x07\x63pu_ext\x18\x1e \x01(\r\x12\x1d\n\x05\x62rand\x18( \x01(\x0e\x32\x0e.spotify.Brand\x12\x13\n\x0b\x62rand_flags\x18\x32 \x01(\r\x12\x17\n\x02os\x18< \x02(\x0e\x32\x0b.spotify.Os\x12\x12\n\nos_version\x18\x46 \x01(\r\x12\x0e\n\x06os_ext\x18P \x01(\r\x12!\n\x19system_information_string\x18Z \x01(\t\x12\x11\n\tdevice_id\x18\x64 \x01(\t\"p\n\x10LibspotifyAppKey\x12\x0f\n\x07version\x18\x01 \x02(\r\x12\x0e\n\x06\x64\x65vkey\x18\x02 \x02(\x0c\x12\x11\n\tsignature\x18\x03 \x02(\x0c\x12\x11\n\tuseragent\x18\x04 \x02(\t\x12\x15\n\rcallback_hash\x18\x05 \x02(\x0c\"X\n\nClientInfo\x12\x0f\n\x07limited\x18\x01 \x01(\x08\x12\'\n\x02\x66\x62\x18\x02 \x01(\x0b\x32\x1b.spotify.ClientInfoFacebook\x12\x10\n\x08language\x18\x03 \x01(\t\"(\n\x12\x43lientInfoFacebook\x12\x12\n\nmachine_id\x18\x01 \x01(\t\"\xe9\x02\n\tAPWelcome\x12\x1a\n\x12\x63\x61nonical_username\x18\n \x02(\t\x12\x34\n\x16\x61\x63\x63ount_type_logged_in\x18\x14 \x02(\x0e\x32\x14.spotify.AccountType\x12\x38\n\x1a\x63redentials_type_logged_in\x18\x19 \x02(\x0e\x32\x14.spotify.AccountType\x12\x43\n\x1ereusable_auth_credentials_type\x18\x1e \x02(\x0e\x32\x1b.spotify.AuthenticationType\x12!\n\x19reusable_auth_credentials\x18( \x02(\x0c\x12\x12\n\nlfs_secret\x18\x32 \x01(\x0c\x12*\n\x0c\x61\x63\x63ount_info\x18< \x01(\x0b\x32\x14.spotify.AccountInfo\x12(\n\x02\x66\x62\x18\x46 \x01(\x0b\x32\x1c.spotify.AccountInfoFacebook\"k\n\x0b\x41\x63\x63ountInfo\x12,\n\x07spotify\x18\x01 \x01(\x0b\x32\x1b.spotify.AccountInfoSpotify\x12.\n\x08\x66\x61\x63\x65\x62ook\x18\x02 \x01(\x0b\x32\x1c.spotify.AccountInfoFacebook\"\x14\n\x12\x41\x63\x63ountInfoSpotify\"?\n\x13\x41\x63\x63ountInfoFacebook\x12\x14\n\x0c\x61\x63\x63\x65ss_token\x18\x01 \x01(\t\x12\x12\n\nmachine_id\x18\x02 \x01(\t*\xd6\x01\n\x12\x41uthenticationType\x12\x1c\n\x18\x41UTHENTICATION_USER_PASS\x10\x00\x12-\n)AUTHENTICATION_STORED_SPOTIFY_CREDENTIALS\x10\x01\x12.\n*AUTHENTICATION_STORED_FACEBOOK_CREDENTIALS\x10\x02\x12 \n\x1c\x41UTHENTICATION_SPOTIFY_TOKEN\x10\x03\x12!\n\x1d\x41UTHENTICATION_FACEBOOK_TOKEN\x10\x04*Y\n\x0f\x41\x63\x63ountCreation\x12\"\n\x1e\x41\x43\x43OUNT_CREATION_ALWAYS_PROMPT\x10\x01\x12\"\n\x1e\x41\x43\x43OUNT_CREATION_ALWAYS_CREATE\x10\x03*\x9d\x01\n\tCpuFamily\x12\x0f\n\x0b\x43PU_UNKNOWN\x10\x00\x12\x0b\n\x07\x43PU_X86\x10\x01\x12\x0e\n\nCPU_X86_64\x10\x02\x12\x0b\n\x07\x43PU_PPC\x10\x03\x12\x0e\n\nCPU_PPC_64\x10\x04\x12\x0b\n\x07\x43PU_ARM\x10\x05\x12\x0c\n\x08\x43PU_IA64\x10\x06\x12\n\n\x06\x43PU_SH\x10\x07\x12\x0c\n\x08\x43PU_MIPS\x10\x08\x12\x10\n\x0c\x43PU_BLACKFIN\x10\t*K\n\x05\x42rand\x12\x13\n\x0f\x42RAND_UNBRANDED\x10\x00\x12\r\n\tBRAND_INQ\x10\x01\x12\r\n\tBRAND_HTC\x10\x02\x12\x0f\n\x0b\x42RAND_NOKIA\x10\x03*\xd1\x02\n\x02Os\x12\x0e\n\nOS_UNKNOWN\x10\x00\x12\x0e\n\nOS_WINDOWS\x10\x01\x12\n\n\x06OS_OSX\x10\x02\x12\r\n\tOS_IPHONE\x10\x03\x12\n\n\x06OS_S60\x10\x04\x12\x0c\n\x08OS_LINUX\x10\x05\x12\x11\n\rOS_WINDOWS_CE\x10\x06\x12\x0e\n\nOS_ANDROID\x10\x07\x12\x0b\n\x07OS_PALM\x10\x08\x12\x0e\n\nOS_FREEBSD\x10\t\x12\x11\n\rOS_BLACKBERRY\x10\n\x12\x0c\n\x08OS_SONOS\x10\x0b\x12\x0f\n\x0bOS_LOGITECH\x10\x0c\x12\n\n\x06OS_WP7\x10\r\x12\x0c\n\x08OS_ONKYO\x10\x0e\x12\x0e\n\nOS_PHILIPS\x10\x0f\x12\t\n\x05OS_WD\x10\x10\x12\x0c\n\x08OS_VOLVO\x10\x11\x12\x0b\n\x07OS_TIVO\x10\x12\x12\x0b\n\x07OS_AWOX\x10\x13\x12\x0c\n\x08OS_MEEGO\x10\x14\x12\r\n\tOS_QNXNTO\x10\x15\x12\n\n\x06OS_BCO\x10\x16*(\n\x0b\x41\x63\x63ountType\x12\x0b\n\x07Spotify\x10\x00\x12\x0c\n\x08\x46\x61\x63\x65\x62ook\x10\x01\x42\r\n\x0b\x63om.spotify' +) + +_AUTHENTICATIONTYPE = _descriptor.EnumDescriptor( + name='AuthenticationType', + full_name='spotify.AuthenticationType', + filename=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + values=[ + _descriptor.EnumValueDescriptor( + name='AUTHENTICATION_USER_PASS', + index=0, + number=0, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='AUTHENTICATION_STORED_SPOTIFY_CREDENTIALS', + index=1, + number=1, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='AUTHENTICATION_STORED_FACEBOOK_CREDENTIALS', + index=2, + number=2, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='AUTHENTICATION_SPOTIFY_TOKEN', + index=3, + number=3, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='AUTHENTICATION_FACEBOOK_TOKEN', + index=4, + number=4, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + ], + containing_type=None, + serialized_options=None, + serialized_start=2083, + serialized_end=2297, +) +_sym_db.RegisterEnumDescriptor(_AUTHENTICATIONTYPE) + +AuthenticationType = enum_type_wrapper.EnumTypeWrapper(_AUTHENTICATIONTYPE) +_ACCOUNTCREATION = _descriptor.EnumDescriptor( + name='AccountCreation', + full_name='spotify.AccountCreation', + filename=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + values=[ + _descriptor.EnumValueDescriptor( + name='ACCOUNT_CREATION_ALWAYS_PROMPT', + index=0, + number=1, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='ACCOUNT_CREATION_ALWAYS_CREATE', + index=1, + number=3, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + ], + containing_type=None, + serialized_options=None, + serialized_start=2299, + serialized_end=2388, +) +_sym_db.RegisterEnumDescriptor(_ACCOUNTCREATION) + +AccountCreation = enum_type_wrapper.EnumTypeWrapper(_ACCOUNTCREATION) +_CPUFAMILY = _descriptor.EnumDescriptor( + name='CpuFamily', + full_name='spotify.CpuFamily', + filename=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + values=[ + _descriptor.EnumValueDescriptor( + name='CPU_UNKNOWN', + index=0, + number=0, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='CPU_X86', + index=1, + number=1, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='CPU_X86_64', + index=2, + number=2, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='CPU_PPC', + index=3, + number=3, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='CPU_PPC_64', + index=4, + number=4, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='CPU_ARM', + index=5, + number=5, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='CPU_IA64', + index=6, + number=6, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='CPU_SH', + index=7, + number=7, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='CPU_MIPS', + index=8, + number=8, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='CPU_BLACKFIN', + index=9, + number=9, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + ], + containing_type=None, + serialized_options=None, + serialized_start=2391, + serialized_end=2548, +) +_sym_db.RegisterEnumDescriptor(_CPUFAMILY) + +CpuFamily = enum_type_wrapper.EnumTypeWrapper(_CPUFAMILY) +_BRAND = _descriptor.EnumDescriptor( + name='Brand', + full_name='spotify.Brand', + filename=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + values=[ + _descriptor.EnumValueDescriptor( + name='BRAND_UNBRANDED', + index=0, + number=0, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='BRAND_INQ', + index=1, + number=1, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='BRAND_HTC', + index=2, + number=2, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='BRAND_NOKIA', + index=3, + number=3, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + ], + containing_type=None, + serialized_options=None, + serialized_start=2550, + serialized_end=2625, +) +_sym_db.RegisterEnumDescriptor(_BRAND) + +Brand = enum_type_wrapper.EnumTypeWrapper(_BRAND) +_OS = _descriptor.EnumDescriptor( + name='Os', + full_name='spotify.Os', + filename=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + values=[ + _descriptor.EnumValueDescriptor( + name='OS_UNKNOWN', + index=0, + number=0, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='OS_WINDOWS', + index=1, + number=1, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='OS_OSX', + index=2, + number=2, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='OS_IPHONE', + index=3, + number=3, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='OS_S60', + index=4, + number=4, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='OS_LINUX', + index=5, + number=5, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='OS_WINDOWS_CE', + index=6, + number=6, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='OS_ANDROID', + index=7, + number=7, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='OS_PALM', + index=8, + number=8, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='OS_FREEBSD', + index=9, + number=9, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='OS_BLACKBERRY', + index=10, + number=10, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='OS_SONOS', + index=11, + number=11, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='OS_LOGITECH', + index=12, + number=12, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='OS_WP7', + index=13, + number=13, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='OS_ONKYO', + index=14, + number=14, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='OS_PHILIPS', + index=15, + number=15, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='OS_WD', + index=16, + number=16, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='OS_VOLVO', + index=17, + number=17, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='OS_TIVO', + index=18, + number=18, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='OS_AWOX', + index=19, + number=19, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='OS_MEEGO', + index=20, + number=20, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='OS_QNXNTO', + index=21, + number=21, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='OS_BCO', + index=22, + number=22, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + ], + containing_type=None, + serialized_options=None, + serialized_start=2628, + serialized_end=2965, +) +_sym_db.RegisterEnumDescriptor(_OS) + +Os = enum_type_wrapper.EnumTypeWrapper(_OS) +_ACCOUNTTYPE = _descriptor.EnumDescriptor( + name='AccountType', + full_name='spotify.AccountType', + filename=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + values=[ + _descriptor.EnumValueDescriptor( + name='Spotify', + index=0, + number=0, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='Facebook', + index=1, + number=1, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + ], + containing_type=None, + serialized_options=None, + serialized_start=2967, + serialized_end=3007, +) +_sym_db.RegisterEnumDescriptor(_ACCOUNTTYPE) + +AccountType = enum_type_wrapper.EnumTypeWrapper(_ACCOUNTTYPE) +AUTHENTICATION_USER_PASS = 0 +AUTHENTICATION_STORED_SPOTIFY_CREDENTIALS = 1 +AUTHENTICATION_STORED_FACEBOOK_CREDENTIALS = 2 +AUTHENTICATION_SPOTIFY_TOKEN = 3 +AUTHENTICATION_FACEBOOK_TOKEN = 4 +ACCOUNT_CREATION_ALWAYS_PROMPT = 1 +ACCOUNT_CREATION_ALWAYS_CREATE = 3 +CPU_UNKNOWN = 0 +CPU_X86 = 1 +CPU_X86_64 = 2 +CPU_PPC = 3 +CPU_PPC_64 = 4 +CPU_ARM = 5 +CPU_IA64 = 6 +CPU_SH = 7 +CPU_MIPS = 8 +CPU_BLACKFIN = 9 +BRAND_UNBRANDED = 0 +BRAND_INQ = 1 +BRAND_HTC = 2 +BRAND_NOKIA = 3 +OS_UNKNOWN = 0 +OS_WINDOWS = 1 +OS_OSX = 2 +OS_IPHONE = 3 +OS_S60 = 4 +OS_LINUX = 5 +OS_WINDOWS_CE = 6 +OS_ANDROID = 7 +OS_PALM = 8 +OS_FREEBSD = 9 +OS_BLACKBERRY = 10 +OS_SONOS = 11 +OS_LOGITECH = 12 +OS_WP7 = 13 +OS_ONKYO = 14 +OS_PHILIPS = 15 +OS_WD = 16 +OS_VOLVO = 17 +OS_TIVO = 18 +OS_AWOX = 19 +OS_MEEGO = 20 +OS_QNXNTO = 21 +OS_BCO = 22 +Spotify = 0 +Facebook = 1 + +_CLIENTRESPONSEENCRYPTED = _descriptor.Descriptor( + name='ClientResponseEncrypted', + full_name='spotify.ClientResponseEncrypted', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='login_credentials', + full_name='spotify.ClientResponseEncrypted.login_credentials', + index=0, + number=10, + type=11, + cpp_type=10, + label=2, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='account_creation', + full_name='spotify.ClientResponseEncrypted.account_creation', + index=1, + number=20, + type=14, + cpp_type=8, + label=1, + has_default_value=False, + default_value=1, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='fingerprint_response', + full_name='spotify.ClientResponseEncrypted.fingerprint_response', + index=2, + number=30, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='peer_ticket', + full_name='spotify.ClientResponseEncrypted.peer_ticket', + index=3, + number=40, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='system_info', + full_name='spotify.ClientResponseEncrypted.system_info', + index=4, + number=50, + type=11, + cpp_type=10, + label=2, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='platform_model', + full_name='spotify.ClientResponseEncrypted.platform_model', + index=5, + number=60, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode('utf-8'), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='version_string', + full_name='spotify.ClientResponseEncrypted.version_string', + index=6, + number=70, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode('utf-8'), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='appkey', + full_name='spotify.ClientResponseEncrypted.appkey', + index=7, + number=80, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='client_info', + full_name='spotify.ClientResponseEncrypted.client_info', + index=8, + number=90, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[], + serialized_start=34, + serialized_end=452, +) + +_LOGINCREDENTIALS = _descriptor.Descriptor( + name='LoginCredentials', + full_name='spotify.LoginCredentials', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='username', + full_name='spotify.LoginCredentials.username', + index=0, + number=10, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode('utf-8'), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='typ', + full_name='spotify.LoginCredentials.typ', + index=1, + number=20, + type=14, + cpp_type=8, + label=2, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='auth_data', + full_name='spotify.LoginCredentials.auth_data', + index=2, + number=30, + type=12, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"", + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[], + serialized_start=454, + serialized_end=551, +) + +_FINGERPRINTRESPONSEUNION = _descriptor.Descriptor( + name='FingerprintResponseUnion', + full_name='spotify.FingerprintResponseUnion', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='grain', + full_name='spotify.FingerprintResponseUnion.grain', + index=0, + number=10, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='hmac_ripemd', + full_name='spotify.FingerprintResponseUnion.hmac_ripemd', + index=1, + number=20, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[], + serialized_start=554, + serialized_end=691, +) + +_FINGERPRINTGRAINRESPONSE = _descriptor.Descriptor( + name='FingerprintGrainResponse', + full_name='spotify.FingerprintGrainResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='encrypted_key', + full_name='spotify.FingerprintGrainResponse.encrypted_key', + index=0, + number=10, + type=12, + cpp_type=9, + label=2, + has_default_value=False, + default_value=b"", + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[], + serialized_start=693, + serialized_end=742, +) + +_FINGERPRINTHMACRIPEMDRESPONSE = _descriptor.Descriptor( + name='FingerprintHmacRipemdResponse', + full_name='spotify.FingerprintHmacRipemdResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='hmac', + full_name='spotify.FingerprintHmacRipemdResponse.hmac', + index=0, + number=10, + type=12, + cpp_type=9, + label=2, + has_default_value=False, + default_value=b"", + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[], + serialized_start=744, + serialized_end=789, +) + +_PEERTICKETUNION = _descriptor.Descriptor( + name='PeerTicketUnion', + full_name='spotify.PeerTicketUnion', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='public_key', + full_name='spotify.PeerTicketUnion.public_key', + index=0, + number=10, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='old_ticket', + full_name='spotify.PeerTicketUnion.old_ticket', + index=1, + number=20, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[], + serialized_start=791, + serialized_end=902, +) + +_PEERTICKETPUBLICKEY = _descriptor.Descriptor( + name='PeerTicketPublicKey', + full_name='spotify.PeerTicketPublicKey', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='public_key', + full_name='spotify.PeerTicketPublicKey.public_key', + index=0, + number=10, + type=12, + cpp_type=9, + label=2, + has_default_value=False, + default_value=b"", + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[], + serialized_start=904, + serialized_end=945, +) + +_PEERTICKETOLD = _descriptor.Descriptor( + name='PeerTicketOld', + full_name='spotify.PeerTicketOld', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='peer_ticket', + full_name='spotify.PeerTicketOld.peer_ticket', + index=0, + number=10, + type=12, + cpp_type=9, + label=2, + has_default_value=False, + default_value=b"", + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='peer_ticket_signature', + full_name='spotify.PeerTicketOld.peer_ticket_signature', + index=1, + number=20, + type=12, + cpp_type=9, + label=2, + has_default_value=False, + default_value=b"", + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[], + serialized_start=947, + serialized_end=1014, +) + +_SYSTEMINFO = _descriptor.Descriptor( + name='SystemInfo', + full_name='spotify.SystemInfo', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='cpu_family', + full_name='spotify.SystemInfo.cpu_family', + index=0, + number=10, + type=14, + cpp_type=8, + label=2, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='cpu_subtype', + full_name='spotify.SystemInfo.cpu_subtype', + index=1, + number=20, + type=13, + cpp_type=3, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='cpu_ext', + full_name='spotify.SystemInfo.cpu_ext', + index=2, + number=30, + type=13, + cpp_type=3, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='brand', + full_name='spotify.SystemInfo.brand', + index=3, + number=40, + type=14, + cpp_type=8, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='brand_flags', + full_name='spotify.SystemInfo.brand_flags', + index=4, + number=50, + type=13, + cpp_type=3, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='os', + full_name='spotify.SystemInfo.os', + index=5, + number=60, + type=14, + cpp_type=8, + label=2, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='os_version', + full_name='spotify.SystemInfo.os_version', + index=6, + number=70, + type=13, + cpp_type=3, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='os_ext', + full_name='spotify.SystemInfo.os_ext', + index=7, + number=80, + type=13, + cpp_type=3, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='system_information_string', + full_name='spotify.SystemInfo.system_information_string', + index=8, + number=90, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode('utf-8'), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='device_id', + full_name='spotify.SystemInfo.device_id', + index=9, + number=100, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode('utf-8'), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[], + serialized_start=1017, + serialized_end=1274, +) + +_LIBSPOTIFYAPPKEY = _descriptor.Descriptor( + name='LibspotifyAppKey', + full_name='spotify.LibspotifyAppKey', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='version', + full_name='spotify.LibspotifyAppKey.version', + index=0, + number=1, + type=13, + cpp_type=3, + label=2, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='devkey', + full_name='spotify.LibspotifyAppKey.devkey', + index=1, + number=2, + type=12, + cpp_type=9, + label=2, + has_default_value=False, + default_value=b"", + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='signature', + full_name='spotify.LibspotifyAppKey.signature', + index=2, + number=3, + type=12, + cpp_type=9, + label=2, + has_default_value=False, + default_value=b"", + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='useragent', + full_name='spotify.LibspotifyAppKey.useragent', + index=3, + number=4, + type=9, + cpp_type=9, + label=2, + has_default_value=False, + default_value=b"".decode('utf-8'), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='callback_hash', + full_name='spotify.LibspotifyAppKey.callback_hash', + index=4, + number=5, + type=12, + cpp_type=9, + label=2, + has_default_value=False, + default_value=b"", + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[], + serialized_start=1276, + serialized_end=1388, +) + +_CLIENTINFO = _descriptor.Descriptor( + name='ClientInfo', + full_name='spotify.ClientInfo', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='limited', + full_name='spotify.ClientInfo.limited', + index=0, + number=1, + type=8, + cpp_type=7, + label=1, + has_default_value=False, + default_value=False, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='fb', + full_name='spotify.ClientInfo.fb', + index=1, + number=2, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='language', + full_name='spotify.ClientInfo.language', + index=2, + number=3, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode('utf-8'), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[], + serialized_start=1390, + serialized_end=1478, +) + +_CLIENTINFOFACEBOOK = _descriptor.Descriptor( + name='ClientInfoFacebook', + full_name='spotify.ClientInfoFacebook', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='machine_id', + full_name='spotify.ClientInfoFacebook.machine_id', + index=0, + number=1, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode('utf-8'), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[], + serialized_start=1480, + serialized_end=1520, +) + +_APWELCOME = _descriptor.Descriptor( + name='APWelcome', + full_name='spotify.APWelcome', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='canonical_username', + full_name='spotify.APWelcome.canonical_username', + index=0, + number=10, + type=9, + cpp_type=9, + label=2, + has_default_value=False, + default_value=b"".decode('utf-8'), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='account_type_logged_in', + full_name='spotify.APWelcome.account_type_logged_in', + index=1, + number=20, + type=14, + cpp_type=8, + label=2, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='credentials_type_logged_in', + full_name='spotify.APWelcome.credentials_type_logged_in', + index=2, + number=25, + type=14, + cpp_type=8, + label=2, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='reusable_auth_credentials_type', + full_name='spotify.APWelcome.reusable_auth_credentials_type', + index=3, + number=30, + type=14, + cpp_type=8, + label=2, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='reusable_auth_credentials', + full_name='spotify.APWelcome.reusable_auth_credentials', + index=4, + number=40, + type=12, + cpp_type=9, + label=2, + has_default_value=False, + default_value=b"", + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='lfs_secret', + full_name='spotify.APWelcome.lfs_secret', + index=5, + number=50, + type=12, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"", + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='account_info', + full_name='spotify.APWelcome.account_info', + index=6, + number=60, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='fb', + full_name='spotify.APWelcome.fb', + index=7, + number=70, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[], + serialized_start=1523, + serialized_end=1884, +) + +_ACCOUNTINFO = _descriptor.Descriptor( + name='AccountInfo', + full_name='spotify.AccountInfo', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='spotify', + full_name='spotify.AccountInfo.spotify', + index=0, + number=1, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='facebook', + full_name='spotify.AccountInfo.facebook', + index=1, + number=2, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[], + serialized_start=1886, + serialized_end=1993, +) + +_ACCOUNTINFOSPOTIFY = _descriptor.Descriptor( + name='AccountInfoSpotify', + full_name='spotify.AccountInfoSpotify', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[], + serialized_start=1995, + serialized_end=2015, +) + +_ACCOUNTINFOFACEBOOK = _descriptor.Descriptor( + name='AccountInfoFacebook', + full_name='spotify.AccountInfoFacebook', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='access_token', + full_name='spotify.AccountInfoFacebook.access_token', + index=0, + number=1, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode('utf-8'), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='machine_id', + full_name='spotify.AccountInfoFacebook.machine_id', + index=1, + number=2, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode('utf-8'), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[], + serialized_start=2017, + serialized_end=2080, +) + +_CLIENTRESPONSEENCRYPTED.fields_by_name[ + 'login_credentials'].message_type = _LOGINCREDENTIALS +_CLIENTRESPONSEENCRYPTED.fields_by_name[ + 'account_creation'].enum_type = _ACCOUNTCREATION +_CLIENTRESPONSEENCRYPTED.fields_by_name[ + 'fingerprint_response'].message_type = _FINGERPRINTRESPONSEUNION +_CLIENTRESPONSEENCRYPTED.fields_by_name[ + 'peer_ticket'].message_type = _PEERTICKETUNION +_CLIENTRESPONSEENCRYPTED.fields_by_name[ + 'system_info'].message_type = _SYSTEMINFO +_CLIENTRESPONSEENCRYPTED.fields_by_name[ + 'appkey'].message_type = _LIBSPOTIFYAPPKEY +_CLIENTRESPONSEENCRYPTED.fields_by_name[ + 'client_info'].message_type = _CLIENTINFO +_LOGINCREDENTIALS.fields_by_name['typ'].enum_type = _AUTHENTICATIONTYPE +_FINGERPRINTRESPONSEUNION.fields_by_name[ + 'grain'].message_type = _FINGERPRINTGRAINRESPONSE +_FINGERPRINTRESPONSEUNION.fields_by_name[ + 'hmac_ripemd'].message_type = _FINGERPRINTHMACRIPEMDRESPONSE +_PEERTICKETUNION.fields_by_name[ + 'public_key'].message_type = _PEERTICKETPUBLICKEY +_PEERTICKETUNION.fields_by_name['old_ticket'].message_type = _PEERTICKETOLD +_SYSTEMINFO.fields_by_name['cpu_family'].enum_type = _CPUFAMILY +_SYSTEMINFO.fields_by_name['brand'].enum_type = _BRAND +_SYSTEMINFO.fields_by_name['os'].enum_type = _OS +_CLIENTINFO.fields_by_name['fb'].message_type = _CLIENTINFOFACEBOOK +_APWELCOME.fields_by_name['account_type_logged_in'].enum_type = _ACCOUNTTYPE +_APWELCOME.fields_by_name[ + 'credentials_type_logged_in'].enum_type = _ACCOUNTTYPE +_APWELCOME.fields_by_name[ + 'reusable_auth_credentials_type'].enum_type = _AUTHENTICATIONTYPE +_APWELCOME.fields_by_name['account_info'].message_type = _ACCOUNTINFO +_APWELCOME.fields_by_name['fb'].message_type = _ACCOUNTINFOFACEBOOK +_ACCOUNTINFO.fields_by_name['spotify'].message_type = _ACCOUNTINFOSPOTIFY +_ACCOUNTINFO.fields_by_name['facebook'].message_type = _ACCOUNTINFOFACEBOOK +DESCRIPTOR.message_types_by_name[ + 'ClientResponseEncrypted'] = _CLIENTRESPONSEENCRYPTED +DESCRIPTOR.message_types_by_name['LoginCredentials'] = _LOGINCREDENTIALS +DESCRIPTOR.message_types_by_name[ + 'FingerprintResponseUnion'] = _FINGERPRINTRESPONSEUNION +DESCRIPTOR.message_types_by_name[ + 'FingerprintGrainResponse'] = _FINGERPRINTGRAINRESPONSE +DESCRIPTOR.message_types_by_name[ + 'FingerprintHmacRipemdResponse'] = _FINGERPRINTHMACRIPEMDRESPONSE +DESCRIPTOR.message_types_by_name['PeerTicketUnion'] = _PEERTICKETUNION +DESCRIPTOR.message_types_by_name['PeerTicketPublicKey'] = _PEERTICKETPUBLICKEY +DESCRIPTOR.message_types_by_name['PeerTicketOld'] = _PEERTICKETOLD +DESCRIPTOR.message_types_by_name['SystemInfo'] = _SYSTEMINFO +DESCRIPTOR.message_types_by_name['LibspotifyAppKey'] = _LIBSPOTIFYAPPKEY +DESCRIPTOR.message_types_by_name['ClientInfo'] = _CLIENTINFO +DESCRIPTOR.message_types_by_name['ClientInfoFacebook'] = _CLIENTINFOFACEBOOK +DESCRIPTOR.message_types_by_name['APWelcome'] = _APWELCOME +DESCRIPTOR.message_types_by_name['AccountInfo'] = _ACCOUNTINFO +DESCRIPTOR.message_types_by_name['AccountInfoSpotify'] = _ACCOUNTINFOSPOTIFY +DESCRIPTOR.message_types_by_name['AccountInfoFacebook'] = _ACCOUNTINFOFACEBOOK +DESCRIPTOR.enum_types_by_name['AuthenticationType'] = _AUTHENTICATIONTYPE +DESCRIPTOR.enum_types_by_name['AccountCreation'] = _ACCOUNTCREATION +DESCRIPTOR.enum_types_by_name['CpuFamily'] = _CPUFAMILY +DESCRIPTOR.enum_types_by_name['Brand'] = _BRAND +DESCRIPTOR.enum_types_by_name['Os'] = _OS +DESCRIPTOR.enum_types_by_name['AccountType'] = _ACCOUNTTYPE +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +ClientResponseEncrypted = _reflection.GeneratedProtocolMessageType( + 'ClientResponseEncrypted', + (_message.Message, ), + { + 'DESCRIPTOR': _CLIENTRESPONSEENCRYPTED, + '__module__': 'authentication_pb2' + # @@protoc_insertion_point(class_scope:spotify.ClientResponseEncrypted) + }) +_sym_db.RegisterMessage(ClientResponseEncrypted) + +LoginCredentials = _reflection.GeneratedProtocolMessageType( + 'LoginCredentials', + (_message.Message, ), + { + 'DESCRIPTOR': _LOGINCREDENTIALS, + '__module__': 'authentication_pb2' + # @@protoc_insertion_point(class_scope:spotify.LoginCredentials) + }) +_sym_db.RegisterMessage(LoginCredentials) + +FingerprintResponseUnion = _reflection.GeneratedProtocolMessageType( + 'FingerprintResponseUnion', + (_message.Message, ), + { + 'DESCRIPTOR': _FINGERPRINTRESPONSEUNION, + '__module__': 'authentication_pb2' + # @@protoc_insertion_point(class_scope:spotify.FingerprintResponseUnion) + }) +_sym_db.RegisterMessage(FingerprintResponseUnion) + +FingerprintGrainResponse = _reflection.GeneratedProtocolMessageType( + 'FingerprintGrainResponse', + (_message.Message, ), + { + 'DESCRIPTOR': _FINGERPRINTGRAINRESPONSE, + '__module__': 'authentication_pb2' + # @@protoc_insertion_point(class_scope:spotify.FingerprintGrainResponse) + }) +_sym_db.RegisterMessage(FingerprintGrainResponse) + +FingerprintHmacRipemdResponse = _reflection.GeneratedProtocolMessageType( + 'FingerprintHmacRipemdResponse', + (_message.Message, ), + { + 'DESCRIPTOR': _FINGERPRINTHMACRIPEMDRESPONSE, + '__module__': 'authentication_pb2' + # @@protoc_insertion_point(class_scope:spotify.FingerprintHmacRipemdResponse) + }) +_sym_db.RegisterMessage(FingerprintHmacRipemdResponse) + +PeerTicketUnion = _reflection.GeneratedProtocolMessageType( + 'PeerTicketUnion', + (_message.Message, ), + { + 'DESCRIPTOR': _PEERTICKETUNION, + '__module__': 'authentication_pb2' + # @@protoc_insertion_point(class_scope:spotify.PeerTicketUnion) + }) +_sym_db.RegisterMessage(PeerTicketUnion) + +PeerTicketPublicKey = _reflection.GeneratedProtocolMessageType( + 'PeerTicketPublicKey', + (_message.Message, ), + { + 'DESCRIPTOR': _PEERTICKETPUBLICKEY, + '__module__': 'authentication_pb2' + # @@protoc_insertion_point(class_scope:spotify.PeerTicketPublicKey) + }) +_sym_db.RegisterMessage(PeerTicketPublicKey) + +PeerTicketOld = _reflection.GeneratedProtocolMessageType( + 'PeerTicketOld', + (_message.Message, ), + { + 'DESCRIPTOR': _PEERTICKETOLD, + '__module__': 'authentication_pb2' + # @@protoc_insertion_point(class_scope:spotify.PeerTicketOld) + }) +_sym_db.RegisterMessage(PeerTicketOld) + +SystemInfo = _reflection.GeneratedProtocolMessageType( + 'SystemInfo', + (_message.Message, ), + { + 'DESCRIPTOR': _SYSTEMINFO, + '__module__': 'authentication_pb2' + # @@protoc_insertion_point(class_scope:spotify.SystemInfo) + }) +_sym_db.RegisterMessage(SystemInfo) + +LibspotifyAppKey = _reflection.GeneratedProtocolMessageType( + 'LibspotifyAppKey', + (_message.Message, ), + { + 'DESCRIPTOR': _LIBSPOTIFYAPPKEY, + '__module__': 'authentication_pb2' + # @@protoc_insertion_point(class_scope:spotify.LibspotifyAppKey) + }) +_sym_db.RegisterMessage(LibspotifyAppKey) + +ClientInfo = _reflection.GeneratedProtocolMessageType( + 'ClientInfo', + (_message.Message, ), + { + 'DESCRIPTOR': _CLIENTINFO, + '__module__': 'authentication_pb2' + # @@protoc_insertion_point(class_scope:spotify.ClientInfo) + }) +_sym_db.RegisterMessage(ClientInfo) + +ClientInfoFacebook = _reflection.GeneratedProtocolMessageType( + 'ClientInfoFacebook', + (_message.Message, ), + { + 'DESCRIPTOR': _CLIENTINFOFACEBOOK, + '__module__': 'authentication_pb2' + # @@protoc_insertion_point(class_scope:spotify.ClientInfoFacebook) + }) +_sym_db.RegisterMessage(ClientInfoFacebook) + +APWelcome = _reflection.GeneratedProtocolMessageType( + 'APWelcome', + (_message.Message, ), + { + 'DESCRIPTOR': _APWELCOME, + '__module__': 'authentication_pb2' + # @@protoc_insertion_point(class_scope:spotify.APWelcome) + }) +_sym_db.RegisterMessage(APWelcome) + +AccountInfo = _reflection.GeneratedProtocolMessageType( + 'AccountInfo', + (_message.Message, ), + { + 'DESCRIPTOR': _ACCOUNTINFO, + '__module__': 'authentication_pb2' + # @@protoc_insertion_point(class_scope:spotify.AccountInfo) + }) +_sym_db.RegisterMessage(AccountInfo) + +AccountInfoSpotify = _reflection.GeneratedProtocolMessageType( + 'AccountInfoSpotify', + (_message.Message, ), + { + 'DESCRIPTOR': _ACCOUNTINFOSPOTIFY, + '__module__': 'authentication_pb2' + # @@protoc_insertion_point(class_scope:spotify.AccountInfoSpotify) + }) +_sym_db.RegisterMessage(AccountInfoSpotify) + +AccountInfoFacebook = _reflection.GeneratedProtocolMessageType( + 'AccountInfoFacebook', + (_message.Message, ), + { + 'DESCRIPTOR': _ACCOUNTINFOFACEBOOK, + '__module__': 'authentication_pb2' + # @@protoc_insertion_point(class_scope:spotify.AccountInfoFacebook) + }) +_sym_db.RegisterMessage(AccountInfoFacebook) + +DESCRIPTOR._options = None +# @@protoc_insertion_point(module_scope) diff --git a/librespot/proto/CanvazMeta_pb2.py b/librespot/proto/CanvazMeta_pb2.py new file mode 100644 index 0000000..3b769fc --- /dev/null +++ b/librespot/proto/CanvazMeta_pb2.py @@ -0,0 +1,91 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: canvaz-meta.proto +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import enum_type_wrapper + +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + +DESCRIPTOR = _descriptor.FileDescriptor( + name="canvaz-meta.proto", + package="com.spotify.canvaz", + syntax="proto3", + serialized_options=b"\n\022com.spotify.canvazH\002", + create_key=_descriptor._internal_create_key, + serialized_pb= + b"\n\x11\x63\x61nvaz-meta.proto\x12\x12\x63om.spotify.canvaz*R\n\x04Type\x12\t\n\x05IMAGE\x10\x00\x12\t\n\x05VIDEO\x10\x01\x12\x11\n\rVIDEO_LOOPING\x10\x02\x12\x18\n\x14VIDEO_LOOPING_RANDOM\x10\x03\x12\x07\n\x03GIF\x10\x04\x42\x16\n\x12\x63om.spotify.canvazH\x02\x62\x06proto3", +) + +_TYPE = _descriptor.EnumDescriptor( + name="Type", + full_name="com.spotify.canvaz.Type", + filename=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + values=[ + _descriptor.EnumValueDescriptor( + name="IMAGE", + index=0, + number=0, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key, + ), + _descriptor.EnumValueDescriptor( + name="VIDEO", + index=1, + number=1, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key, + ), + _descriptor.EnumValueDescriptor( + name="VIDEO_LOOPING", + index=2, + number=2, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key, + ), + _descriptor.EnumValueDescriptor( + name="VIDEO_LOOPING_RANDOM", + index=3, + number=3, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key, + ), + _descriptor.EnumValueDescriptor( + name="GIF", + index=4, + number=4, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key, + ), + ], + containing_type=None, + serialized_options=None, + serialized_start=41, + serialized_end=123, +) +_sym_db.RegisterEnumDescriptor(_TYPE) + +Type = enum_type_wrapper.EnumTypeWrapper(_TYPE) +IMAGE = 0 +VIDEO = 1 +VIDEO_LOOPING = 2 +VIDEO_LOOPING_RANDOM = 3 +GIF = 4 + +DESCRIPTOR.enum_types_by_name["Type"] = _TYPE +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +DESCRIPTOR._options = None +# @@protoc_insertion_point(module_scope) diff --git a/librespot/proto/Canvaz_pb2.py b/librespot/proto/Canvaz_pb2.py new file mode 100644 index 0000000..07f31b4 --- /dev/null +++ b/librespot/proto/Canvaz_pb2.py @@ -0,0 +1,564 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: canvaz.proto +"""Generated protocol buffer code.""" +import CanvazMeta_pb2 as canvaz__meta__pb2 +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database + +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + +DESCRIPTOR = _descriptor.FileDescriptor( + name="canvaz.proto", + package="com.spotify.canvazcache", + syntax="proto3", + serialized_options=b"\n\022com.spotify.canvazH\002", + create_key=_descriptor._internal_create_key, + serialized_pb= + b'\n\x0c\x63\x61nvaz.proto\x12\x17\x63om.spotify.canvazcache\x1a\x11\x63\x61nvaz-meta.proto"3\n\x06\x41rtist\x12\x0b\n\x03uri\x18\x01 \x01(\t\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x0e\n\x06\x61vatar\x18\x03 \x01(\t"\xe1\x02\n\x14\x45ntityCanvazResponse\x12\x46\n\x08\x63\x61nvases\x18\x01 \x03(\x0b\x32\x34.com.spotify.canvazcache.EntityCanvazResponse.Canvaz\x12\x16\n\x0ettl_in_seconds\x18\x02 \x01(\x03\x1a\xe8\x01\n\x06\x43\x61nvaz\x12\n\n\x02id\x18\x01 \x01(\t\x12\x0b\n\x03url\x18\x02 \x01(\t\x12\x0f\n\x07\x66ile_id\x18\x03 \x01(\t\x12&\n\x04type\x18\x04 \x01(\x0e\x32\x18.com.spotify.canvaz.Type\x12\x12\n\nentity_uri\x18\x05 \x01(\t\x12/\n\x06\x61rtist\x18\x06 \x01(\x0b\x32\x1f.com.spotify.canvazcache.Artist\x12\x10\n\x08\x65xplicit\x18\x07 \x01(\x08\x12\x13\n\x0buploaded_by\x18\x08 \x01(\t\x12\x0c\n\x04\x65tag\x18\t \x01(\t\x12\x12\n\ncanvas_uri\x18\x0b \x01(\t"\x88\x01\n\x13\x45ntityCanvazRequest\x12\x45\n\x08\x65ntities\x18\x01 \x03(\x0b\x32\x33.com.spotify.canvazcache.EntityCanvazRequest.Entity\x1a*\n\x06\x45ntity\x12\x12\n\nentity_uri\x18\x01 \x01(\t\x12\x0c\n\x04\x65tag\x18\x02 \x01(\tB\x16\n\x12\x63om.spotify.canvazH\x02\x62\x06proto3', + dependencies=[ + canvaz__meta__pb2.DESCRIPTOR, + ], +) + +_ARTIST = _descriptor.Descriptor( + name="Artist", + full_name="com.spotify.canvazcache.Artist", + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name="uri", + full_name="com.spotify.canvazcache.Artist.uri", + index=0, + number=1, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="name", + full_name="com.spotify.canvazcache.Artist.name", + index=1, + number=2, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="avatar", + full_name="com.spotify.canvazcache.Artist.avatar", + index=2, + number=3, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax="proto3", + extension_ranges=[], + oneofs=[], + serialized_start=60, + serialized_end=111, +) + +_ENTITYCANVAZRESPONSE_CANVAZ = _descriptor.Descriptor( + name="Canvaz", + full_name="com.spotify.canvazcache.EntityCanvazResponse.Canvaz", + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name="id", + full_name="com.spotify.canvazcache.EntityCanvazResponse.Canvaz.id", + index=0, + number=1, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="url", + full_name="com.spotify.canvazcache.EntityCanvazResponse.Canvaz.url", + index=1, + number=2, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="file_id", + full_name= + "com.spotify.canvazcache.EntityCanvazResponse.Canvaz.file_id", + index=2, + number=3, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="type", + full_name= + "com.spotify.canvazcache.EntityCanvazResponse.Canvaz.type", + index=3, + number=4, + type=14, + cpp_type=8, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="entity_uri", + full_name= + "com.spotify.canvazcache.EntityCanvazResponse.Canvaz.entity_uri", + index=4, + number=5, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="artist", + full_name= + "com.spotify.canvazcache.EntityCanvazResponse.Canvaz.artist", + index=5, + number=6, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="explicit", + full_name= + "com.spotify.canvazcache.EntityCanvazResponse.Canvaz.explicit", + index=6, + number=7, + type=8, + cpp_type=7, + label=1, + has_default_value=False, + default_value=False, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="uploaded_by", + full_name= + "com.spotify.canvazcache.EntityCanvazResponse.Canvaz.uploaded_by", + index=7, + number=8, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="etag", + full_name= + "com.spotify.canvazcache.EntityCanvazResponse.Canvaz.etag", + index=8, + number=9, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="canvas_uri", + full_name= + "com.spotify.canvazcache.EntityCanvazResponse.Canvaz.canvas_uri", + index=9, + number=11, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax="proto3", + extension_ranges=[], + oneofs=[], + serialized_start=235, + serialized_end=467, +) + +_ENTITYCANVAZRESPONSE = _descriptor.Descriptor( + name="EntityCanvazResponse", + full_name="com.spotify.canvazcache.EntityCanvazResponse", + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name="canvases", + full_name="com.spotify.canvazcache.EntityCanvazResponse.canvases", + index=0, + number=1, + type=11, + cpp_type=10, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="ttl_in_seconds", + full_name= + "com.spotify.canvazcache.EntityCanvazResponse.ttl_in_seconds", + index=1, + number=2, + type=3, + cpp_type=2, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + ], + extensions=[], + nested_types=[ + _ENTITYCANVAZRESPONSE_CANVAZ, + ], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax="proto3", + extension_ranges=[], + oneofs=[], + serialized_start=114, + serialized_end=467, +) + +_ENTITYCANVAZREQUEST_ENTITY = _descriptor.Descriptor( + name="Entity", + full_name="com.spotify.canvazcache.EntityCanvazRequest.Entity", + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name="entity_uri", + full_name= + "com.spotify.canvazcache.EntityCanvazRequest.Entity.entity_uri", + index=0, + number=1, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="etag", + full_name="com.spotify.canvazcache.EntityCanvazRequest.Entity.etag", + index=1, + number=2, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax="proto3", + extension_ranges=[], + oneofs=[], + serialized_start=564, + serialized_end=606, +) + +_ENTITYCANVAZREQUEST = _descriptor.Descriptor( + name="EntityCanvazRequest", + full_name="com.spotify.canvazcache.EntityCanvazRequest", + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name="entities", + full_name="com.spotify.canvazcache.EntityCanvazRequest.entities", + index=0, + number=1, + type=11, + cpp_type=10, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + ], + extensions=[], + nested_types=[ + _ENTITYCANVAZREQUEST_ENTITY, + ], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax="proto3", + extension_ranges=[], + oneofs=[], + serialized_start=470, + serialized_end=606, +) + +_ENTITYCANVAZRESPONSE_CANVAZ.fields_by_name[ + "type"].enum_type = canvaz__meta__pb2._TYPE +_ENTITYCANVAZRESPONSE_CANVAZ.fields_by_name["artist"].message_type = _ARTIST +_ENTITYCANVAZRESPONSE_CANVAZ.containing_type = _ENTITYCANVAZRESPONSE +_ENTITYCANVAZRESPONSE.fields_by_name[ + "canvases"].message_type = _ENTITYCANVAZRESPONSE_CANVAZ +_ENTITYCANVAZREQUEST_ENTITY.containing_type = _ENTITYCANVAZREQUEST +_ENTITYCANVAZREQUEST.fields_by_name[ + "entities"].message_type = _ENTITYCANVAZREQUEST_ENTITY +DESCRIPTOR.message_types_by_name["Artist"] = _ARTIST +DESCRIPTOR.message_types_by_name[ + "EntityCanvazResponse"] = _ENTITYCANVAZRESPONSE +DESCRIPTOR.message_types_by_name["EntityCanvazRequest"] = _ENTITYCANVAZREQUEST +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +Artist = _reflection.GeneratedProtocolMessageType( + "Artist", + (_message.Message, ), + { + "DESCRIPTOR": _ARTIST, + "__module__": "canvaz_pb2" + # @@protoc_insertion_point(class_scope:com.spotify.canvazcache.Artist) + }, +) +_sym_db.RegisterMessage(Artist) + +EntityCanvazResponse = _reflection.GeneratedProtocolMessageType( + "EntityCanvazResponse", + (_message.Message, ), + { + "Canvaz": + _reflection.GeneratedProtocolMessageType( + "Canvaz", + (_message.Message, ), + { + "DESCRIPTOR": _ENTITYCANVAZRESPONSE_CANVAZ, + "__module__": "canvaz_pb2" + # @@protoc_insertion_point(class_scope:com.spotify.canvazcache.EntityCanvazResponse.Canvaz) + }, + ), + "DESCRIPTOR": + _ENTITYCANVAZRESPONSE, + "__module__": + "canvaz_pb2" + # @@protoc_insertion_point(class_scope:com.spotify.canvazcache.EntityCanvazResponse) + }, +) +_sym_db.RegisterMessage(EntityCanvazResponse) +_sym_db.RegisterMessage(EntityCanvazResponse.Canvaz) + +EntityCanvazRequest = _reflection.GeneratedProtocolMessageType( + "EntityCanvazRequest", + (_message.Message, ), + { + "Entity": + _reflection.GeneratedProtocolMessageType( + "Entity", + (_message.Message, ), + { + "DESCRIPTOR": _ENTITYCANVAZREQUEST_ENTITY, + "__module__": "canvaz_pb2" + # @@protoc_insertion_point(class_scope:com.spotify.canvazcache.EntityCanvazRequest.Entity) + }, + ), + "DESCRIPTOR": + _ENTITYCANVAZREQUEST, + "__module__": + "canvaz_pb2" + # @@protoc_insertion_point(class_scope:com.spotify.canvazcache.EntityCanvazRequest) + }, +) +_sym_db.RegisterMessage(EntityCanvazRequest) +_sym_db.RegisterMessage(EntityCanvazRequest.Entity) + +DESCRIPTOR._options = None +# @@protoc_insertion_point(module_scope) diff --git a/librespot/proto/ClientToken_pb2.py b/librespot/proto/ClientToken_pb2.py new file mode 100644 index 0000000..2b7e954 --- /dev/null +++ b/librespot/proto/ClientToken_pb2.py @@ -0,0 +1,63 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: client_token.proto +"""Generated protocol buffer code.""" +from google.protobuf.internal import builder as _builder +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import symbol_database as _symbol_database +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + +from librespot.proto import Connectivity_pb2 as connectivity__pb2 + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x12\x63lient_token.proto\x12\x1bspotify.clienttoken.http.v0\x1a\x12\x63onnectivity.proto\"\x84\x02\n\x12\x43lientTokenRequest\x12I\n\x0crequest_type\x18\x01 \x01(\x0e\x32\x33.spotify.clienttoken.http.v0.ClientTokenRequestType\x12\x45\n\x0b\x63lient_data\x18\x02 \x01(\x0b\x32..spotify.clienttoken.http.v0.ClientDataRequestH\x00\x12Q\n\x11\x63hallenge_answers\x18\x03 \x01(\x0b\x32\x34.spotify.clienttoken.http.v0.ChallengeAnswersRequestH\x00\x42\t\n\x07request\"\x99\x01\n\x11\x43lientDataRequest\x12\x16\n\x0e\x63lient_version\x18\x01 \x01(\t\x12\x11\n\tclient_id\x18\x02 \x01(\t\x12Q\n\x15\x63onnectivity_sdk_data\x18\x03 \x01(\x0b\x32\x30.spotify.clienttoken.data.v0.ConnectivitySdkDataH\x00\x42\x06\n\x04\x64\x61ta\"g\n\x17\x43hallengeAnswersRequest\x12\r\n\x05state\x18\x01 \x01(\t\x12=\n\x07\x61nswers\x18\x02 \x03(\x0b\x32,.spotify.clienttoken.http.v0.ChallengeAnswer\"\x81\x02\n\x13\x43lientTokenResponse\x12K\n\rresponse_type\x18\x01 \x01(\x0e\x32\x34.spotify.clienttoken.http.v0.ClientTokenResponseType\x12J\n\rgranted_token\x18\x02 \x01(\x0b\x32\x31.spotify.clienttoken.http.v0.GrantedTokenResponseH\x00\x12\x45\n\nchallenges\x18\x03 \x01(\x0b\x32/.spotify.clienttoken.http.v0.ChallengesResponseH\x00\x42\n\n\x08response\"\x1d\n\x0bTokenDomain\x12\x0e\n\x06\x64omain\x18\x01 \x01(\t\"\x9e\x01\n\x14GrantedTokenResponse\x12\r\n\x05token\x18\x01 \x01(\t\x12\x1d\n\x15\x65xpires_after_seconds\x18\x02 \x01(\x05\x12\x1d\n\x15refresh_after_seconds\x18\x03 \x01(\x05\x12\x39\n\x07\x64omains\x18\x04 \x03(\x0b\x32(.spotify.clienttoken.http.v0.TokenDomain\"_\n\x12\x43hallengesResponse\x12\r\n\x05state\x18\x01 \x01(\t\x12:\n\nchallenges\x18\x02 \x03(\x0b\x32&.spotify.clienttoken.http.v0.Challenge\"&\n\x16\x43lientSecretParameters\x12\x0c\n\x04salt\x18\x01 \x01(\t\"7\n\x14\x45valuateJSParameters\x12\x0c\n\x04\x63ode\x18\x01 \x01(\t\x12\x11\n\tlibraries\x18\x02 \x03(\t\"4\n\x12HashCashParameters\x12\x0e\n\x06length\x18\x01 \x01(\x05\x12\x0e\n\x06prefix\x18\x02 \x01(\t\"\xda\x02\n\tChallenge\x12\x38\n\x04type\x18\x01 \x01(\x0e\x32*.spotify.clienttoken.http.v0.ChallengeType\x12W\n\x18\x63lient_secret_parameters\x18\x02 \x01(\x0b\x32\x33.spotify.clienttoken.http.v0.ClientSecretParametersH\x00\x12S\n\x16\x65valuate_js_parameters\x18\x03 \x01(\x0b\x32\x31.spotify.clienttoken.http.v0.EvaluateJSParametersH\x00\x12W\n\x1c\x65valuate_hashcash_parameters\x18\x04 \x01(\x0b\x32/.spotify.clienttoken.http.v0.HashCashParametersH\x00\x42\x0c\n\nparameters\"&\n\x16\x43lientSecretHMACAnswer\x12\x0c\n\x04hmac\x18\x01 \x01(\t\"\"\n\x10\x45valuateJSAnswer\x12\x0e\n\x06result\x18\x01 \x01(\t\" \n\x0eHashCashAnswer\x12\x0e\n\x06suffix\x18\x01 \x01(\t\"\xb4\x02\n\x0f\x43hallengeAnswer\x12\x41\n\rChallengeType\x18\x01 \x01(\x0e\x32*.spotify.clienttoken.http.v0.ChallengeType\x12L\n\rclient_secret\x18\x02 \x01(\x0b\x32\x33.spotify.clienttoken.http.v0.ClientSecretHMACAnswerH\x00\x12\x44\n\x0b\x65valuate_js\x18\x03 \x01(\x0b\x32-.spotify.clienttoken.http.v0.EvaluateJSAnswerH\x00\x12@\n\thash_cash\x18\x04 \x01(\x0b\x32+.spotify.clienttoken.http.v0.HashCashAnswerH\x00\x42\x08\n\x06\x61nswer\"(\n\x15\x43lientTokenBadRequest\x12\x0f\n\x07message\x18\x01 \x01(\t*u\n\x16\x43lientTokenRequestType\x12\x13\n\x0fREQUEST_UNKNOWN\x10\x00\x12\x1f\n\x1bREQUEST_CLIENT_DATA_REQUEST\x10\x01\x12%\n!REQUEST_CHALLENGE_ANSWERS_REQUEST\x10\x02*v\n\x17\x43lientTokenResponseType\x12\x14\n\x10RESPONSE_UNKNOWN\x10\x00\x12#\n\x1fRESPONSE_GRANTED_TOKEN_RESPONSE\x10\x01\x12 \n\x1cRESPONSE_CHALLENGES_RESPONSE\x10\x02*|\n\rChallengeType\x12\x15\n\x11\x43HALLENGE_UNKNOWN\x10\x00\x12 \n\x1c\x43HALLENGE_CLIENT_SECRET_HMAC\x10\x01\x12\x19\n\x15\x43HALLENGE_EVALUATE_JS\x10\x02\x12\x17\n\x13\x43HALLENGE_HASH_CASH\x10\x03\x42#\n\x1f\x63om.spotify.clienttoken.http.v0H\x02\x62\x06proto3') + +_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals()) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'client_token_pb2', globals()) +if _descriptor._USE_C_DESCRIPTORS == False: + + DESCRIPTOR._options = None + DESCRIPTOR._serialized_options = b'\n\037com.spotify.clienttoken.http.v0H\002' + _CLIENTTOKENREQUESTTYPE._serialized_start=2107 + _CLIENTTOKENREQUESTTYPE._serialized_end=2224 + _CLIENTTOKENRESPONSETYPE._serialized_start=2226 + _CLIENTTOKENRESPONSETYPE._serialized_end=2344 + _CHALLENGETYPE._serialized_start=2346 + _CHALLENGETYPE._serialized_end=2470 + _CLIENTTOKENREQUEST._serialized_start=72 + _CLIENTTOKENREQUEST._serialized_end=332 + _CLIENTDATAREQUEST._serialized_start=335 + _CLIENTDATAREQUEST._serialized_end=488 + _CHALLENGEANSWERSREQUEST._serialized_start=490 + _CHALLENGEANSWERSREQUEST._serialized_end=593 + _CLIENTTOKENRESPONSE._serialized_start=596 + _CLIENTTOKENRESPONSE._serialized_end=853 + _TOKENDOMAIN._serialized_start=855 + _TOKENDOMAIN._serialized_end=884 + _GRANTEDTOKENRESPONSE._serialized_start=887 + _GRANTEDTOKENRESPONSE._serialized_end=1045 + _CHALLENGESRESPONSE._serialized_start=1047 + _CHALLENGESRESPONSE._serialized_end=1142 + _CLIENTSECRETPARAMETERS._serialized_start=1144 + _CLIENTSECRETPARAMETERS._serialized_end=1182 + _EVALUATEJSPARAMETERS._serialized_start=1184 + _EVALUATEJSPARAMETERS._serialized_end=1239 + _HASHCASHPARAMETERS._serialized_start=1241 + _HASHCASHPARAMETERS._serialized_end=1293 + _CHALLENGE._serialized_start=1296 + _CHALLENGE._serialized_end=1642 + _CLIENTSECRETHMACANSWER._serialized_start=1644 + _CLIENTSECRETHMACANSWER._serialized_end=1682 + _EVALUATEJSANSWER._serialized_start=1684 + _EVALUATEJSANSWER._serialized_end=1718 + _HASHCASHANSWER._serialized_start=1720 + _HASHCASHANSWER._serialized_end=1752 + _CHALLENGEANSWER._serialized_start=1755 + _CHALLENGEANSWER._serialized_end=2063 + _CLIENTTOKENBADREQUEST._serialized_start=2065 + _CLIENTTOKENBADREQUEST._serialized_end=2105 +# @@protoc_insertion_point(module_scope) diff --git a/librespot/proto/Connect_pb2.py b/librespot/proto/Connect_pb2.py new file mode 100644 index 0000000..f356a1c --- /dev/null +++ b/librespot/proto/Connect_pb2.py @@ -0,0 +1,2340 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: connect.proto +"""Generated protocol buffer code.""" +from google.protobuf.internal import enum_type_wrapper +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + +import librespot.proto.Player_pb2 as player__pb2 + +DESCRIPTOR = _descriptor.FileDescriptor( + name='connect.proto', + package='connectstate', + syntax='proto3', + serialized_options=b'\n\030com.spotify.connectstateH\002', + create_key=_descriptor._internal_create_key, + serialized_pb= + b'\n\rconnect.proto\x12\x0c\x63onnectstate\x1a\x0cplayer.proto\"\x9f\x01\n\rClusterUpdate\x12&\n\x07\x63luster\x18\x01 \x01(\x0b\x32\x15.connectstate.Cluster\x12\x38\n\rupdate_reason\x18\x02 \x01(\x0e\x32!.connectstate.ClusterUpdateReason\x12\x0e\n\x06\x61\x63k_id\x18\x03 \x01(\t\x12\x1c\n\x14\x64\x65vices_that_changed\x18\x04 \x03(\t\"\xa6\x01\n\x06\x44\x65vice\x12-\n\x0b\x64\x65vice_info\x18\x01 \x01(\x0b\x32\x18.connectstate.DeviceInfo\x12/\n\x0cplayer_state\x18\x02 \x01(\x0b\x32\x19.connectstate.PlayerState\x12<\n\x13private_device_info\x18\x03 \x01(\x0b\x32\x1f.connectstate.PrivateDeviceInfo\"\xfa\x01\n\x07\x43luster\x12\x11\n\ttimestamp\x18\x01 \x01(\x03\x12\x18\n\x10\x61\x63tive_device_id\x18\x02 \x01(\t\x12/\n\x0cplayer_state\x18\x03 \x01(\x0b\x32\x19.connectstate.PlayerState\x12\x31\n\x06\x64\x65vice\x18\x04 \x03(\x0b\x32!.connectstate.Cluster.DeviceEntry\x12\x15\n\rtransfer_data\x18\x05 \x01(\x0c\x1aG\n\x0b\x44\x65viceEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\'\n\x05value\x18\x02 \x01(\x0b\x32\x18.connectstate.DeviceInfo:\x02\x38\x01\"\xa1\x03\n\x0fPutStateRequest\x12\x14\n\x0c\x63\x61llback_url\x18\x01 \x01(\t\x12$\n\x06\x64\x65vice\x18\x02 \x01(\x0b\x32\x14.connectstate.Device\x12-\n\x0bmember_type\x18\x03 \x01(\x0e\x32\x18.connectstate.MemberType\x12\x11\n\tis_active\x18\x04 \x01(\x08\x12\x36\n\x10put_state_reason\x18\x05 \x01(\x0e\x32\x1c.connectstate.PutStateReason\x12\x12\n\nmessage_id\x18\x06 \x01(\r\x12&\n\x1elast_command_sent_by_device_id\x18\x07 \x01(\t\x12\x1f\n\x17last_command_message_id\x18\x08 \x01(\r\x12\x1a\n\x12started_playing_at\x18\t \x01(\x04\x12\x1f\n\x17has_been_playing_for_ms\x18\x0b \x01(\x04\x12\x1d\n\x15\x63lient_side_timestamp\x18\x0c \x01(\x04\x12\x1f\n\x17only_write_player_state\x18\r \x01(\x08\"%\n\x11PrivateDeviceInfo\x12\x10\n\x08platform\x18\x01 \x01(\t\"(\n\x10SubscribeRequest\x12\x14\n\x0c\x63\x61llback_url\x18\x01 \x01(\t\"\xc5\x03\n\nDeviceInfo\x12\x10\n\x08\x63\x61n_play\x18\x01 \x01(\x08\x12\x0e\n\x06volume\x18\x02 \x01(\r\x12\x0c\n\x04name\x18\x03 \x01(\t\x12\x30\n\x0c\x63\x61pabilities\x18\x04 \x01(\x0b\x32\x1a.connectstate.Capabilities\x12\x1f\n\x17\x64\x65vice_software_version\x18\x06 \x01(\t\x12-\n\x0b\x64\x65vice_type\x18\x07 \x01(\x0e\x32\x18.connectstate.DeviceType\x12\x15\n\rspirc_version\x18\t \x01(\t\x12\x11\n\tdevice_id\x18\n \x01(\t\x12\x1a\n\x12is_private_session\x18\x0b \x01(\x08\x12\x19\n\x11is_social_connect\x18\x0c \x01(\x08\x12\x11\n\tclient_id\x18\r \x01(\t\x12\r\n\x05\x62rand\x18\x0e \x01(\t\x12\r\n\x05model\x18\x0f \x01(\t\x12?\n\x0cmetadata_map\x18\x10 \x03(\x0b\x32).connectstate.DeviceInfo.MetadataMapEntry\x1a\x32\n\x10MetadataMapEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\xcc\x04\n\x0c\x43\x61pabilities\x12\x15\n\rcan_be_player\x18\x02 \x01(\x08\x12\x19\n\x11restrict_to_local\x18\x03 \x01(\x08\x12\x1a\n\x12gaia_eq_connect_id\x18\x05 \x01(\x08\x12\x17\n\x0fsupports_logout\x18\x06 \x01(\x08\x12\x15\n\ris_observable\x18\x07 \x01(\x08\x12\x14\n\x0cvolume_steps\x18\x08 \x01(\x05\x12\x17\n\x0fsupported_types\x18\t \x03(\t\x12\x14\n\x0c\x63ommand_acks\x18\n \x01(\x08\x12\x17\n\x0fsupports_rename\x18\x0b \x01(\x08\x12\x0e\n\x06hidden\x18\x0c \x01(\x08\x12\x16\n\x0e\x64isable_volume\x18\r \x01(\x08\x12\x18\n\x10\x63onnect_disabled\x18\x0e \x01(\x08\x12\x1c\n\x14supports_playlist_v2\x18\x0f \x01(\x08\x12\x17\n\x0fis_controllable\x18\x10 \x01(\x08\x12\"\n\x1asupports_external_episodes\x18\x11 \x01(\x08\x12%\n\x1dsupports_set_backend_metadata\x18\x12 \x01(\x08\x12!\n\x19supports_transfer_command\x18\x13 \x01(\x08\x12 \n\x18supports_command_request\x18\x14 \x01(\x08\x12\x18\n\x10is_voice_enabled\x18\x15 \x01(\x08\x12\x1f\n\x17needs_full_player_state\x18\x16 \x01(\x08\x12\x1c\n\x14supports_gzip_pushes\x18\x17 \x01(\x08\"+\n\x15\x43onnectCommandOptions\x12\x12\n\nmessage_id\x18\x01 \x01(\x05\"M\n\rLogoutCommand\x12<\n\x0f\x63ommand_options\x18\x01 \x01(\x0b\x32#.connectstate.ConnectCommandOptions\"`\n\x10SetVolumeCommand\x12\x0e\n\x06volume\x18\x01 \x01(\x05\x12<\n\x0f\x63ommand_options\x18\x02 \x01(\x0b\x32#.connectstate.ConnectCommandOptions\"`\n\rRenameCommand\x12\x11\n\trename_to\x18\x01 \x01(\t\x12<\n\x0f\x63ommand_options\x18\x02 \x01(\x0b\x32#.connectstate.ConnectCommandOptions\"\x95\x01\n\x19SetBackendMetadataCommand\x12G\n\x08metadata\x18\x01 \x03(\x0b\x32\x35.connectstate.SetBackendMetadataCommand.MetadataEntry\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01*\xd4\x01\n\x11SendCommandResult\x12\x1f\n\x1bUNKNOWN_SEND_COMMAND_RESULT\x10\x00\x12\x0b\n\x07SUCCESS\x10\x01\x12\x14\n\x10\x44\x45VICE_NOT_FOUND\x10\x02\x12\x18\n\x14\x43ONTEXT_PLAYER_ERROR\x10\x03\x12\x16\n\x12\x44\x45VICE_DISAPPEARED\x10\x04\x12\x12\n\x0eUPSTREAM_ERROR\x10\x05\x12#\n\x1f\x44\x45VICE_DOES_NOT_SUPPORT_COMMAND\x10\x06\x12\x10\n\x0cRATE_LIMITED\x10\x07*\xb7\x01\n\x0ePutStateReason\x12\x1c\n\x18UNKNOWN_PUT_STATE_REASON\x10\x00\x12\x0f\n\x0bSPIRC_HELLO\x10\x01\x12\x10\n\x0cSPIRC_NOTIFY\x10\x02\x12\x0e\n\nNEW_DEVICE\x10\x03\x12\x18\n\x14PLAYER_STATE_CHANGED\x10\x04\x12\x12\n\x0eVOLUME_CHANGED\x10\x05\x12\x11\n\rPICKER_OPENED\x10\x06\x12\x13\n\x0f\x42\x45\x43\x41ME_INACTIVE\x10\x07*;\n\nMemberType\x12\x0c\n\x08SPIRC_V2\x10\x00\x12\x0c\n\x08SPIRC_V3\x10\x01\x12\x11\n\rCONNECT_STATE\x10\x02*\x84\x01\n\x13\x43lusterUpdateReason\x12!\n\x1dUNKNOWN_CLUSTER_UPDATE_REASON\x10\x00\x12\x17\n\x13\x44\x45VICES_DISAPPEARED\x10\x01\x12\x18\n\x14\x44\x45VICE_STATE_CHANGED\x10\x02\x12\x17\n\x13NEW_DEVICE_APPEARED\x10\x03*\xa0\x02\n\nDeviceType\x12\x0b\n\x07UNKNOWN\x10\x00\x12\x0c\n\x08\x43OMPUTER\x10\x01\x12\n\n\x06TABLET\x10\x02\x12\x0e\n\nSMARTPHONE\x10\x03\x12\x0b\n\x07SPEAKER\x10\x04\x12\x06\n\x02TV\x10\x05\x12\x07\n\x03\x41VR\x10\x06\x12\x07\n\x03STB\x10\x07\x12\x10\n\x0c\x41UDIO_DONGLE\x10\x08\x12\x10\n\x0cGAME_CONSOLE\x10\t\x12\x0e\n\nCAST_VIDEO\x10\n\x12\x0e\n\nCAST_AUDIO\x10\x0b\x12\x0e\n\nAUTOMOBILE\x10\x0c\x12\x0e\n\nSMARTWATCH\x10\r\x12\x0e\n\nCHROMEBOOK\x10\x0e\x12\x13\n\x0fUNKNOWN_SPOTIFY\x10\x64\x12\r\n\tCAR_THING\x10\x65\x12\x0c\n\x08OBSERVER\x10\x66\x12\x0e\n\nHOME_THING\x10gB\x1c\n\x18\x63om.spotify.connectstateH\x02\x62\x06proto3', + dependencies=[ + player__pb2.DESCRIPTOR, + ]) + +_SENDCOMMANDRESULT = _descriptor.EnumDescriptor( + name='SendCommandResult', + full_name='connectstate.SendCommandResult', + filename=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + values=[ + _descriptor.EnumValueDescriptor( + name='UNKNOWN_SEND_COMMAND_RESULT', + index=0, + number=0, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='SUCCESS', + index=1, + number=1, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='DEVICE_NOT_FOUND', + index=2, + number=2, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='CONTEXT_PLAYER_ERROR', + index=3, + number=3, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='DEVICE_DISAPPEARED', + index=4, + number=4, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='UPSTREAM_ERROR', + index=5, + number=5, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='DEVICE_DOES_NOT_SUPPORT_COMMAND', + index=6, + number=6, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='RATE_LIMITED', + index=7, + number=7, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + ], + containing_type=None, + serialized_options=None, + serialized_start=2650, + serialized_end=2862, +) +_sym_db.RegisterEnumDescriptor(_SENDCOMMANDRESULT) + +SendCommandResult = enum_type_wrapper.EnumTypeWrapper(_SENDCOMMANDRESULT) +_PUTSTATEREASON = _descriptor.EnumDescriptor( + name='PutStateReason', + full_name='connectstate.PutStateReason', + filename=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + values=[ + _descriptor.EnumValueDescriptor( + name='UNKNOWN_PUT_STATE_REASON', + index=0, + number=0, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='SPIRC_HELLO', + index=1, + number=1, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='SPIRC_NOTIFY', + index=2, + number=2, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='NEW_DEVICE', + index=3, + number=3, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='PLAYER_STATE_CHANGED', + index=4, + number=4, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='VOLUME_CHANGED', + index=5, + number=5, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='PICKER_OPENED', + index=6, + number=6, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='BECAME_INACTIVE', + index=7, + number=7, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + ], + containing_type=None, + serialized_options=None, + serialized_start=2865, + serialized_end=3048, +) +_sym_db.RegisterEnumDescriptor(_PUTSTATEREASON) + +PutStateReason = enum_type_wrapper.EnumTypeWrapper(_PUTSTATEREASON) +_MEMBERTYPE = _descriptor.EnumDescriptor( + name='MemberType', + full_name='connectstate.MemberType', + filename=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + values=[ + _descriptor.EnumValueDescriptor( + name='SPIRC_V2', + index=0, + number=0, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='SPIRC_V3', + index=1, + number=1, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='CONNECT_STATE', + index=2, + number=2, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + ], + containing_type=None, + serialized_options=None, + serialized_start=3050, + serialized_end=3109, +) +_sym_db.RegisterEnumDescriptor(_MEMBERTYPE) + +MemberType = enum_type_wrapper.EnumTypeWrapper(_MEMBERTYPE) +_CLUSTERUPDATEREASON = _descriptor.EnumDescriptor( + name='ClusterUpdateReason', + full_name='connectstate.ClusterUpdateReason', + filename=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + values=[ + _descriptor.EnumValueDescriptor( + name='UNKNOWN_CLUSTER_UPDATE_REASON', + index=0, + number=0, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='DEVICES_DISAPPEARED', + index=1, + number=1, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='DEVICE_STATE_CHANGED', + index=2, + number=2, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='NEW_DEVICE_APPEARED', + index=3, + number=3, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + ], + containing_type=None, + serialized_options=None, + serialized_start=3112, + serialized_end=3244, +) +_sym_db.RegisterEnumDescriptor(_CLUSTERUPDATEREASON) + +ClusterUpdateReason = enum_type_wrapper.EnumTypeWrapper(_CLUSTERUPDATEREASON) +_DEVICETYPE = _descriptor.EnumDescriptor( + name='DeviceType', + full_name='connectstate.DeviceType', + filename=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + values=[ + _descriptor.EnumValueDescriptor( + name='UNKNOWN', + index=0, + number=0, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='COMPUTER', + index=1, + number=1, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='TABLET', + index=2, + number=2, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='SMARTPHONE', + index=3, + number=3, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='SPEAKER', + index=4, + number=4, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='TV', + index=5, + number=5, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='AVR', + index=6, + number=6, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='STB', + index=7, + number=7, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='AUDIO_DONGLE', + index=8, + number=8, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='GAME_CONSOLE', + index=9, + number=9, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='CAST_VIDEO', + index=10, + number=10, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='CAST_AUDIO', + index=11, + number=11, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='AUTOMOBILE', + index=12, + number=12, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='SMARTWATCH', + index=13, + number=13, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='CHROMEBOOK', + index=14, + number=14, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='UNKNOWN_SPOTIFY', + index=15, + number=100, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='CAR_THING', + index=16, + number=101, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='OBSERVER', + index=17, + number=102, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='HOME_THING', + index=18, + number=103, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + ], + containing_type=None, + serialized_options=None, + serialized_start=3247, + serialized_end=3535, +) +_sym_db.RegisterEnumDescriptor(_DEVICETYPE) + +DeviceType = enum_type_wrapper.EnumTypeWrapper(_DEVICETYPE) +UNKNOWN_SEND_COMMAND_RESULT = 0 +SUCCESS = 1 +DEVICE_NOT_FOUND = 2 +CONTEXT_PLAYER_ERROR = 3 +DEVICE_DISAPPEARED = 4 +UPSTREAM_ERROR = 5 +DEVICE_DOES_NOT_SUPPORT_COMMAND = 6 +RATE_LIMITED = 7 +UNKNOWN_PUT_STATE_REASON = 0 +SPIRC_HELLO = 1 +SPIRC_NOTIFY = 2 +NEW_DEVICE = 3 +PLAYER_STATE_CHANGED = 4 +VOLUME_CHANGED = 5 +PICKER_OPENED = 6 +BECAME_INACTIVE = 7 +SPIRC_V2 = 0 +SPIRC_V3 = 1 +CONNECT_STATE = 2 +UNKNOWN_CLUSTER_UPDATE_REASON = 0 +DEVICES_DISAPPEARED = 1 +DEVICE_STATE_CHANGED = 2 +NEW_DEVICE_APPEARED = 3 +UNKNOWN = 0 +COMPUTER = 1 +TABLET = 2 +SMARTPHONE = 3 +SPEAKER = 4 +TV = 5 +AVR = 6 +STB = 7 +AUDIO_DONGLE = 8 +GAME_CONSOLE = 9 +CAST_VIDEO = 10 +CAST_AUDIO = 11 +AUTOMOBILE = 12 +SMARTWATCH = 13 +CHROMEBOOK = 14 +UNKNOWN_SPOTIFY = 100 +CAR_THING = 101 +OBSERVER = 102 +HOME_THING = 103 + +_CLUSTERUPDATE = _descriptor.Descriptor( + name='ClusterUpdate', + full_name='connectstate.ClusterUpdate', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='cluster', + full_name='connectstate.ClusterUpdate.cluster', + index=0, + number=1, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='update_reason', + full_name='connectstate.ClusterUpdate.update_reason', + index=1, + number=2, + type=14, + cpp_type=8, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='ack_id', + full_name='connectstate.ClusterUpdate.ack_id', + index=2, + number=3, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode('utf-8'), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='devices_that_changed', + full_name='connectstate.ClusterUpdate.devices_that_changed', + index=3, + number=4, + type=9, + cpp_type=9, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[], + serialized_start=46, + serialized_end=205, +) + +_DEVICE = _descriptor.Descriptor( + name='Device', + full_name='connectstate.Device', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='device_info', + full_name='connectstate.Device.device_info', + index=0, + number=1, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='player_state', + full_name='connectstate.Device.player_state', + index=1, + number=2, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='private_device_info', + full_name='connectstate.Device.private_device_info', + index=2, + number=3, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[], + serialized_start=208, + serialized_end=374, +) + +_CLUSTER_DEVICEENTRY = _descriptor.Descriptor( + name='DeviceEntry', + full_name='connectstate.Cluster.DeviceEntry', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='key', + full_name='connectstate.Cluster.DeviceEntry.key', + index=0, + number=1, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode('utf-8'), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='value', + full_name='connectstate.Cluster.DeviceEntry.value', + index=1, + number=2, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=b'8\001', + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[], + serialized_start=556, + serialized_end=627, +) + +_CLUSTER = _descriptor.Descriptor( + name='Cluster', + full_name='connectstate.Cluster', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='timestamp', + full_name='connectstate.Cluster.timestamp', + index=0, + number=1, + type=3, + cpp_type=2, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='active_device_id', + full_name='connectstate.Cluster.active_device_id', + index=1, + number=2, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode('utf-8'), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='player_state', + full_name='connectstate.Cluster.player_state', + index=2, + number=3, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='device', + full_name='connectstate.Cluster.device', + index=3, + number=4, + type=11, + cpp_type=10, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='transfer_data', + full_name='connectstate.Cluster.transfer_data', + index=4, + number=5, + type=12, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"", + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + ], + extensions=[], + nested_types=[ + _CLUSTER_DEVICEENTRY, + ], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[], + serialized_start=377, + serialized_end=627, +) + +_PUTSTATEREQUEST = _descriptor.Descriptor( + name='PutStateRequest', + full_name='connectstate.PutStateRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='callback_url', + full_name='connectstate.PutStateRequest.callback_url', + index=0, + number=1, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode('utf-8'), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='device', + full_name='connectstate.PutStateRequest.device', + index=1, + number=2, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='member_type', + full_name='connectstate.PutStateRequest.member_type', + index=2, + number=3, + type=14, + cpp_type=8, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='is_active', + full_name='connectstate.PutStateRequest.is_active', + index=3, + number=4, + type=8, + cpp_type=7, + label=1, + has_default_value=False, + default_value=False, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='put_state_reason', + full_name='connectstate.PutStateRequest.put_state_reason', + index=4, + number=5, + type=14, + cpp_type=8, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='message_id', + full_name='connectstate.PutStateRequest.message_id', + index=5, + number=6, + type=13, + cpp_type=3, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='last_command_sent_by_device_id', + full_name= + 'connectstate.PutStateRequest.last_command_sent_by_device_id', + index=6, + number=7, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode('utf-8'), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='last_command_message_id', + full_name='connectstate.PutStateRequest.last_command_message_id', + index=7, + number=8, + type=13, + cpp_type=3, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='started_playing_at', + full_name='connectstate.PutStateRequest.started_playing_at', + index=8, + number=9, + type=4, + cpp_type=4, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='has_been_playing_for_ms', + full_name='connectstate.PutStateRequest.has_been_playing_for_ms', + index=9, + number=11, + type=4, + cpp_type=4, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='client_side_timestamp', + full_name='connectstate.PutStateRequest.client_side_timestamp', + index=10, + number=12, + type=4, + cpp_type=4, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='only_write_player_state', + full_name='connectstate.PutStateRequest.only_write_player_state', + index=11, + number=13, + type=8, + cpp_type=7, + label=1, + has_default_value=False, + default_value=False, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[], + serialized_start=630, + serialized_end=1047, +) + +_PRIVATEDEVICEINFO = _descriptor.Descriptor( + name='PrivateDeviceInfo', + full_name='connectstate.PrivateDeviceInfo', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='platform', + full_name='connectstate.PrivateDeviceInfo.platform', + index=0, + number=1, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode('utf-8'), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[], + serialized_start=1049, + serialized_end=1086, +) + +_SUBSCRIBEREQUEST = _descriptor.Descriptor( + name='SubscribeRequest', + full_name='connectstate.SubscribeRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='callback_url', + full_name='connectstate.SubscribeRequest.callback_url', + index=0, + number=1, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode('utf-8'), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[], + serialized_start=1088, + serialized_end=1128, +) + +_DEVICEINFO_METADATAMAPENTRY = _descriptor.Descriptor( + name='MetadataMapEntry', + full_name='connectstate.DeviceInfo.MetadataMapEntry', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='key', + full_name='connectstate.DeviceInfo.MetadataMapEntry.key', + index=0, + number=1, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode('utf-8'), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='value', + full_name='connectstate.DeviceInfo.MetadataMapEntry.value', + index=1, + number=2, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode('utf-8'), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=b'8\001', + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[], + serialized_start=1534, + serialized_end=1584, +) + +_DEVICEINFO = _descriptor.Descriptor( + name='DeviceInfo', + full_name='connectstate.DeviceInfo', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='can_play', + full_name='connectstate.DeviceInfo.can_play', + index=0, + number=1, + type=8, + cpp_type=7, + label=1, + has_default_value=False, + default_value=False, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='volume', + full_name='connectstate.DeviceInfo.volume', + index=1, + number=2, + type=13, + cpp_type=3, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='name', + full_name='connectstate.DeviceInfo.name', + index=2, + number=3, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode('utf-8'), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='capabilities', + full_name='connectstate.DeviceInfo.capabilities', + index=3, + number=4, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='device_software_version', + full_name='connectstate.DeviceInfo.device_software_version', + index=4, + number=6, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode('utf-8'), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='device_type', + full_name='connectstate.DeviceInfo.device_type', + index=5, + number=7, + type=14, + cpp_type=8, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='spirc_version', + full_name='connectstate.DeviceInfo.spirc_version', + index=6, + number=9, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode('utf-8'), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='device_id', + full_name='connectstate.DeviceInfo.device_id', + index=7, + number=10, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode('utf-8'), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='is_private_session', + full_name='connectstate.DeviceInfo.is_private_session', + index=8, + number=11, + type=8, + cpp_type=7, + label=1, + has_default_value=False, + default_value=False, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='is_social_connect', + full_name='connectstate.DeviceInfo.is_social_connect', + index=9, + number=12, + type=8, + cpp_type=7, + label=1, + has_default_value=False, + default_value=False, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='client_id', + full_name='connectstate.DeviceInfo.client_id', + index=10, + number=13, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode('utf-8'), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='brand', + full_name='connectstate.DeviceInfo.brand', + index=11, + number=14, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode('utf-8'), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='model', + full_name='connectstate.DeviceInfo.model', + index=12, + number=15, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode('utf-8'), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='metadata_map', + full_name='connectstate.DeviceInfo.metadata_map', + index=13, + number=16, + type=11, + cpp_type=10, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + ], + extensions=[], + nested_types=[ + _DEVICEINFO_METADATAMAPENTRY, + ], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[], + serialized_start=1131, + serialized_end=1584, +) + +_CAPABILITIES = _descriptor.Descriptor( + name='Capabilities', + full_name='connectstate.Capabilities', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='can_be_player', + full_name='connectstate.Capabilities.can_be_player', + index=0, + number=2, + type=8, + cpp_type=7, + label=1, + has_default_value=False, + default_value=False, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='restrict_to_local', + full_name='connectstate.Capabilities.restrict_to_local', + index=1, + number=3, + type=8, + cpp_type=7, + label=1, + has_default_value=False, + default_value=False, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='gaia_eq_connect_id', + full_name='connectstate.Capabilities.gaia_eq_connect_id', + index=2, + number=5, + type=8, + cpp_type=7, + label=1, + has_default_value=False, + default_value=False, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='supports_logout', + full_name='connectstate.Capabilities.supports_logout', + index=3, + number=6, + type=8, + cpp_type=7, + label=1, + has_default_value=False, + default_value=False, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='is_observable', + full_name='connectstate.Capabilities.is_observable', + index=4, + number=7, + type=8, + cpp_type=7, + label=1, + has_default_value=False, + default_value=False, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='volume_steps', + full_name='connectstate.Capabilities.volume_steps', + index=5, + number=8, + type=5, + cpp_type=1, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='supported_types', + full_name='connectstate.Capabilities.supported_types', + index=6, + number=9, + type=9, + cpp_type=9, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='command_acks', + full_name='connectstate.Capabilities.command_acks', + index=7, + number=10, + type=8, + cpp_type=7, + label=1, + has_default_value=False, + default_value=False, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='supports_rename', + full_name='connectstate.Capabilities.supports_rename', + index=8, + number=11, + type=8, + cpp_type=7, + label=1, + has_default_value=False, + default_value=False, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='hidden', + full_name='connectstate.Capabilities.hidden', + index=9, + number=12, + type=8, + cpp_type=7, + label=1, + has_default_value=False, + default_value=False, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='disable_volume', + full_name='connectstate.Capabilities.disable_volume', + index=10, + number=13, + type=8, + cpp_type=7, + label=1, + has_default_value=False, + default_value=False, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='connect_disabled', + full_name='connectstate.Capabilities.connect_disabled', + index=11, + number=14, + type=8, + cpp_type=7, + label=1, + has_default_value=False, + default_value=False, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='supports_playlist_v2', + full_name='connectstate.Capabilities.supports_playlist_v2', + index=12, + number=15, + type=8, + cpp_type=7, + label=1, + has_default_value=False, + default_value=False, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='is_controllable', + full_name='connectstate.Capabilities.is_controllable', + index=13, + number=16, + type=8, + cpp_type=7, + label=1, + has_default_value=False, + default_value=False, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='supports_external_episodes', + full_name='connectstate.Capabilities.supports_external_episodes', + index=14, + number=17, + type=8, + cpp_type=7, + label=1, + has_default_value=False, + default_value=False, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='supports_set_backend_metadata', + full_name='connectstate.Capabilities.supports_set_backend_metadata', + index=15, + number=18, + type=8, + cpp_type=7, + label=1, + has_default_value=False, + default_value=False, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='supports_transfer_command', + full_name='connectstate.Capabilities.supports_transfer_command', + index=16, + number=19, + type=8, + cpp_type=7, + label=1, + has_default_value=False, + default_value=False, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='supports_command_request', + full_name='connectstate.Capabilities.supports_command_request', + index=17, + number=20, + type=8, + cpp_type=7, + label=1, + has_default_value=False, + default_value=False, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='is_voice_enabled', + full_name='connectstate.Capabilities.is_voice_enabled', + index=18, + number=21, + type=8, + cpp_type=7, + label=1, + has_default_value=False, + default_value=False, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='needs_full_player_state', + full_name='connectstate.Capabilities.needs_full_player_state', + index=19, + number=22, + type=8, + cpp_type=7, + label=1, + has_default_value=False, + default_value=False, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='supports_gzip_pushes', + full_name='connectstate.Capabilities.supports_gzip_pushes', + index=20, + number=23, + type=8, + cpp_type=7, + label=1, + has_default_value=False, + default_value=False, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[], + serialized_start=1587, + serialized_end=2175, +) + +_CONNECTCOMMANDOPTIONS = _descriptor.Descriptor( + name='ConnectCommandOptions', + full_name='connectstate.ConnectCommandOptions', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='message_id', + full_name='connectstate.ConnectCommandOptions.message_id', + index=0, + number=1, + type=5, + cpp_type=1, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[], + serialized_start=2177, + serialized_end=2220, +) + +_LOGOUTCOMMAND = _descriptor.Descriptor( + name='LogoutCommand', + full_name='connectstate.LogoutCommand', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='command_options', + full_name='connectstate.LogoutCommand.command_options', + index=0, + number=1, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[], + serialized_start=2222, + serialized_end=2299, +) + +_SETVOLUMECOMMAND = _descriptor.Descriptor( + name='SetVolumeCommand', + full_name='connectstate.SetVolumeCommand', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='volume', + full_name='connectstate.SetVolumeCommand.volume', + index=0, + number=1, + type=5, + cpp_type=1, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='command_options', + full_name='connectstate.SetVolumeCommand.command_options', + index=1, + number=2, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[], + serialized_start=2301, + serialized_end=2397, +) + +_RENAMECOMMAND = _descriptor.Descriptor( + name='RenameCommand', + full_name='connectstate.RenameCommand', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='rename_to', + full_name='connectstate.RenameCommand.rename_to', + index=0, + number=1, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode('utf-8'), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='command_options', + full_name='connectstate.RenameCommand.command_options', + index=1, + number=2, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[], + serialized_start=2399, + serialized_end=2495, +) + +_SETBACKENDMETADATACOMMAND_METADATAENTRY = _descriptor.Descriptor( + name='MetadataEntry', + full_name='connectstate.SetBackendMetadataCommand.MetadataEntry', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='key', + full_name= + 'connectstate.SetBackendMetadataCommand.MetadataEntry.key', + index=0, + number=1, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode('utf-8'), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='value', + full_name= + 'connectstate.SetBackendMetadataCommand.MetadataEntry.value', + index=1, + number=2, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode('utf-8'), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=b'8\001', + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[], + serialized_start=2600, + serialized_end=2647, +) + +_SETBACKENDMETADATACOMMAND = _descriptor.Descriptor( + name='SetBackendMetadataCommand', + full_name='connectstate.SetBackendMetadataCommand', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='metadata', + full_name='connectstate.SetBackendMetadataCommand.metadata', + index=0, + number=1, + type=11, + cpp_type=10, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + ], + extensions=[], + nested_types=[ + _SETBACKENDMETADATACOMMAND_METADATAENTRY, + ], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[], + serialized_start=2498, + serialized_end=2647, +) + +_CLUSTERUPDATE.fields_by_name['cluster'].message_type = _CLUSTER +_CLUSTERUPDATE.fields_by_name['update_reason'].enum_type = _CLUSTERUPDATEREASON +_DEVICE.fields_by_name['device_info'].message_type = _DEVICEINFO +_DEVICE.fields_by_name['player_state'].message_type = player__pb2._PLAYERSTATE +_DEVICE.fields_by_name['private_device_info'].message_type = _PRIVATEDEVICEINFO +_CLUSTER_DEVICEENTRY.fields_by_name['value'].message_type = _DEVICEINFO +_CLUSTER_DEVICEENTRY.containing_type = _CLUSTER +_CLUSTER.fields_by_name['player_state'].message_type = player__pb2._PLAYERSTATE +_CLUSTER.fields_by_name['device'].message_type = _CLUSTER_DEVICEENTRY +_PUTSTATEREQUEST.fields_by_name['device'].message_type = _DEVICE +_PUTSTATEREQUEST.fields_by_name['member_type'].enum_type = _MEMBERTYPE +_PUTSTATEREQUEST.fields_by_name['put_state_reason'].enum_type = _PUTSTATEREASON +_DEVICEINFO_METADATAMAPENTRY.containing_type = _DEVICEINFO +_DEVICEINFO.fields_by_name['capabilities'].message_type = _CAPABILITIES +_DEVICEINFO.fields_by_name['device_type'].enum_type = _DEVICETYPE +_DEVICEINFO.fields_by_name[ + 'metadata_map'].message_type = _DEVICEINFO_METADATAMAPENTRY +_LOGOUTCOMMAND.fields_by_name[ + 'command_options'].message_type = _CONNECTCOMMANDOPTIONS +_SETVOLUMECOMMAND.fields_by_name[ + 'command_options'].message_type = _CONNECTCOMMANDOPTIONS +_RENAMECOMMAND.fields_by_name[ + 'command_options'].message_type = _CONNECTCOMMANDOPTIONS +_SETBACKENDMETADATACOMMAND_METADATAENTRY.containing_type = _SETBACKENDMETADATACOMMAND +_SETBACKENDMETADATACOMMAND.fields_by_name[ + 'metadata'].message_type = _SETBACKENDMETADATACOMMAND_METADATAENTRY +DESCRIPTOR.message_types_by_name['ClusterUpdate'] = _CLUSTERUPDATE +DESCRIPTOR.message_types_by_name['Device'] = _DEVICE +DESCRIPTOR.message_types_by_name['Cluster'] = _CLUSTER +DESCRIPTOR.message_types_by_name['PutStateRequest'] = _PUTSTATEREQUEST +DESCRIPTOR.message_types_by_name['PrivateDeviceInfo'] = _PRIVATEDEVICEINFO +DESCRIPTOR.message_types_by_name['SubscribeRequest'] = _SUBSCRIBEREQUEST +DESCRIPTOR.message_types_by_name['DeviceInfo'] = _DEVICEINFO +DESCRIPTOR.message_types_by_name['Capabilities'] = _CAPABILITIES +DESCRIPTOR.message_types_by_name[ + 'ConnectCommandOptions'] = _CONNECTCOMMANDOPTIONS +DESCRIPTOR.message_types_by_name['LogoutCommand'] = _LOGOUTCOMMAND +DESCRIPTOR.message_types_by_name['SetVolumeCommand'] = _SETVOLUMECOMMAND +DESCRIPTOR.message_types_by_name['RenameCommand'] = _RENAMECOMMAND +DESCRIPTOR.message_types_by_name[ + 'SetBackendMetadataCommand'] = _SETBACKENDMETADATACOMMAND +DESCRIPTOR.enum_types_by_name['SendCommandResult'] = _SENDCOMMANDRESULT +DESCRIPTOR.enum_types_by_name['PutStateReason'] = _PUTSTATEREASON +DESCRIPTOR.enum_types_by_name['MemberType'] = _MEMBERTYPE +DESCRIPTOR.enum_types_by_name['ClusterUpdateReason'] = _CLUSTERUPDATEREASON +DESCRIPTOR.enum_types_by_name['DeviceType'] = _DEVICETYPE +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +ClusterUpdate = _reflection.GeneratedProtocolMessageType( + 'ClusterUpdate', + (_message.Message, ), + { + 'DESCRIPTOR': _CLUSTERUPDATE, + '__module__': 'connect_pb2' + # @@protoc_insertion_point(class_scope:connectstate.ClusterUpdate) + }) +_sym_db.RegisterMessage(ClusterUpdate) + +Device = _reflection.GeneratedProtocolMessageType( + 'Device', + (_message.Message, ), + { + 'DESCRIPTOR': _DEVICE, + '__module__': 'connect_pb2' + # @@protoc_insertion_point(class_scope:connectstate.Device) + }) +_sym_db.RegisterMessage(Device) + +Cluster = _reflection.GeneratedProtocolMessageType( + 'Cluster', + (_message.Message, ), + { + 'DeviceEntry': + _reflection.GeneratedProtocolMessageType( + 'DeviceEntry', + (_message.Message, ), + { + 'DESCRIPTOR': _CLUSTER_DEVICEENTRY, + '__module__': 'connect_pb2' + # @@protoc_insertion_point(class_scope:connectstate.Cluster.DeviceEntry) + }), + 'DESCRIPTOR': + _CLUSTER, + '__module__': + 'connect_pb2' + # @@protoc_insertion_point(class_scope:connectstate.Cluster) + }) +_sym_db.RegisterMessage(Cluster) +_sym_db.RegisterMessage(Cluster.DeviceEntry) + +PutStateRequest = _reflection.GeneratedProtocolMessageType( + 'PutStateRequest', + (_message.Message, ), + { + 'DESCRIPTOR': _PUTSTATEREQUEST, + '__module__': 'connect_pb2' + # @@protoc_insertion_point(class_scope:connectstate.PutStateRequest) + }) +_sym_db.RegisterMessage(PutStateRequest) + +PrivateDeviceInfo = _reflection.GeneratedProtocolMessageType( + 'PrivateDeviceInfo', + (_message.Message, ), + { + 'DESCRIPTOR': _PRIVATEDEVICEINFO, + '__module__': 'connect_pb2' + # @@protoc_insertion_point(class_scope:connectstate.PrivateDeviceInfo) + }) +_sym_db.RegisterMessage(PrivateDeviceInfo) + +SubscribeRequest = _reflection.GeneratedProtocolMessageType( + 'SubscribeRequest', + (_message.Message, ), + { + 'DESCRIPTOR': _SUBSCRIBEREQUEST, + '__module__': 'connect_pb2' + # @@protoc_insertion_point(class_scope:connectstate.SubscribeRequest) + }) +_sym_db.RegisterMessage(SubscribeRequest) + +DeviceInfo = _reflection.GeneratedProtocolMessageType( + 'DeviceInfo', + (_message.Message, ), + { + 'MetadataMapEntry': + _reflection.GeneratedProtocolMessageType( + 'MetadataMapEntry', + (_message.Message, ), + { + 'DESCRIPTOR': _DEVICEINFO_METADATAMAPENTRY, + '__module__': 'connect_pb2' + # @@protoc_insertion_point(class_scope:connectstate.DeviceInfo.MetadataMapEntry) + }), + 'DESCRIPTOR': + _DEVICEINFO, + '__module__': + 'connect_pb2' + # @@protoc_insertion_point(class_scope:connectstate.DeviceInfo) + }) +_sym_db.RegisterMessage(DeviceInfo) +_sym_db.RegisterMessage(DeviceInfo.MetadataMapEntry) + +Capabilities = _reflection.GeneratedProtocolMessageType( + 'Capabilities', + (_message.Message, ), + { + 'DESCRIPTOR': _CAPABILITIES, + '__module__': 'connect_pb2' + # @@protoc_insertion_point(class_scope:connectstate.Capabilities) + }) +_sym_db.RegisterMessage(Capabilities) + +ConnectCommandOptions = _reflection.GeneratedProtocolMessageType( + 'ConnectCommandOptions', + (_message.Message, ), + { + 'DESCRIPTOR': _CONNECTCOMMANDOPTIONS, + '__module__': 'connect_pb2' + # @@protoc_insertion_point(class_scope:connectstate.ConnectCommandOptions) + }) +_sym_db.RegisterMessage(ConnectCommandOptions) + +LogoutCommand = _reflection.GeneratedProtocolMessageType( + 'LogoutCommand', + (_message.Message, ), + { + 'DESCRIPTOR': _LOGOUTCOMMAND, + '__module__': 'connect_pb2' + # @@protoc_insertion_point(class_scope:connectstate.LogoutCommand) + }) +_sym_db.RegisterMessage(LogoutCommand) + +SetVolumeCommand = _reflection.GeneratedProtocolMessageType( + 'SetVolumeCommand', + (_message.Message, ), + { + 'DESCRIPTOR': _SETVOLUMECOMMAND, + '__module__': 'connect_pb2' + # @@protoc_insertion_point(class_scope:connectstate.SetVolumeCommand) + }) +_sym_db.RegisterMessage(SetVolumeCommand) + +RenameCommand = _reflection.GeneratedProtocolMessageType( + 'RenameCommand', + (_message.Message, ), + { + 'DESCRIPTOR': _RENAMECOMMAND, + '__module__': 'connect_pb2' + # @@protoc_insertion_point(class_scope:connectstate.RenameCommand) + }) +_sym_db.RegisterMessage(RenameCommand) + +SetBackendMetadataCommand = _reflection.GeneratedProtocolMessageType( + 'SetBackendMetadataCommand', + (_message.Message, ), + { + 'MetadataEntry': + _reflection.GeneratedProtocolMessageType( + 'MetadataEntry', + (_message.Message, ), + { + 'DESCRIPTOR': _SETBACKENDMETADATACOMMAND_METADATAENTRY, + '__module__': 'connect_pb2' + # @@protoc_insertion_point(class_scope:connectstate.SetBackendMetadataCommand.MetadataEntry) + }), + 'DESCRIPTOR': + _SETBACKENDMETADATACOMMAND, + '__module__': + 'connect_pb2' + # @@protoc_insertion_point(class_scope:connectstate.SetBackendMetadataCommand) + }) +_sym_db.RegisterMessage(SetBackendMetadataCommand) +_sym_db.RegisterMessage(SetBackendMetadataCommand.MetadataEntry) + +DESCRIPTOR._options = None +_CLUSTER_DEVICEENTRY._options = None +_DEVICEINFO_METADATAMAPENTRY._options = None +_SETBACKENDMETADATACOMMAND_METADATAENTRY._options = None +# @@protoc_insertion_point(module_scope) diff --git a/librespot/proto/Connectivity_pb2.py b/librespot/proto/Connectivity_pb2.py new file mode 100644 index 0000000..bf17a91 --- /dev/null +++ b/librespot/proto/Connectivity_pb2.py @@ -0,0 +1,36 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: connectivity.proto +"""Generated protocol buffer code.""" +from google.protobuf.internal import builder as _builder +from google.protobuf import descriptor as _descriptor +from google.protobuf import descriptor_pool as _descriptor_pool +from google.protobuf import symbol_database as _symbol_database +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + + + + +DESCRIPTOR = _descriptor_pool.Default().AddSerializedFile(b'\n\x12\x63onnectivity.proto\x12\x1bspotify.clienttoken.data.v0\"{\n\x13\x43onnectivitySdkData\x12Q\n\x16platform_specific_data\x18\x01 \x01(\x0b\x32\x31.spotify.clienttoken.data.v0.PlatformSpecificData\x12\x11\n\tdevice_id\x18\x02 \x01(\t\"\xdf\x01\n\x14PlatformSpecificData\x12\x41\n\x07\x61ndroid\x18\x01 \x01(\x0b\x32..spotify.clienttoken.data.v0.NativeAndroidDataH\x00\x12\x39\n\x03ios\x18\x02 \x01(\x0b\x32*.spotify.clienttoken.data.v0.NativeIOSDataH\x00\x12\x41\n\x07windows\x18\x04 \x01(\x0b\x32..spotify.clienttoken.data.v0.NativeWindowsDataH\x00\x42\x06\n\x04\x64\x61ta\"\xb9\x01\n\x11NativeAndroidData\x12\x19\n\x11major_sdk_version\x18\x01 \x01(\x05\x12\x19\n\x11minor_sdk_version\x18\x02 \x01(\x05\x12\x19\n\x11patch_sdk_version\x18\x03 \x01(\x05\x12\x13\n\x0b\x61pi_version\x18\x04 \x01(\r\x12>\n\x11screen_dimensions\x18\x05 \x01(\x0b\x32#.spotify.clienttoken.data.v0.Screen\"\x9e\x01\n\rNativeIOSData\x12\x1c\n\x14user_interface_idiom\x18\x01 \x01(\x05\x12\x1f\n\x17target_iphone_simulator\x18\x02 \x01(\x08\x12\x12\n\nhw_machine\x18\x03 \x01(\t\x12\x16\n\x0esystem_version\x18\x04 \x01(\t\x12\"\n\x1asimulator_model_identifier\x18\x05 \x01(\t\"\xa0\x01\n\x11NativeWindowsData\x12\x12\n\nsomething1\x18\x01 \x01(\x05\x12\x12\n\nsomething3\x18\x03 \x01(\x05\x12\x12\n\nsomething4\x18\x04 \x01(\x05\x12\x12\n\nsomething6\x18\x06 \x01(\x05\x12\x12\n\nsomething7\x18\x07 \x01(\x05\x12\x12\n\nsomething8\x18\x08 \x01(\x05\x12\x13\n\x0bsomething10\x18\n \x01(\x08\"8\n\x06Screen\x12\r\n\x05width\x18\x01 \x01(\x05\x12\x0e\n\x06height\x18\x02 \x01(\x05\x12\x0f\n\x07\x64\x65nsity\x18\x03 \x01(\x05\x42#\n\x1f\x63om.spotify.clienttoken.data.v0H\x02\x62\x06proto3') + +_builder.BuildMessageAndEnumDescriptors(DESCRIPTOR, globals()) +_builder.BuildTopDescriptorsAndMessages(DESCRIPTOR, 'connectivity_pb2', globals()) +if _descriptor._USE_C_DESCRIPTORS == False: + + DESCRIPTOR._options = None + DESCRIPTOR._serialized_options = b'\n\037com.spotify.clienttoken.data.v0H\002' + _CONNECTIVITYSDKDATA._serialized_start=51 + _CONNECTIVITYSDKDATA._serialized_end=174 + _PLATFORMSPECIFICDATA._serialized_start=177 + _PLATFORMSPECIFICDATA._serialized_end=400 + _NATIVEANDROIDDATA._serialized_start=403 + _NATIVEANDROIDDATA._serialized_end=588 + _NATIVEIOSDATA._serialized_start=591 + _NATIVEIOSDATA._serialized_end=749 + _NATIVEWINDOWSDATA._serialized_start=752 + _NATIVEWINDOWSDATA._serialized_end=912 + _SCREEN._serialized_start=914 + _SCREEN._serialized_end=970 +# @@protoc_insertion_point(module_scope) diff --git a/librespot/proto/ContextPage_pb2.py b/librespot/proto/ContextPage_pb2.py new file mode 100644 index 0000000..5256d5a --- /dev/null +++ b/librespot/proto/ContextPage_pb2.py @@ -0,0 +1,239 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: context_page.proto +"""Generated protocol buffer code.""" +import ContextTrack_pb2 as context__track__pb2 +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database + +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + +DESCRIPTOR = _descriptor.FileDescriptor( + name="context_page.proto", + package="spotify.player.proto", + syntax="proto2", + serialized_options=b"\n\023com.spotify.contextH\002", + create_key=_descriptor._internal_create_key, + serialized_pb= + b'\n\x12\x63ontext_page.proto\x12\x14spotify.player.proto\x1a\x13\x63ontext_track.proto"\xef\x01\n\x0b\x43ontextPage\x12\x10\n\x08page_url\x18\x01 \x01(\t\x12\x15\n\rnext_page_url\x18\x02 \x01(\t\x12\x41\n\x08metadata\x18\x03 \x03(\x0b\x32/.spotify.player.proto.ContextPage.MetadataEntry\x12\x32\n\x06tracks\x18\x04 \x03(\x0b\x32".spotify.player.proto.ContextTrack\x12\x0f\n\x07loading\x18\x05 \x01(\x08\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x42\x17\n\x13\x63om.spotify.contextH\x02', + dependencies=[ + context__track__pb2.DESCRIPTOR, + ], +) + +_CONTEXTPAGE_METADATAENTRY = _descriptor.Descriptor( + name="MetadataEntry", + full_name="spotify.player.proto.ContextPage.MetadataEntry", + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name="key", + full_name="spotify.player.proto.ContextPage.MetadataEntry.key", + index=0, + number=1, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="value", + full_name="spotify.player.proto.ContextPage.MetadataEntry.value", + index=1, + number=2, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=b"8\001", + is_extendable=False, + syntax="proto2", + extension_ranges=[], + oneofs=[], + serialized_start=258, + serialized_end=305, +) + +_CONTEXTPAGE = _descriptor.Descriptor( + name="ContextPage", + full_name="spotify.player.proto.ContextPage", + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name="page_url", + full_name="spotify.player.proto.ContextPage.page_url", + index=0, + number=1, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="next_page_url", + full_name="spotify.player.proto.ContextPage.next_page_url", + index=1, + number=2, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="metadata", + full_name="spotify.player.proto.ContextPage.metadata", + index=2, + number=3, + type=11, + cpp_type=10, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="tracks", + full_name="spotify.player.proto.ContextPage.tracks", + index=3, + number=4, + type=11, + cpp_type=10, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="loading", + full_name="spotify.player.proto.ContextPage.loading", + index=4, + number=5, + type=8, + cpp_type=7, + label=1, + has_default_value=False, + default_value=False, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + ], + extensions=[], + nested_types=[ + _CONTEXTPAGE_METADATAENTRY, + ], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax="proto2", + extension_ranges=[], + oneofs=[], + serialized_start=66, + serialized_end=305, +) + +_CONTEXTPAGE_METADATAENTRY.containing_type = _CONTEXTPAGE +_CONTEXTPAGE.fields_by_name[ + "metadata"].message_type = _CONTEXTPAGE_METADATAENTRY +_CONTEXTPAGE.fields_by_name[ + "tracks"].message_type = context__track__pb2._CONTEXTTRACK +DESCRIPTOR.message_types_by_name["ContextPage"] = _CONTEXTPAGE +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +ContextPage = _reflection.GeneratedProtocolMessageType( + "ContextPage", + (_message.Message, ), + { + "MetadataEntry": + _reflection.GeneratedProtocolMessageType( + "MetadataEntry", + (_message.Message, ), + { + "DESCRIPTOR": _CONTEXTPAGE_METADATAENTRY, + "__module__": "context_page_pb2" + # @@protoc_insertion_point(class_scope:spotify.player.proto.ContextPage.MetadataEntry) + }, + ), + "DESCRIPTOR": + _CONTEXTPAGE, + "__module__": + "context_page_pb2" + # @@protoc_insertion_point(class_scope:spotify.player.proto.ContextPage) + }, +) +_sym_db.RegisterMessage(ContextPage) +_sym_db.RegisterMessage(ContextPage.MetadataEntry) + +DESCRIPTOR._options = None +_CONTEXTPAGE_METADATAENTRY._options = None +# @@protoc_insertion_point(module_scope) diff --git a/librespot/proto/ContextPlayerOptions_pb2.py b/librespot/proto/ContextPlayerOptions_pb2.py new file mode 100644 index 0000000..7b62e05 --- /dev/null +++ b/librespot/proto/ContextPlayerOptions_pb2.py @@ -0,0 +1,215 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: context_player_options.proto +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database + +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + +DESCRIPTOR = _descriptor.FileDescriptor( + name="context_player_options.proto", + package="spotify.player.proto", + syntax="proto2", + serialized_options=b"\n\023com.spotify.contextH\002", + create_key=_descriptor._internal_create_key, + serialized_pb= + b'\n\x1c\x63ontext_player_options.proto\x12\x14spotify.player.proto"e\n\x14\x43ontextPlayerOptions\x12\x19\n\x11shuffling_context\x18\x01 \x01(\x08\x12\x19\n\x11repeating_context\x18\x02 \x01(\x08\x12\x17\n\x0frepeating_track\x18\x03 \x01(\x08"m\n\x1c\x43ontextPlayerOptionOverrides\x12\x19\n\x11shuffling_context\x18\x01 \x01(\x08\x12\x19\n\x11repeating_context\x18\x02 \x01(\x08\x12\x17\n\x0frepeating_track\x18\x03 \x01(\x08\x42\x17\n\x13\x63om.spotify.contextH\x02', +) + +_CONTEXTPLAYEROPTIONS = _descriptor.Descriptor( + name="ContextPlayerOptions", + full_name="spotify.player.proto.ContextPlayerOptions", + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name="shuffling_context", + full_name= + "spotify.player.proto.ContextPlayerOptions.shuffling_context", + index=0, + number=1, + type=8, + cpp_type=7, + label=1, + has_default_value=False, + default_value=False, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="repeating_context", + full_name= + "spotify.player.proto.ContextPlayerOptions.repeating_context", + index=1, + number=2, + type=8, + cpp_type=7, + label=1, + has_default_value=False, + default_value=False, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="repeating_track", + full_name= + "spotify.player.proto.ContextPlayerOptions.repeating_track", + index=2, + number=3, + type=8, + cpp_type=7, + label=1, + has_default_value=False, + default_value=False, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax="proto2", + extension_ranges=[], + oneofs=[], + serialized_start=54, + serialized_end=155, +) + +_CONTEXTPLAYEROPTIONOVERRIDES = _descriptor.Descriptor( + name="ContextPlayerOptionOverrides", + full_name="spotify.player.proto.ContextPlayerOptionOverrides", + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name="shuffling_context", + full_name= + "spotify.player.proto.ContextPlayerOptionOverrides.shuffling_context", + index=0, + number=1, + type=8, + cpp_type=7, + label=1, + has_default_value=False, + default_value=False, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="repeating_context", + full_name= + "spotify.player.proto.ContextPlayerOptionOverrides.repeating_context", + index=1, + number=2, + type=8, + cpp_type=7, + label=1, + has_default_value=False, + default_value=False, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="repeating_track", + full_name= + "spotify.player.proto.ContextPlayerOptionOverrides.repeating_track", + index=2, + number=3, + type=8, + cpp_type=7, + label=1, + has_default_value=False, + default_value=False, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax="proto2", + extension_ranges=[], + oneofs=[], + serialized_start=157, + serialized_end=266, +) + +DESCRIPTOR.message_types_by_name[ + "ContextPlayerOptions"] = _CONTEXTPLAYEROPTIONS +DESCRIPTOR.message_types_by_name[ + "ContextPlayerOptionOverrides"] = _CONTEXTPLAYEROPTIONOVERRIDES +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +ContextPlayerOptions = _reflection.GeneratedProtocolMessageType( + "ContextPlayerOptions", + (_message.Message, ), + { + "DESCRIPTOR": _CONTEXTPLAYEROPTIONS, + "__module__": "context_player_options_pb2" + # @@protoc_insertion_point(class_scope:spotify.player.proto.ContextPlayerOptions) + }, +) +_sym_db.RegisterMessage(ContextPlayerOptions) + +ContextPlayerOptionOverrides = _reflection.GeneratedProtocolMessageType( + "ContextPlayerOptionOverrides", + (_message.Message, ), + { + "DESCRIPTOR": _CONTEXTPLAYEROPTIONOVERRIDES, + "__module__": "context_player_options_pb2" + # @@protoc_insertion_point(class_scope:spotify.player.proto.ContextPlayerOptionOverrides) + }, +) +_sym_db.RegisterMessage(ContextPlayerOptionOverrides) + +DESCRIPTOR._options = None +# @@protoc_insertion_point(module_scope) diff --git a/librespot/proto/ContextTrack_pb2.py b/librespot/proto/ContextTrack_pb2.py new file mode 100644 index 0000000..495b4ea --- /dev/null +++ b/librespot/proto/ContextTrack_pb2.py @@ -0,0 +1,214 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: context_track.proto +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database + +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + +DESCRIPTOR = _descriptor.FileDescriptor( + name="context_track.proto", + package="spotify.player.proto", + syntax="proto2", + serialized_options=b"\n\023com.spotify.contextH\002", + create_key=_descriptor._internal_create_key, + serialized_pb= + b'\n\x13\x63ontext_track.proto\x12\x14spotify.player.proto"\xaa\x01\n\x0c\x43ontextTrack\x12\x0b\n\x03uri\x18\x01 \x01(\t\x12\x0b\n\x03uid\x18\x02 \x01(\t\x12\x0b\n\x03gid\x18\x03 \x01(\x0c\x12\x42\n\x08metadata\x18\x04 \x03(\x0b\x32\x30.spotify.player.proto.ContextTrack.MetadataEntry\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x42\x17\n\x13\x63om.spotify.contextH\x02', +) + +_CONTEXTTRACK_METADATAENTRY = _descriptor.Descriptor( + name="MetadataEntry", + full_name="spotify.player.proto.ContextTrack.MetadataEntry", + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name="key", + full_name="spotify.player.proto.ContextTrack.MetadataEntry.key", + index=0, + number=1, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="value", + full_name="spotify.player.proto.ContextTrack.MetadataEntry.value", + index=1, + number=2, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=b"8\001", + is_extendable=False, + syntax="proto2", + extension_ranges=[], + oneofs=[], + serialized_start=169, + serialized_end=216, +) + +_CONTEXTTRACK = _descriptor.Descriptor( + name="ContextTrack", + full_name="spotify.player.proto.ContextTrack", + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name="uri", + full_name="spotify.player.proto.ContextTrack.uri", + index=0, + number=1, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="uid", + full_name="spotify.player.proto.ContextTrack.uid", + index=1, + number=2, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="gid", + full_name="spotify.player.proto.ContextTrack.gid", + index=2, + number=3, + type=12, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"", + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="metadata", + full_name="spotify.player.proto.ContextTrack.metadata", + index=3, + number=4, + type=11, + cpp_type=10, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + ], + extensions=[], + nested_types=[ + _CONTEXTTRACK_METADATAENTRY, + ], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax="proto2", + extension_ranges=[], + oneofs=[], + serialized_start=46, + serialized_end=216, +) + +_CONTEXTTRACK_METADATAENTRY.containing_type = _CONTEXTTRACK +_CONTEXTTRACK.fields_by_name[ + "metadata"].message_type = _CONTEXTTRACK_METADATAENTRY +DESCRIPTOR.message_types_by_name["ContextTrack"] = _CONTEXTTRACK +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +ContextTrack = _reflection.GeneratedProtocolMessageType( + "ContextTrack", + (_message.Message, ), + { + "MetadataEntry": + _reflection.GeneratedProtocolMessageType( + "MetadataEntry", + (_message.Message, ), + { + "DESCRIPTOR": _CONTEXTTRACK_METADATAENTRY, + "__module__": "context_track_pb2" + # @@protoc_insertion_point(class_scope:spotify.player.proto.ContextTrack.MetadataEntry) + }, + ), + "DESCRIPTOR": + _CONTEXTTRACK, + "__module__": + "context_track_pb2" + # @@protoc_insertion_point(class_scope:spotify.player.proto.ContextTrack) + }, +) +_sym_db.RegisterMessage(ContextTrack) +_sym_db.RegisterMessage(ContextTrack.MetadataEntry) + +DESCRIPTOR._options = None +_CONTEXTTRACK_METADATAENTRY._options = None +# @@protoc_insertion_point(module_scope) diff --git a/librespot/proto/Context_pb2.py b/librespot/proto/Context_pb2.py new file mode 100644 index 0000000..0b2eeae --- /dev/null +++ b/librespot/proto/Context_pb2.py @@ -0,0 +1,260 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: context.proto +"""Generated protocol buffer code.""" +import ContextPage_pb2 as context__page__pb2 +import Restrictions_pb2 as restrictions__pb2 +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database + +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + +DESCRIPTOR = _descriptor.FileDescriptor( + name="context.proto", + package="spotify.player.proto", + syntax="proto2", + serialized_options=b"\n\023com.spotify.contextH\002", + create_key=_descriptor._internal_create_key, + serialized_pb= + b'\n\rcontext.proto\x12\x14spotify.player.proto\x1a\x12\x63ontext_page.proto\x1a\x12restrictions.proto"\x90\x02\n\x07\x43ontext\x12\x0b\n\x03uri\x18\x01 \x01(\t\x12\x0b\n\x03url\x18\x02 \x01(\t\x12=\n\x08metadata\x18\x03 \x03(\x0b\x32+.spotify.player.proto.Context.MetadataEntry\x12\x38\n\x0crestrictions\x18\x04 \x01(\x0b\x32".spotify.player.proto.Restrictions\x12\x30\n\x05pages\x18\x05 \x03(\x0b\x32!.spotify.player.proto.ContextPage\x12\x0f\n\x07loading\x18\x06 \x01(\x08\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x42\x17\n\x13\x63om.spotify.contextH\x02', + dependencies=[ + context__page__pb2.DESCRIPTOR, + restrictions__pb2.DESCRIPTOR, + ], +) + +_CONTEXT_METADATAENTRY = _descriptor.Descriptor( + name="MetadataEntry", + full_name="spotify.player.proto.Context.MetadataEntry", + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name="key", + full_name="spotify.player.proto.Context.MetadataEntry.key", + index=0, + number=1, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="value", + full_name="spotify.player.proto.Context.MetadataEntry.value", + index=1, + number=2, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=b"8\001", + is_extendable=False, + syntax="proto2", + extension_ranges=[], + oneofs=[], + serialized_start=305, + serialized_end=352, +) + +_CONTEXT = _descriptor.Descriptor( + name="Context", + full_name="spotify.player.proto.Context", + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name="uri", + full_name="spotify.player.proto.Context.uri", + index=0, + number=1, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="url", + full_name="spotify.player.proto.Context.url", + index=1, + number=2, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="metadata", + full_name="spotify.player.proto.Context.metadata", + index=2, + number=3, + type=11, + cpp_type=10, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="restrictions", + full_name="spotify.player.proto.Context.restrictions", + index=3, + number=4, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="pages", + full_name="spotify.player.proto.Context.pages", + index=4, + number=5, + type=11, + cpp_type=10, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="loading", + full_name="spotify.player.proto.Context.loading", + index=5, + number=6, + type=8, + cpp_type=7, + label=1, + has_default_value=False, + default_value=False, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + ], + extensions=[], + nested_types=[ + _CONTEXT_METADATAENTRY, + ], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax="proto2", + extension_ranges=[], + oneofs=[], + serialized_start=80, + serialized_end=352, +) + +_CONTEXT_METADATAENTRY.containing_type = _CONTEXT +_CONTEXT.fields_by_name["metadata"].message_type = _CONTEXT_METADATAENTRY +_CONTEXT.fields_by_name[ + "restrictions"].message_type = restrictions__pb2._RESTRICTIONS +_CONTEXT.fields_by_name["pages"].message_type = context__page__pb2._CONTEXTPAGE +DESCRIPTOR.message_types_by_name["Context"] = _CONTEXT +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +Context = _reflection.GeneratedProtocolMessageType( + "Context", + (_message.Message, ), + { + "MetadataEntry": + _reflection.GeneratedProtocolMessageType( + "MetadataEntry", + (_message.Message, ), + { + "DESCRIPTOR": _CONTEXT_METADATAENTRY, + "__module__": "context_pb2" + # @@protoc_insertion_point(class_scope:spotify.player.proto.Context.MetadataEntry) + }, + ), + "DESCRIPTOR": + _CONTEXT, + "__module__": + "context_pb2" + # @@protoc_insertion_point(class_scope:spotify.player.proto.Context) + }, +) +_sym_db.RegisterMessage(Context) +_sym_db.RegisterMessage(Context.MetadataEntry) + +DESCRIPTOR._options = None +_CONTEXT_METADATAENTRY._options = None +# @@protoc_insertion_point(module_scope) diff --git a/librespot/proto/ExplicitContentPubsub_pb2.py b/librespot/proto/ExplicitContentPubsub_pb2.py new file mode 100644 index 0000000..26ed33e --- /dev/null +++ b/librespot/proto/ExplicitContentPubsub_pb2.py @@ -0,0 +1,147 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: explicit_content_pubsub.proto +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + +DESCRIPTOR = _descriptor.FileDescriptor( + name='explicit_content_pubsub.proto', + package='spotify.explicit_content.proto', + syntax='proto2', + serialized_options=b'\n\024com.spotify.explicitH\002', + create_key=_descriptor._internal_create_key, + serialized_pb= + b'\n\x1d\x65xplicit_content_pubsub.proto\x12\x1espotify.explicit_content.proto\"*\n\x0cKeyValuePair\x12\x0b\n\x03key\x18\x01 \x02(\t\x12\r\n\x05value\x18\x02 \x02(\t\"S\n\x14UserAttributesUpdate\x12;\n\x05pairs\x18\x01 \x03(\x0b\x32,.spotify.explicit_content.proto.KeyValuePairB\x18\n\x14\x63om.spotify.explicitH\x02' +) + +_KEYVALUEPAIR = _descriptor.Descriptor( + name='KeyValuePair', + full_name='spotify.explicit_content.proto.KeyValuePair', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='key', + full_name='spotify.explicit_content.proto.KeyValuePair.key', + index=0, + number=1, + type=9, + cpp_type=9, + label=2, + has_default_value=False, + default_value=b"".decode('utf-8'), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='value', + full_name='spotify.explicit_content.proto.KeyValuePair.value', + index=1, + number=2, + type=9, + cpp_type=9, + label=2, + has_default_value=False, + default_value=b"".decode('utf-8'), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[], + serialized_start=65, + serialized_end=107, +) + +_USERATTRIBUTESUPDATE = _descriptor.Descriptor( + name='UserAttributesUpdate', + full_name='spotify.explicit_content.proto.UserAttributesUpdate', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='pairs', + full_name= + 'spotify.explicit_content.proto.UserAttributesUpdate.pairs', + index=0, + number=1, + type=11, + cpp_type=10, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[], + serialized_start=109, + serialized_end=192, +) + +_USERATTRIBUTESUPDATE.fields_by_name['pairs'].message_type = _KEYVALUEPAIR +DESCRIPTOR.message_types_by_name['KeyValuePair'] = _KEYVALUEPAIR +DESCRIPTOR.message_types_by_name[ + 'UserAttributesUpdate'] = _USERATTRIBUTESUPDATE +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +KeyValuePair = _reflection.GeneratedProtocolMessageType( + 'KeyValuePair', + (_message.Message, ), + { + 'DESCRIPTOR': _KEYVALUEPAIR, + '__module__': 'explicit_content_pubsub_pb2' + # @@protoc_insertion_point(class_scope:spotify.explicit_content.proto.KeyValuePair) + }) +_sym_db.RegisterMessage(KeyValuePair) + +UserAttributesUpdate = _reflection.GeneratedProtocolMessageType( + 'UserAttributesUpdate', + (_message.Message, ), + { + 'DESCRIPTOR': _USERATTRIBUTESUPDATE, + '__module__': 'explicit_content_pubsub_pb2' + # @@protoc_insertion_point(class_scope:spotify.explicit_content.proto.UserAttributesUpdate) + }) +_sym_db.RegisterMessage(UserAttributesUpdate) + +DESCRIPTOR._options = None +# @@protoc_insertion_point(module_scope) diff --git a/librespot/proto/Keyexchange_pb2.py b/librespot/proto/Keyexchange_pb2.py new file mode 100644 index 0000000..663ee3b --- /dev/null +++ b/librespot/proto/Keyexchange_pb2.py @@ -0,0 +1,2497 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: keyexchange.proto +"""Generated protocol buffer code.""" +from google.protobuf.internal import enum_type_wrapper +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + +DESCRIPTOR = _descriptor.FileDescriptor( + name='keyexchange.proto', + package='spotify', + syntax='proto2', + serialized_options=b'\n\013com.spotify', + create_key=_descriptor._internal_create_key, + serialized_pb= + b'\n\x11keyexchange.proto\x12\x07spotify\"\xe0\x02\n\x0b\x43lientHello\x12&\n\nbuild_info\x18\n \x02(\x0b\x32\x12.spotify.BuildInfo\x12\x34\n\x16\x66ingerprints_supported\x18\x14 \x03(\x0e\x32\x14.spotify.Fingerprint\x12\x34\n\x16\x63ryptosuites_supported\x18\x1e \x03(\x0e\x32\x14.spotify.Cryptosuite\x12\x30\n\x14powschemes_supported\x18( \x03(\x0e\x32\x12.spotify.Powscheme\x12:\n\x12login_crypto_hello\x18\x32 \x02(\x0b\x32\x1e.spotify.LoginCryptoHelloUnion\x12\x14\n\x0c\x63lient_nonce\x18< \x02(\x0c\x12\x0f\n\x07padding\x18\x46 \x01(\x0c\x12(\n\x0b\x66\x65\x61ture_set\x18P \x01(\x0b\x32\x13.spotify.FeatureSet\"\x92\x01\n\tBuildInfo\x12!\n\x07product\x18\n \x02(\x0e\x32\x10.spotify.Product\x12,\n\rproduct_flags\x18\x14 \x03(\x0e\x32\x15.spotify.ProductFlags\x12#\n\x08platform\x18\x1e \x02(\x0e\x32\x11.spotify.Platform\x12\x0f\n\x07version\x18( \x02(\x04\"W\n\x15LoginCryptoHelloUnion\x12>\n\x0e\x64iffie_hellman\x18\n \x01(\x0b\x32&.spotify.LoginCryptoDiffieHellmanHello\"F\n\x1dLoginCryptoDiffieHellmanHello\x12\n\n\x02gc\x18\n \x02(\x0c\x12\x19\n\x11server_keys_known\x18\x14 \x02(\r\";\n\nFeatureSet\x12\x13\n\x0b\x61utoupdate2\x18\x01 \x01(\x08\x12\x18\n\x10\x63urrent_location\x18\x02 \x01(\x08\"\x9c\x01\n\x11\x41PResponseMessage\x12\'\n\tchallenge\x18\n \x01(\x0b\x32\x14.spotify.APChallenge\x12\x30\n\x07upgrade\x18\x14 \x01(\x0b\x32\x1f.spotify.UpgradeRequiredMessage\x12,\n\x0clogin_failed\x18\x1e \x01(\x0b\x32\x16.spotify.APLoginFailed\"\xa7\x02\n\x0b\x41PChallenge\x12\x42\n\x16login_crypto_challenge\x18\n \x02(\x0b\x32\".spotify.LoginCryptoChallengeUnion\x12\x41\n\x15\x66ingerprint_challenge\x18\x14 \x02(\x0b\x32\".spotify.FingerprintChallengeUnion\x12\x31\n\rpow_challenge\x18\x1e \x02(\x0b\x32\x1a.spotify.PoWChallengeUnion\x12\x37\n\x10\x63rypto_challenge\x18( \x02(\x0b\x32\x1d.spotify.CryptoChallengeUnion\x12\x14\n\x0cserver_nonce\x18\x32 \x02(\x0c\x12\x0f\n\x07padding\x18< \x01(\x0c\"_\n\x19LoginCryptoChallengeUnion\x12\x42\n\x0e\x64iffie_hellman\x18\n \x01(\x0b\x32*.spotify.LoginCryptoDiffieHellmanChallenge\"c\n!LoginCryptoDiffieHellmanChallenge\x12\n\n\x02gs\x18\n \x02(\x0c\x12\x1c\n\x14server_signature_key\x18\x14 \x02(\x05\x12\x14\n\x0cgs_signature\x18\x1e \x02(\x0c\"\x8c\x01\n\x19\x46ingerprintChallengeUnion\x12\x31\n\x05grain\x18\n \x01(\x0b\x32\".spotify.FingerprintGrainChallenge\x12<\n\x0bhmac_ripemd\x18\x14 \x01(\x0b\x32\'.spotify.FingerprintHmacRipemdChallenge\"(\n\x19\x46ingerprintGrainChallenge\x12\x0b\n\x03kek\x18\n \x02(\x0c\"3\n\x1e\x46ingerprintHmacRipemdChallenge\x12\x11\n\tchallenge\x18\n \x02(\x0c\"E\n\x11PoWChallengeUnion\x12\x30\n\thash_cash\x18\n \x01(\x0b\x32\x1d.spotify.PoWHashCashChallenge\"F\n\x14PoWHashCashChallenge\x12\x0e\n\x06prefix\x18\n \x01(\x0c\x12\x0e\n\x06length\x18\x14 \x01(\x05\x12\x0e\n\x06target\x18\x1e \x01(\x05\"\x84\x01\n\x14\x43ryptoChallengeUnion\x12\x30\n\x07shannon\x18\n \x01(\x0b\x32\x1f.spotify.CryptoShannonChallenge\x12:\n\rrc4_sha1_hmac\x18\x14 \x01(\x0b\x32#.spotify.CryptoRc4Sha1HmacChallenge\"\x18\n\x16\x43ryptoShannonChallenge\"\x1c\n\x1a\x43ryptoRc4Sha1HmacChallenge\"]\n\x16UpgradeRequiredMessage\x12\x1b\n\x13upgrade_signed_part\x18\n \x02(\x0c\x12\x11\n\tsignature\x18\x14 \x02(\x0c\x12\x13\n\x0bhttp_suffix\x18\x1e \x01(\t\"w\n\rAPLoginFailed\x12&\n\nerror_code\x18\n \x02(\x0e\x32\x12.spotify.ErrorCode\x12\x13\n\x0bretry_delay\x18\x14 \x01(\x05\x12\x0e\n\x06\x65xpiry\x18\x1e \x01(\x05\x12\x19\n\x11\x65rror_description\x18( \x01(\t\"\xc3\x01\n\x17\x43lientResponsePlaintext\x12@\n\x15login_crypto_response\x18\n \x02(\x0b\x32!.spotify.LoginCryptoResponseUnion\x12/\n\x0cpow_response\x18\x14 \x02(\x0b\x32\x19.spotify.PoWResponseUnion\x12\x35\n\x0f\x63rypto_response\x18\x1e \x02(\x0b\x32\x1c.spotify.CryptoResponseUnion\"]\n\x18LoginCryptoResponseUnion\x12\x41\n\x0e\x64iffie_hellman\x18\n \x01(\x0b\x32).spotify.LoginCryptoDiffieHellmanResponse\"0\n LoginCryptoDiffieHellmanResponse\x12\x0c\n\x04hmac\x18\n \x02(\x0c\"C\n\x10PoWResponseUnion\x12/\n\thash_cash\x18\n \x01(\x0b\x32\x1c.spotify.PoWHashCashResponse\"*\n\x13PoWHashCashResponse\x12\x13\n\x0bhash_suffix\x18\n \x02(\x0c\"\x81\x01\n\x13\x43ryptoResponseUnion\x12/\n\x07shannon\x18\n \x01(\x0b\x32\x1e.spotify.CryptoShannonResponse\x12\x39\n\rrc4_sha1_hmac\x18\x14 \x01(\x0b\x32\".spotify.CryptoRc4Sha1HmacResponse\"&\n\x15\x43ryptoShannonResponse\x12\r\n\x05\x64ummy\x18\x01 \x01(\x05\"*\n\x19\x43ryptoRc4Sha1HmacResponse\x12\r\n\x05\x64ummy\x18\x01 \x01(\x05*\x7f\n\x07Product\x12\x12\n\x0ePRODUCT_CLIENT\x10\x00\x12\x16\n\x12PRODUCT_LIBSPOTIFY\x10\x01\x12\x12\n\x0ePRODUCT_MOBILE\x10\x02\x12\x13\n\x0fPRODUCT_PARTNER\x10\x03\x12\x1f\n\x1bPRODUCT_LIBSPOTIFY_EMBEDDED\x10\x05*A\n\x0cProductFlags\x12\x15\n\x11PRODUCT_FLAG_NONE\x10\x00\x12\x1a\n\x16PRODUCT_FLAG_DEV_BUILD\x10\x01*\xdc\x04\n\x08Platform\x12\x16\n\x12PLATFORM_WIN32_X86\x10\x00\x12\x14\n\x10PLATFORM_OSX_X86\x10\x01\x12\x16\n\x12PLATFORM_LINUX_X86\x10\x02\x12\x17\n\x13PLATFORM_IPHONE_ARM\x10\x03\x12\x14\n\x10PLATFORM_S60_ARM\x10\x04\x12\x14\n\x10PLATFORM_OSX_PPC\x10\x05\x12\x18\n\x14PLATFORM_ANDROID_ARM\x10\x06\x12\x1b\n\x17PLATFORM_WINDOWS_CE_ARM\x10\x07\x12\x19\n\x15PLATFORM_LINUX_X86_64\x10\x08\x12\x17\n\x13PLATFORM_OSX_X86_64\x10\t\x12\x15\n\x11PLATFORM_PALM_ARM\x10\n\x12\x15\n\x11PLATFORM_LINUX_SH\x10\x0b\x12\x18\n\x14PLATFORM_FREEBSD_X86\x10\x0c\x12\x1b\n\x17PLATFORM_FREEBSD_X86_64\x10\r\x12\x1b\n\x17PLATFORM_BLACKBERRY_ARM\x10\x0e\x12\x12\n\x0ePLATFORM_SONOS\x10\x0f\x12\x17\n\x13PLATFORM_LINUX_MIPS\x10\x10\x12\x16\n\x12PLATFORM_LINUX_ARM\x10\x11\x12\x19\n\x15PLATFORM_LOGITECH_ARM\x10\x12\x12\x1b\n\x17PLATFORM_LINUX_BLACKFIN\x10\x13\x12\x14\n\x10PLATFORM_WP7_ARM\x10\x14\x12\x16\n\x12PLATFORM_ONKYO_ARM\x10\x15\x12\x17\n\x13PLATFORM_QNXNTO_ARM\x10\x16\x12\x14\n\x10PLATFORM_BCO_ARM\x10\x17*A\n\x0b\x46ingerprint\x12\x15\n\x11\x46INGERPRINT_GRAIN\x10\x00\x12\x1b\n\x17\x46INGERPRINT_HMAC_RIPEMD\x10\x01*G\n\x0b\x43ryptosuite\x12\x18\n\x14\x43RYPTO_SUITE_SHANNON\x10\x00\x12\x1e\n\x1a\x43RYPTO_SUITE_RC4_SHA1_HMAC\x10\x01*\x1e\n\tPowscheme\x12\x11\n\rPOW_HASH_CASH\x10\x00*\x89\x02\n\tErrorCode\x12\x11\n\rProtocolError\x10\x00\x12\x10\n\x0cTryAnotherAP\x10\x02\x12\x13\n\x0f\x42\x61\x64\x43onnectionId\x10\x05\x12\x15\n\x11TravelRestriction\x10\t\x12\x1a\n\x16PremiumAccountRequired\x10\x0b\x12\x12\n\x0e\x42\x61\x64\x43redentials\x10\x0c\x12\x1f\n\x1b\x43ouldNotValidateCredentials\x10\r\x12\x11\n\rAccountExists\x10\x0e\x12\x1d\n\x19\x45xtraVerificationRequired\x10\x0f\x12\x11\n\rInvalidAppKey\x10\x10\x12\x15\n\x11\x41pplicationBanned\x10\x11\x42\r\n\x0b\x63om.spotify' +) + +_PRODUCT = _descriptor.EnumDescriptor( + name='Product', + full_name='spotify.Product', + filename=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + values=[ + _descriptor.EnumValueDescriptor( + name='PRODUCT_CLIENT', + index=0, + number=0, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='PRODUCT_LIBSPOTIFY', + index=1, + number=1, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='PRODUCT_MOBILE', + index=2, + number=2, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='PRODUCT_PARTNER', + index=3, + number=3, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='PRODUCT_LIBSPOTIFY_EMBEDDED', + index=4, + number=5, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + ], + containing_type=None, + serialized_options=None, + serialized_start=2871, + serialized_end=2998, +) +_sym_db.RegisterEnumDescriptor(_PRODUCT) + +Product = enum_type_wrapper.EnumTypeWrapper(_PRODUCT) +_PRODUCTFLAGS = _descriptor.EnumDescriptor( + name='ProductFlags', + full_name='spotify.ProductFlags', + filename=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + values=[ + _descriptor.EnumValueDescriptor( + name='PRODUCT_FLAG_NONE', + index=0, + number=0, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='PRODUCT_FLAG_DEV_BUILD', + index=1, + number=1, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + ], + containing_type=None, + serialized_options=None, + serialized_start=3000, + serialized_end=3065, +) +_sym_db.RegisterEnumDescriptor(_PRODUCTFLAGS) + +ProductFlags = enum_type_wrapper.EnumTypeWrapper(_PRODUCTFLAGS) +_PLATFORM = _descriptor.EnumDescriptor( + name='Platform', + full_name='spotify.Platform', + filename=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + values=[ + _descriptor.EnumValueDescriptor( + name='PLATFORM_WIN32_X86', + index=0, + number=0, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='PLATFORM_OSX_X86', + index=1, + number=1, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='PLATFORM_LINUX_X86', + index=2, + number=2, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='PLATFORM_IPHONE_ARM', + index=3, + number=3, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='PLATFORM_S60_ARM', + index=4, + number=4, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='PLATFORM_OSX_PPC', + index=5, + number=5, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='PLATFORM_ANDROID_ARM', + index=6, + number=6, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='PLATFORM_WINDOWS_CE_ARM', + index=7, + number=7, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='PLATFORM_LINUX_X86_64', + index=8, + number=8, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='PLATFORM_OSX_X86_64', + index=9, + number=9, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='PLATFORM_PALM_ARM', + index=10, + number=10, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='PLATFORM_LINUX_SH', + index=11, + number=11, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='PLATFORM_FREEBSD_X86', + index=12, + number=12, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='PLATFORM_FREEBSD_X86_64', + index=13, + number=13, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='PLATFORM_BLACKBERRY_ARM', + index=14, + number=14, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='PLATFORM_SONOS', + index=15, + number=15, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='PLATFORM_LINUX_MIPS', + index=16, + number=16, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='PLATFORM_LINUX_ARM', + index=17, + number=17, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='PLATFORM_LOGITECH_ARM', + index=18, + number=18, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='PLATFORM_LINUX_BLACKFIN', + index=19, + number=19, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='PLATFORM_WP7_ARM', + index=20, + number=20, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='PLATFORM_ONKYO_ARM', + index=21, + number=21, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='PLATFORM_QNXNTO_ARM', + index=22, + number=22, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='PLATFORM_BCO_ARM', + index=23, + number=23, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + ], + containing_type=None, + serialized_options=None, + serialized_start=3068, + serialized_end=3672, +) +_sym_db.RegisterEnumDescriptor(_PLATFORM) + +Platform = enum_type_wrapper.EnumTypeWrapper(_PLATFORM) +_FINGERPRINT = _descriptor.EnumDescriptor( + name='Fingerprint', + full_name='spotify.Fingerprint', + filename=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + values=[ + _descriptor.EnumValueDescriptor( + name='FINGERPRINT_GRAIN', + index=0, + number=0, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='FINGERPRINT_HMAC_RIPEMD', + index=1, + number=1, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + ], + containing_type=None, + serialized_options=None, + serialized_start=3674, + serialized_end=3739, +) +_sym_db.RegisterEnumDescriptor(_FINGERPRINT) + +Fingerprint = enum_type_wrapper.EnumTypeWrapper(_FINGERPRINT) +_CRYPTOSUITE = _descriptor.EnumDescriptor( + name='Cryptosuite', + full_name='spotify.Cryptosuite', + filename=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + values=[ + _descriptor.EnumValueDescriptor( + name='CRYPTO_SUITE_SHANNON', + index=0, + number=0, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='CRYPTO_SUITE_RC4_SHA1_HMAC', + index=1, + number=1, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + ], + containing_type=None, + serialized_options=None, + serialized_start=3741, + serialized_end=3812, +) +_sym_db.RegisterEnumDescriptor(_CRYPTOSUITE) + +Cryptosuite = enum_type_wrapper.EnumTypeWrapper(_CRYPTOSUITE) +_POWSCHEME = _descriptor.EnumDescriptor( + name='Powscheme', + full_name='spotify.Powscheme', + filename=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + values=[ + _descriptor.EnumValueDescriptor( + name='POW_HASH_CASH', + index=0, + number=0, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + ], + containing_type=None, + serialized_options=None, + serialized_start=3814, + serialized_end=3844, +) +_sym_db.RegisterEnumDescriptor(_POWSCHEME) + +Powscheme = enum_type_wrapper.EnumTypeWrapper(_POWSCHEME) +_ERRORCODE = _descriptor.EnumDescriptor( + name='ErrorCode', + full_name='spotify.ErrorCode', + filename=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + values=[ + _descriptor.EnumValueDescriptor( + name='ProtocolError', + index=0, + number=0, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='TryAnotherAP', + index=1, + number=2, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='BadConnectionId', + index=2, + number=5, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='TravelRestriction', + index=3, + number=9, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='PremiumAccountRequired', + index=4, + number=11, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='BadCredentials', + index=5, + number=12, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='CouldNotValidateCredentials', + index=6, + number=13, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='AccountExists', + index=7, + number=14, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='ExtraVerificationRequired', + index=8, + number=15, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='InvalidAppKey', + index=9, + number=16, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='ApplicationBanned', + index=10, + number=17, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + ], + containing_type=None, + serialized_options=None, + serialized_start=3847, + serialized_end=4112, +) +_sym_db.RegisterEnumDescriptor(_ERRORCODE) + +ErrorCode = enum_type_wrapper.EnumTypeWrapper(_ERRORCODE) +PRODUCT_CLIENT = 0 +PRODUCT_LIBSPOTIFY = 1 +PRODUCT_MOBILE = 2 +PRODUCT_PARTNER = 3 +PRODUCT_LIBSPOTIFY_EMBEDDED = 5 +PRODUCT_FLAG_NONE = 0 +PRODUCT_FLAG_DEV_BUILD = 1 +PLATFORM_WIN32_X86 = 0 +PLATFORM_OSX_X86 = 1 +PLATFORM_LINUX_X86 = 2 +PLATFORM_IPHONE_ARM = 3 +PLATFORM_S60_ARM = 4 +PLATFORM_OSX_PPC = 5 +PLATFORM_ANDROID_ARM = 6 +PLATFORM_WINDOWS_CE_ARM = 7 +PLATFORM_LINUX_X86_64 = 8 +PLATFORM_OSX_X86_64 = 9 +PLATFORM_PALM_ARM = 10 +PLATFORM_LINUX_SH = 11 +PLATFORM_FREEBSD_X86 = 12 +PLATFORM_FREEBSD_X86_64 = 13 +PLATFORM_BLACKBERRY_ARM = 14 +PLATFORM_SONOS = 15 +PLATFORM_LINUX_MIPS = 16 +PLATFORM_LINUX_ARM = 17 +PLATFORM_LOGITECH_ARM = 18 +PLATFORM_LINUX_BLACKFIN = 19 +PLATFORM_WP7_ARM = 20 +PLATFORM_ONKYO_ARM = 21 +PLATFORM_QNXNTO_ARM = 22 +PLATFORM_BCO_ARM = 23 +FINGERPRINT_GRAIN = 0 +FINGERPRINT_HMAC_RIPEMD = 1 +CRYPTO_SUITE_SHANNON = 0 +CRYPTO_SUITE_RC4_SHA1_HMAC = 1 +POW_HASH_CASH = 0 +ProtocolError = 0 +TryAnotherAP = 2 +BadConnectionId = 5 +TravelRestriction = 9 +PremiumAccountRequired = 11 +BadCredentials = 12 +CouldNotValidateCredentials = 13 +AccountExists = 14 +ExtraVerificationRequired = 15 +InvalidAppKey = 16 +ApplicationBanned = 17 + +_CLIENTHELLO = _descriptor.Descriptor( + name='ClientHello', + full_name='spotify.ClientHello', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='build_info', + full_name='spotify.ClientHello.build_info', + index=0, + number=10, + type=11, + cpp_type=10, + label=2, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='fingerprints_supported', + full_name='spotify.ClientHello.fingerprints_supported', + index=1, + number=20, + type=14, + cpp_type=8, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='cryptosuites_supported', + full_name='spotify.ClientHello.cryptosuites_supported', + index=2, + number=30, + type=14, + cpp_type=8, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='powschemes_supported', + full_name='spotify.ClientHello.powschemes_supported', + index=3, + number=40, + type=14, + cpp_type=8, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='login_crypto_hello', + full_name='spotify.ClientHello.login_crypto_hello', + index=4, + number=50, + type=11, + cpp_type=10, + label=2, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='client_nonce', + full_name='spotify.ClientHello.client_nonce', + index=5, + number=60, + type=12, + cpp_type=9, + label=2, + has_default_value=False, + default_value=b"", + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='padding', + full_name='spotify.ClientHello.padding', + index=6, + number=70, + type=12, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"", + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='feature_set', + full_name='spotify.ClientHello.feature_set', + index=7, + number=80, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[], + serialized_start=31, + serialized_end=383, +) + +_BUILDINFO = _descriptor.Descriptor( + name='BuildInfo', + full_name='spotify.BuildInfo', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='product', + full_name='spotify.BuildInfo.product', + index=0, + number=10, + type=14, + cpp_type=8, + label=2, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='product_flags', + full_name='spotify.BuildInfo.product_flags', + index=1, + number=20, + type=14, + cpp_type=8, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='platform', + full_name='spotify.BuildInfo.platform', + index=2, + number=30, + type=14, + cpp_type=8, + label=2, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='version', + full_name='spotify.BuildInfo.version', + index=3, + number=40, + type=4, + cpp_type=4, + label=2, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[], + serialized_start=386, + serialized_end=532, +) + +_LOGINCRYPTOHELLOUNION = _descriptor.Descriptor( + name='LoginCryptoHelloUnion', + full_name='spotify.LoginCryptoHelloUnion', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='diffie_hellman', + full_name='spotify.LoginCryptoHelloUnion.diffie_hellman', + index=0, + number=10, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[], + serialized_start=534, + serialized_end=621, +) + +_LOGINCRYPTODIFFIEHELLMANHELLO = _descriptor.Descriptor( + name='LoginCryptoDiffieHellmanHello', + full_name='spotify.LoginCryptoDiffieHellmanHello', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='gc', + full_name='spotify.LoginCryptoDiffieHellmanHello.gc', + index=0, + number=10, + type=12, + cpp_type=9, + label=2, + has_default_value=False, + default_value=b"", + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='server_keys_known', + full_name='spotify.LoginCryptoDiffieHellmanHello.server_keys_known', + index=1, + number=20, + type=13, + cpp_type=3, + label=2, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[], + serialized_start=623, + serialized_end=693, +) + +_FEATURESET = _descriptor.Descriptor( + name='FeatureSet', + full_name='spotify.FeatureSet', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='autoupdate2', + full_name='spotify.FeatureSet.autoupdate2', + index=0, + number=1, + type=8, + cpp_type=7, + label=1, + has_default_value=False, + default_value=False, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='current_location', + full_name='spotify.FeatureSet.current_location', + index=1, + number=2, + type=8, + cpp_type=7, + label=1, + has_default_value=False, + default_value=False, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[], + serialized_start=695, + serialized_end=754, +) + +_APRESPONSEMESSAGE = _descriptor.Descriptor( + name='APResponseMessage', + full_name='spotify.APResponseMessage', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='challenge', + full_name='spotify.APResponseMessage.challenge', + index=0, + number=10, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='upgrade', + full_name='spotify.APResponseMessage.upgrade', + index=1, + number=20, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='login_failed', + full_name='spotify.APResponseMessage.login_failed', + index=2, + number=30, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[], + serialized_start=757, + serialized_end=913, +) + +_APCHALLENGE = _descriptor.Descriptor( + name='APChallenge', + full_name='spotify.APChallenge', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='login_crypto_challenge', + full_name='spotify.APChallenge.login_crypto_challenge', + index=0, + number=10, + type=11, + cpp_type=10, + label=2, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='fingerprint_challenge', + full_name='spotify.APChallenge.fingerprint_challenge', + index=1, + number=20, + type=11, + cpp_type=10, + label=2, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='pow_challenge', + full_name='spotify.APChallenge.pow_challenge', + index=2, + number=30, + type=11, + cpp_type=10, + label=2, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='crypto_challenge', + full_name='spotify.APChallenge.crypto_challenge', + index=3, + number=40, + type=11, + cpp_type=10, + label=2, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='server_nonce', + full_name='spotify.APChallenge.server_nonce', + index=4, + number=50, + type=12, + cpp_type=9, + label=2, + has_default_value=False, + default_value=b"", + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='padding', + full_name='spotify.APChallenge.padding', + index=5, + number=60, + type=12, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"", + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[], + serialized_start=916, + serialized_end=1211, +) + +_LOGINCRYPTOCHALLENGEUNION = _descriptor.Descriptor( + name='LoginCryptoChallengeUnion', + full_name='spotify.LoginCryptoChallengeUnion', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='diffie_hellman', + full_name='spotify.LoginCryptoChallengeUnion.diffie_hellman', + index=0, + number=10, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[], + serialized_start=1213, + serialized_end=1308, +) + +_LOGINCRYPTODIFFIEHELLMANCHALLENGE = _descriptor.Descriptor( + name='LoginCryptoDiffieHellmanChallenge', + full_name='spotify.LoginCryptoDiffieHellmanChallenge', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='gs', + full_name='spotify.LoginCryptoDiffieHellmanChallenge.gs', + index=0, + number=10, + type=12, + cpp_type=9, + label=2, + has_default_value=False, + default_value=b"", + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='server_signature_key', + full_name= + 'spotify.LoginCryptoDiffieHellmanChallenge.server_signature_key', + index=1, + number=20, + type=5, + cpp_type=1, + label=2, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='gs_signature', + full_name='spotify.LoginCryptoDiffieHellmanChallenge.gs_signature', + index=2, + number=30, + type=12, + cpp_type=9, + label=2, + has_default_value=False, + default_value=b"", + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[], + serialized_start=1310, + serialized_end=1409, +) + +_FINGERPRINTCHALLENGEUNION = _descriptor.Descriptor( + name='FingerprintChallengeUnion', + full_name='spotify.FingerprintChallengeUnion', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='grain', + full_name='spotify.FingerprintChallengeUnion.grain', + index=0, + number=10, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='hmac_ripemd', + full_name='spotify.FingerprintChallengeUnion.hmac_ripemd', + index=1, + number=20, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[], + serialized_start=1412, + serialized_end=1552, +) + +_FINGERPRINTGRAINCHALLENGE = _descriptor.Descriptor( + name='FingerprintGrainChallenge', + full_name='spotify.FingerprintGrainChallenge', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='kek', + full_name='spotify.FingerprintGrainChallenge.kek', + index=0, + number=10, + type=12, + cpp_type=9, + label=2, + has_default_value=False, + default_value=b"", + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[], + serialized_start=1554, + serialized_end=1594, +) + +_FINGERPRINTHMACRIPEMDCHALLENGE = _descriptor.Descriptor( + name='FingerprintHmacRipemdChallenge', + full_name='spotify.FingerprintHmacRipemdChallenge', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='challenge', + full_name='spotify.FingerprintHmacRipemdChallenge.challenge', + index=0, + number=10, + type=12, + cpp_type=9, + label=2, + has_default_value=False, + default_value=b"", + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[], + serialized_start=1596, + serialized_end=1647, +) + +_POWCHALLENGEUNION = _descriptor.Descriptor( + name='PoWChallengeUnion', + full_name='spotify.PoWChallengeUnion', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='hash_cash', + full_name='spotify.PoWChallengeUnion.hash_cash', + index=0, + number=10, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[], + serialized_start=1649, + serialized_end=1718, +) + +_POWHASHCASHCHALLENGE = _descriptor.Descriptor( + name='PoWHashCashChallenge', + full_name='spotify.PoWHashCashChallenge', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='prefix', + full_name='spotify.PoWHashCashChallenge.prefix', + index=0, + number=10, + type=12, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"", + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='length', + full_name='spotify.PoWHashCashChallenge.length', + index=1, + number=20, + type=5, + cpp_type=1, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='target', + full_name='spotify.PoWHashCashChallenge.target', + index=2, + number=30, + type=5, + cpp_type=1, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[], + serialized_start=1720, + serialized_end=1790, +) + +_CRYPTOCHALLENGEUNION = _descriptor.Descriptor( + name='CryptoChallengeUnion', + full_name='spotify.CryptoChallengeUnion', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='shannon', + full_name='spotify.CryptoChallengeUnion.shannon', + index=0, + number=10, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='rc4_sha1_hmac', + full_name='spotify.CryptoChallengeUnion.rc4_sha1_hmac', + index=1, + number=20, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[], + serialized_start=1793, + serialized_end=1925, +) + +_CRYPTOSHANNONCHALLENGE = _descriptor.Descriptor( + name='CryptoShannonChallenge', + full_name='spotify.CryptoShannonChallenge', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[], + serialized_start=1927, + serialized_end=1951, +) + +_CRYPTORC4SHA1HMACCHALLENGE = _descriptor.Descriptor( + name='CryptoRc4Sha1HmacChallenge', + full_name='spotify.CryptoRc4Sha1HmacChallenge', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[], + serialized_start=1953, + serialized_end=1981, +) + +_UPGRADEREQUIREDMESSAGE = _descriptor.Descriptor( + name='UpgradeRequiredMessage', + full_name='spotify.UpgradeRequiredMessage', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='upgrade_signed_part', + full_name='spotify.UpgradeRequiredMessage.upgrade_signed_part', + index=0, + number=10, + type=12, + cpp_type=9, + label=2, + has_default_value=False, + default_value=b"", + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='signature', + full_name='spotify.UpgradeRequiredMessage.signature', + index=1, + number=20, + type=12, + cpp_type=9, + label=2, + has_default_value=False, + default_value=b"", + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='http_suffix', + full_name='spotify.UpgradeRequiredMessage.http_suffix', + index=2, + number=30, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode('utf-8'), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[], + serialized_start=1983, + serialized_end=2076, +) + +_APLOGINFAILED = _descriptor.Descriptor( + name='APLoginFailed', + full_name='spotify.APLoginFailed', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='error_code', + full_name='spotify.APLoginFailed.error_code', + index=0, + number=10, + type=14, + cpp_type=8, + label=2, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='retry_delay', + full_name='spotify.APLoginFailed.retry_delay', + index=1, + number=20, + type=5, + cpp_type=1, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='expiry', + full_name='spotify.APLoginFailed.expiry', + index=2, + number=30, + type=5, + cpp_type=1, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='error_description', + full_name='spotify.APLoginFailed.error_description', + index=3, + number=40, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode('utf-8'), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[], + serialized_start=2078, + serialized_end=2197, +) + +_CLIENTRESPONSEPLAINTEXT = _descriptor.Descriptor( + name='ClientResponsePlaintext', + full_name='spotify.ClientResponsePlaintext', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='login_crypto_response', + full_name='spotify.ClientResponsePlaintext.login_crypto_response', + index=0, + number=10, + type=11, + cpp_type=10, + label=2, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='pow_response', + full_name='spotify.ClientResponsePlaintext.pow_response', + index=1, + number=20, + type=11, + cpp_type=10, + label=2, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='crypto_response', + full_name='spotify.ClientResponsePlaintext.crypto_response', + index=2, + number=30, + type=11, + cpp_type=10, + label=2, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[], + serialized_start=2200, + serialized_end=2395, +) + +_LOGINCRYPTORESPONSEUNION = _descriptor.Descriptor( + name='LoginCryptoResponseUnion', + full_name='spotify.LoginCryptoResponseUnion', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='diffie_hellman', + full_name='spotify.LoginCryptoResponseUnion.diffie_hellman', + index=0, + number=10, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[], + serialized_start=2397, + serialized_end=2490, +) + +_LOGINCRYPTODIFFIEHELLMANRESPONSE = _descriptor.Descriptor( + name='LoginCryptoDiffieHellmanResponse', + full_name='spotify.LoginCryptoDiffieHellmanResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='hmac', + full_name='spotify.LoginCryptoDiffieHellmanResponse.hmac', + index=0, + number=10, + type=12, + cpp_type=9, + label=2, + has_default_value=False, + default_value=b"", + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[], + serialized_start=2492, + serialized_end=2540, +) + +_POWRESPONSEUNION = _descriptor.Descriptor( + name='PoWResponseUnion', + full_name='spotify.PoWResponseUnion', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='hash_cash', + full_name='spotify.PoWResponseUnion.hash_cash', + index=0, + number=10, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[], + serialized_start=2542, + serialized_end=2609, +) + +_POWHASHCASHRESPONSE = _descriptor.Descriptor( + name='PoWHashCashResponse', + full_name='spotify.PoWHashCashResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='hash_suffix', + full_name='spotify.PoWHashCashResponse.hash_suffix', + index=0, + number=10, + type=12, + cpp_type=9, + label=2, + has_default_value=False, + default_value=b"", + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[], + serialized_start=2611, + serialized_end=2653, +) + +_CRYPTORESPONSEUNION = _descriptor.Descriptor( + name='CryptoResponseUnion', + full_name='spotify.CryptoResponseUnion', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='shannon', + full_name='spotify.CryptoResponseUnion.shannon', + index=0, + number=10, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='rc4_sha1_hmac', + full_name='spotify.CryptoResponseUnion.rc4_sha1_hmac', + index=1, + number=20, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[], + serialized_start=2656, + serialized_end=2785, +) + +_CRYPTOSHANNONRESPONSE = _descriptor.Descriptor( + name='CryptoShannonResponse', + full_name='spotify.CryptoShannonResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='dummy', + full_name='spotify.CryptoShannonResponse.dummy', + index=0, + number=1, + type=5, + cpp_type=1, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[], + serialized_start=2787, + serialized_end=2825, +) + +_CRYPTORC4SHA1HMACRESPONSE = _descriptor.Descriptor( + name='CryptoRc4Sha1HmacResponse', + full_name='spotify.CryptoRc4Sha1HmacResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='dummy', + full_name='spotify.CryptoRc4Sha1HmacResponse.dummy', + index=0, + number=1, + type=5, + cpp_type=1, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[], + serialized_start=2827, + serialized_end=2869, +) + +_CLIENTHELLO.fields_by_name['build_info'].message_type = _BUILDINFO +_CLIENTHELLO.fields_by_name['fingerprints_supported'].enum_type = _FINGERPRINT +_CLIENTHELLO.fields_by_name['cryptosuites_supported'].enum_type = _CRYPTOSUITE +_CLIENTHELLO.fields_by_name['powschemes_supported'].enum_type = _POWSCHEME +_CLIENTHELLO.fields_by_name[ + 'login_crypto_hello'].message_type = _LOGINCRYPTOHELLOUNION +_CLIENTHELLO.fields_by_name['feature_set'].message_type = _FEATURESET +_BUILDINFO.fields_by_name['product'].enum_type = _PRODUCT +_BUILDINFO.fields_by_name['product_flags'].enum_type = _PRODUCTFLAGS +_BUILDINFO.fields_by_name['platform'].enum_type = _PLATFORM +_LOGINCRYPTOHELLOUNION.fields_by_name[ + 'diffie_hellman'].message_type = _LOGINCRYPTODIFFIEHELLMANHELLO +_APRESPONSEMESSAGE.fields_by_name['challenge'].message_type = _APCHALLENGE +_APRESPONSEMESSAGE.fields_by_name[ + 'upgrade'].message_type = _UPGRADEREQUIREDMESSAGE +_APRESPONSEMESSAGE.fields_by_name['login_failed'].message_type = _APLOGINFAILED +_APCHALLENGE.fields_by_name[ + 'login_crypto_challenge'].message_type = _LOGINCRYPTOCHALLENGEUNION +_APCHALLENGE.fields_by_name[ + 'fingerprint_challenge'].message_type = _FINGERPRINTCHALLENGEUNION +_APCHALLENGE.fields_by_name['pow_challenge'].message_type = _POWCHALLENGEUNION +_APCHALLENGE.fields_by_name[ + 'crypto_challenge'].message_type = _CRYPTOCHALLENGEUNION +_LOGINCRYPTOCHALLENGEUNION.fields_by_name[ + 'diffie_hellman'].message_type = _LOGINCRYPTODIFFIEHELLMANCHALLENGE +_FINGERPRINTCHALLENGEUNION.fields_by_name[ + 'grain'].message_type = _FINGERPRINTGRAINCHALLENGE +_FINGERPRINTCHALLENGEUNION.fields_by_name[ + 'hmac_ripemd'].message_type = _FINGERPRINTHMACRIPEMDCHALLENGE +_POWCHALLENGEUNION.fields_by_name[ + 'hash_cash'].message_type = _POWHASHCASHCHALLENGE +_CRYPTOCHALLENGEUNION.fields_by_name[ + 'shannon'].message_type = _CRYPTOSHANNONCHALLENGE +_CRYPTOCHALLENGEUNION.fields_by_name[ + 'rc4_sha1_hmac'].message_type = _CRYPTORC4SHA1HMACCHALLENGE +_APLOGINFAILED.fields_by_name['error_code'].enum_type = _ERRORCODE +_CLIENTRESPONSEPLAINTEXT.fields_by_name[ + 'login_crypto_response'].message_type = _LOGINCRYPTORESPONSEUNION +_CLIENTRESPONSEPLAINTEXT.fields_by_name[ + 'pow_response'].message_type = _POWRESPONSEUNION +_CLIENTRESPONSEPLAINTEXT.fields_by_name[ + 'crypto_response'].message_type = _CRYPTORESPONSEUNION +_LOGINCRYPTORESPONSEUNION.fields_by_name[ + 'diffie_hellman'].message_type = _LOGINCRYPTODIFFIEHELLMANRESPONSE +_POWRESPONSEUNION.fields_by_name[ + 'hash_cash'].message_type = _POWHASHCASHRESPONSE +_CRYPTORESPONSEUNION.fields_by_name[ + 'shannon'].message_type = _CRYPTOSHANNONRESPONSE +_CRYPTORESPONSEUNION.fields_by_name[ + 'rc4_sha1_hmac'].message_type = _CRYPTORC4SHA1HMACRESPONSE +DESCRIPTOR.message_types_by_name['ClientHello'] = _CLIENTHELLO +DESCRIPTOR.message_types_by_name['BuildInfo'] = _BUILDINFO +DESCRIPTOR.message_types_by_name[ + 'LoginCryptoHelloUnion'] = _LOGINCRYPTOHELLOUNION +DESCRIPTOR.message_types_by_name[ + 'LoginCryptoDiffieHellmanHello'] = _LOGINCRYPTODIFFIEHELLMANHELLO +DESCRIPTOR.message_types_by_name['FeatureSet'] = _FEATURESET +DESCRIPTOR.message_types_by_name['APResponseMessage'] = _APRESPONSEMESSAGE +DESCRIPTOR.message_types_by_name['APChallenge'] = _APCHALLENGE +DESCRIPTOR.message_types_by_name[ + 'LoginCryptoChallengeUnion'] = _LOGINCRYPTOCHALLENGEUNION +DESCRIPTOR.message_types_by_name[ + 'LoginCryptoDiffieHellmanChallenge'] = _LOGINCRYPTODIFFIEHELLMANCHALLENGE +DESCRIPTOR.message_types_by_name[ + 'FingerprintChallengeUnion'] = _FINGERPRINTCHALLENGEUNION +DESCRIPTOR.message_types_by_name[ + 'FingerprintGrainChallenge'] = _FINGERPRINTGRAINCHALLENGE +DESCRIPTOR.message_types_by_name[ + 'FingerprintHmacRipemdChallenge'] = _FINGERPRINTHMACRIPEMDCHALLENGE +DESCRIPTOR.message_types_by_name['PoWChallengeUnion'] = _POWCHALLENGEUNION +DESCRIPTOR.message_types_by_name[ + 'PoWHashCashChallenge'] = _POWHASHCASHCHALLENGE +DESCRIPTOR.message_types_by_name[ + 'CryptoChallengeUnion'] = _CRYPTOCHALLENGEUNION +DESCRIPTOR.message_types_by_name[ + 'CryptoShannonChallenge'] = _CRYPTOSHANNONCHALLENGE +DESCRIPTOR.message_types_by_name[ + 'CryptoRc4Sha1HmacChallenge'] = _CRYPTORC4SHA1HMACCHALLENGE +DESCRIPTOR.message_types_by_name[ + 'UpgradeRequiredMessage'] = _UPGRADEREQUIREDMESSAGE +DESCRIPTOR.message_types_by_name['APLoginFailed'] = _APLOGINFAILED +DESCRIPTOR.message_types_by_name[ + 'ClientResponsePlaintext'] = _CLIENTRESPONSEPLAINTEXT +DESCRIPTOR.message_types_by_name[ + 'LoginCryptoResponseUnion'] = _LOGINCRYPTORESPONSEUNION +DESCRIPTOR.message_types_by_name[ + 'LoginCryptoDiffieHellmanResponse'] = _LOGINCRYPTODIFFIEHELLMANRESPONSE +DESCRIPTOR.message_types_by_name['PoWResponseUnion'] = _POWRESPONSEUNION +DESCRIPTOR.message_types_by_name['PoWHashCashResponse'] = _POWHASHCASHRESPONSE +DESCRIPTOR.message_types_by_name['CryptoResponseUnion'] = _CRYPTORESPONSEUNION +DESCRIPTOR.message_types_by_name[ + 'CryptoShannonResponse'] = _CRYPTOSHANNONRESPONSE +DESCRIPTOR.message_types_by_name[ + 'CryptoRc4Sha1HmacResponse'] = _CRYPTORC4SHA1HMACRESPONSE +DESCRIPTOR.enum_types_by_name['Product'] = _PRODUCT +DESCRIPTOR.enum_types_by_name['ProductFlags'] = _PRODUCTFLAGS +DESCRIPTOR.enum_types_by_name['Platform'] = _PLATFORM +DESCRIPTOR.enum_types_by_name['Fingerprint'] = _FINGERPRINT +DESCRIPTOR.enum_types_by_name['Cryptosuite'] = _CRYPTOSUITE +DESCRIPTOR.enum_types_by_name['Powscheme'] = _POWSCHEME +DESCRIPTOR.enum_types_by_name['ErrorCode'] = _ERRORCODE +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +ClientHello = _reflection.GeneratedProtocolMessageType( + 'ClientHello', + (_message.Message, ), + { + 'DESCRIPTOR': _CLIENTHELLO, + '__module__': 'keyexchange_pb2' + # @@protoc_insertion_point(class_scope:spotify.ClientHello) + }) +_sym_db.RegisterMessage(ClientHello) + +BuildInfo = _reflection.GeneratedProtocolMessageType( + 'BuildInfo', + (_message.Message, ), + { + 'DESCRIPTOR': _BUILDINFO, + '__module__': 'keyexchange_pb2' + # @@protoc_insertion_point(class_scope:spotify.BuildInfo) + }) +_sym_db.RegisterMessage(BuildInfo) + +LoginCryptoHelloUnion = _reflection.GeneratedProtocolMessageType( + 'LoginCryptoHelloUnion', + (_message.Message, ), + { + 'DESCRIPTOR': _LOGINCRYPTOHELLOUNION, + '__module__': 'keyexchange_pb2' + # @@protoc_insertion_point(class_scope:spotify.LoginCryptoHelloUnion) + }) +_sym_db.RegisterMessage(LoginCryptoHelloUnion) + +LoginCryptoDiffieHellmanHello = _reflection.GeneratedProtocolMessageType( + 'LoginCryptoDiffieHellmanHello', + (_message.Message, ), + { + 'DESCRIPTOR': _LOGINCRYPTODIFFIEHELLMANHELLO, + '__module__': 'keyexchange_pb2' + # @@protoc_insertion_point(class_scope:spotify.LoginCryptoDiffieHellmanHello) + }) +_sym_db.RegisterMessage(LoginCryptoDiffieHellmanHello) + +FeatureSet = _reflection.GeneratedProtocolMessageType( + 'FeatureSet', + (_message.Message, ), + { + 'DESCRIPTOR': _FEATURESET, + '__module__': 'keyexchange_pb2' + # @@protoc_insertion_point(class_scope:spotify.FeatureSet) + }) +_sym_db.RegisterMessage(FeatureSet) + +APResponseMessage = _reflection.GeneratedProtocolMessageType( + 'APResponseMessage', + (_message.Message, ), + { + 'DESCRIPTOR': _APRESPONSEMESSAGE, + '__module__': 'keyexchange_pb2' + # @@protoc_insertion_point(class_scope:spotify.APResponseMessage) + }) +_sym_db.RegisterMessage(APResponseMessage) + +APChallenge = _reflection.GeneratedProtocolMessageType( + 'APChallenge', + (_message.Message, ), + { + 'DESCRIPTOR': _APCHALLENGE, + '__module__': 'keyexchange_pb2' + # @@protoc_insertion_point(class_scope:spotify.APChallenge) + }) +_sym_db.RegisterMessage(APChallenge) + +LoginCryptoChallengeUnion = _reflection.GeneratedProtocolMessageType( + 'LoginCryptoChallengeUnion', + (_message.Message, ), + { + 'DESCRIPTOR': _LOGINCRYPTOCHALLENGEUNION, + '__module__': 'keyexchange_pb2' + # @@protoc_insertion_point(class_scope:spotify.LoginCryptoChallengeUnion) + }) +_sym_db.RegisterMessage(LoginCryptoChallengeUnion) + +LoginCryptoDiffieHellmanChallenge = _reflection.GeneratedProtocolMessageType( + 'LoginCryptoDiffieHellmanChallenge', + (_message.Message, ), + { + 'DESCRIPTOR': _LOGINCRYPTODIFFIEHELLMANCHALLENGE, + '__module__': 'keyexchange_pb2' + # @@protoc_insertion_point(class_scope:spotify.LoginCryptoDiffieHellmanChallenge) + }) +_sym_db.RegisterMessage(LoginCryptoDiffieHellmanChallenge) + +FingerprintChallengeUnion = _reflection.GeneratedProtocolMessageType( + 'FingerprintChallengeUnion', + (_message.Message, ), + { + 'DESCRIPTOR': _FINGERPRINTCHALLENGEUNION, + '__module__': 'keyexchange_pb2' + # @@protoc_insertion_point(class_scope:spotify.FingerprintChallengeUnion) + }) +_sym_db.RegisterMessage(FingerprintChallengeUnion) + +FingerprintGrainChallenge = _reflection.GeneratedProtocolMessageType( + 'FingerprintGrainChallenge', + (_message.Message, ), + { + 'DESCRIPTOR': _FINGERPRINTGRAINCHALLENGE, + '__module__': 'keyexchange_pb2' + # @@protoc_insertion_point(class_scope:spotify.FingerprintGrainChallenge) + }) +_sym_db.RegisterMessage(FingerprintGrainChallenge) + +FingerprintHmacRipemdChallenge = _reflection.GeneratedProtocolMessageType( + 'FingerprintHmacRipemdChallenge', + (_message.Message, ), + { + 'DESCRIPTOR': _FINGERPRINTHMACRIPEMDCHALLENGE, + '__module__': 'keyexchange_pb2' + # @@protoc_insertion_point(class_scope:spotify.FingerprintHmacRipemdChallenge) + }) +_sym_db.RegisterMessage(FingerprintHmacRipemdChallenge) + +PoWChallengeUnion = _reflection.GeneratedProtocolMessageType( + 'PoWChallengeUnion', + (_message.Message, ), + { + 'DESCRIPTOR': _POWCHALLENGEUNION, + '__module__': 'keyexchange_pb2' + # @@protoc_insertion_point(class_scope:spotify.PoWChallengeUnion) + }) +_sym_db.RegisterMessage(PoWChallengeUnion) + +PoWHashCashChallenge = _reflection.GeneratedProtocolMessageType( + 'PoWHashCashChallenge', + (_message.Message, ), + { + 'DESCRIPTOR': _POWHASHCASHCHALLENGE, + '__module__': 'keyexchange_pb2' + # @@protoc_insertion_point(class_scope:spotify.PoWHashCashChallenge) + }) +_sym_db.RegisterMessage(PoWHashCashChallenge) + +CryptoChallengeUnion = _reflection.GeneratedProtocolMessageType( + 'CryptoChallengeUnion', + (_message.Message, ), + { + 'DESCRIPTOR': _CRYPTOCHALLENGEUNION, + '__module__': 'keyexchange_pb2' + # @@protoc_insertion_point(class_scope:spotify.CryptoChallengeUnion) + }) +_sym_db.RegisterMessage(CryptoChallengeUnion) + +CryptoShannonChallenge = _reflection.GeneratedProtocolMessageType( + 'CryptoShannonChallenge', + (_message.Message, ), + { + 'DESCRIPTOR': _CRYPTOSHANNONCHALLENGE, + '__module__': 'keyexchange_pb2' + # @@protoc_insertion_point(class_scope:spotify.CryptoShannonChallenge) + }) +_sym_db.RegisterMessage(CryptoShannonChallenge) + +CryptoRc4Sha1HmacChallenge = _reflection.GeneratedProtocolMessageType( + 'CryptoRc4Sha1HmacChallenge', + (_message.Message, ), + { + 'DESCRIPTOR': _CRYPTORC4SHA1HMACCHALLENGE, + '__module__': 'keyexchange_pb2' + # @@protoc_insertion_point(class_scope:spotify.CryptoRc4Sha1HmacChallenge) + }) +_sym_db.RegisterMessage(CryptoRc4Sha1HmacChallenge) + +UpgradeRequiredMessage = _reflection.GeneratedProtocolMessageType( + 'UpgradeRequiredMessage', + (_message.Message, ), + { + 'DESCRIPTOR': _UPGRADEREQUIREDMESSAGE, + '__module__': 'keyexchange_pb2' + # @@protoc_insertion_point(class_scope:spotify.UpgradeRequiredMessage) + }) +_sym_db.RegisterMessage(UpgradeRequiredMessage) + +APLoginFailed = _reflection.GeneratedProtocolMessageType( + 'APLoginFailed', + (_message.Message, ), + { + 'DESCRIPTOR': _APLOGINFAILED, + '__module__': 'keyexchange_pb2' + # @@protoc_insertion_point(class_scope:spotify.APLoginFailed) + }) +_sym_db.RegisterMessage(APLoginFailed) + +ClientResponsePlaintext = _reflection.GeneratedProtocolMessageType( + 'ClientResponsePlaintext', + (_message.Message, ), + { + 'DESCRIPTOR': _CLIENTRESPONSEPLAINTEXT, + '__module__': 'keyexchange_pb2' + # @@protoc_insertion_point(class_scope:spotify.ClientResponsePlaintext) + }) +_sym_db.RegisterMessage(ClientResponsePlaintext) + +LoginCryptoResponseUnion = _reflection.GeneratedProtocolMessageType( + 'LoginCryptoResponseUnion', + (_message.Message, ), + { + 'DESCRIPTOR': _LOGINCRYPTORESPONSEUNION, + '__module__': 'keyexchange_pb2' + # @@protoc_insertion_point(class_scope:spotify.LoginCryptoResponseUnion) + }) +_sym_db.RegisterMessage(LoginCryptoResponseUnion) + +LoginCryptoDiffieHellmanResponse = _reflection.GeneratedProtocolMessageType( + 'LoginCryptoDiffieHellmanResponse', + (_message.Message, ), + { + 'DESCRIPTOR': _LOGINCRYPTODIFFIEHELLMANRESPONSE, + '__module__': 'keyexchange_pb2' + # @@protoc_insertion_point(class_scope:spotify.LoginCryptoDiffieHellmanResponse) + }) +_sym_db.RegisterMessage(LoginCryptoDiffieHellmanResponse) + +PoWResponseUnion = _reflection.GeneratedProtocolMessageType( + 'PoWResponseUnion', + (_message.Message, ), + { + 'DESCRIPTOR': _POWRESPONSEUNION, + '__module__': 'keyexchange_pb2' + # @@protoc_insertion_point(class_scope:spotify.PoWResponseUnion) + }) +_sym_db.RegisterMessage(PoWResponseUnion) + +PoWHashCashResponse = _reflection.GeneratedProtocolMessageType( + 'PoWHashCashResponse', + (_message.Message, ), + { + 'DESCRIPTOR': _POWHASHCASHRESPONSE, + '__module__': 'keyexchange_pb2' + # @@protoc_insertion_point(class_scope:spotify.PoWHashCashResponse) + }) +_sym_db.RegisterMessage(PoWHashCashResponse) + +CryptoResponseUnion = _reflection.GeneratedProtocolMessageType( + 'CryptoResponseUnion', + (_message.Message, ), + { + 'DESCRIPTOR': _CRYPTORESPONSEUNION, + '__module__': 'keyexchange_pb2' + # @@protoc_insertion_point(class_scope:spotify.CryptoResponseUnion) + }) +_sym_db.RegisterMessage(CryptoResponseUnion) + +CryptoShannonResponse = _reflection.GeneratedProtocolMessageType( + 'CryptoShannonResponse', + (_message.Message, ), + { + 'DESCRIPTOR': _CRYPTOSHANNONRESPONSE, + '__module__': 'keyexchange_pb2' + # @@protoc_insertion_point(class_scope:spotify.CryptoShannonResponse) + }) +_sym_db.RegisterMessage(CryptoShannonResponse) + +CryptoRc4Sha1HmacResponse = _reflection.GeneratedProtocolMessageType( + 'CryptoRc4Sha1HmacResponse', + (_message.Message, ), + { + 'DESCRIPTOR': _CRYPTORC4SHA1HMACRESPONSE, + '__module__': 'keyexchange_pb2' + # @@protoc_insertion_point(class_scope:spotify.CryptoRc4Sha1HmacResponse) + }) +_sym_db.RegisterMessage(CryptoRc4Sha1HmacResponse) + +DESCRIPTOR._options = None +# @@protoc_insertion_point(module_scope) diff --git a/librespot/proto/Mercury_pb2.py b/librespot/proto/Mercury_pb2.py new file mode 100644 index 0000000..8109c9f --- /dev/null +++ b/librespot/proto/Mercury_pb2.py @@ -0,0 +1,625 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: mercury.proto +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + +DESCRIPTOR = _descriptor.FileDescriptor( + name='mercury.proto', + package='spotify', + syntax='proto2', + serialized_options=b'\n\013com.spotify', + create_key=_descriptor._internal_create_key, + serialized_pb= + b'\n\rmercury.proto\x12\x07spotify\"B\n\x16MercuryMultiGetRequest\x12(\n\x07request\x18\x01 \x03(\x0b\x32\x17.spotify.MercuryRequest\"<\n\x14MercuryMultiGetReply\x12$\n\x05reply\x18\x01 \x03(\x0b\x32\x15.spotify.MercuryReply\"O\n\x0eMercuryRequest\x12\x0b\n\x03uri\x18\x01 \x01(\t\x12\x14\n\x0c\x63ontent_type\x18\x02 \x01(\t\x12\x0c\n\x04\x62ody\x18\x03 \x01(\x0c\x12\x0c\n\x04\x65tag\x18\x04 \x01(\x0c\"\xf5\x01\n\x0cMercuryReply\x12\x13\n\x0bstatus_code\x18\x01 \x01(\x11\x12\x16\n\x0estatus_message\x18\x02 \x01(\t\x12\x37\n\x0c\x63\x61\x63he_policy\x18\x03 \x01(\x0e\x32!.spotify.MercuryReply.CachePolicy\x12\x0b\n\x03ttl\x18\x04 \x01(\x11\x12\x0c\n\x04\x65tag\x18\x05 \x01(\x0c\x12\x14\n\x0c\x63ontent_type\x18\x06 \x01(\t\x12\x0c\n\x04\x62ody\x18\x07 \x01(\x0c\"@\n\x0b\x43\x61\x63hePolicy\x12\x0c\n\x08\x43\x41\x43HE_NO\x10\x01\x12\x11\n\rCACHE_PRIVATE\x10\x02\x12\x10\n\x0c\x43\x41\x43HE_PUBLIC\x10\x03\"y\n\x06Header\x12\x0b\n\x03uri\x18\x01 \x01(\t\x12\x14\n\x0c\x63ontent_type\x18\x02 \x01(\t\x12\x0e\n\x06method\x18\x03 \x01(\t\x12\x13\n\x0bstatus_code\x18\x04 \x01(\x11\x12\'\n\x0buser_fields\x18\x06 \x03(\x0b\x32\x12.spotify.UserField\"\'\n\tUserField\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\x0c\x42\r\n\x0b\x63om.spotify' +) + +_MERCURYREPLY_CACHEPOLICY = _descriptor.EnumDescriptor( + name='CachePolicy', + full_name='spotify.MercuryReply.CachePolicy', + filename=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + values=[ + _descriptor.EnumValueDescriptor( + name='CACHE_NO', + index=0, + number=1, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='CACHE_PRIVATE', + index=1, + number=2, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='CACHE_PUBLIC', + index=2, + number=3, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + ], + containing_type=None, + serialized_options=None, + serialized_start=419, + serialized_end=483, +) +_sym_db.RegisterEnumDescriptor(_MERCURYREPLY_CACHEPOLICY) + +_MERCURYMULTIGETREQUEST = _descriptor.Descriptor( + name='MercuryMultiGetRequest', + full_name='spotify.MercuryMultiGetRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='request', + full_name='spotify.MercuryMultiGetRequest.request', + index=0, + number=1, + type=11, + cpp_type=10, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[], + serialized_start=26, + serialized_end=92, +) + +_MERCURYMULTIGETREPLY = _descriptor.Descriptor( + name='MercuryMultiGetReply', + full_name='spotify.MercuryMultiGetReply', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='reply', + full_name='spotify.MercuryMultiGetReply.reply', + index=0, + number=1, + type=11, + cpp_type=10, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[], + serialized_start=94, + serialized_end=154, +) + +_MERCURYREQUEST = _descriptor.Descriptor( + name='MercuryRequest', + full_name='spotify.MercuryRequest', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='uri', + full_name='spotify.MercuryRequest.uri', + index=0, + number=1, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode('utf-8'), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='content_type', + full_name='spotify.MercuryRequest.content_type', + index=1, + number=2, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode('utf-8'), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='body', + full_name='spotify.MercuryRequest.body', + index=2, + number=3, + type=12, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"", + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='etag', + full_name='spotify.MercuryRequest.etag', + index=3, + number=4, + type=12, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"", + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[], + serialized_start=156, + serialized_end=235, +) + +_MERCURYREPLY = _descriptor.Descriptor( + name='MercuryReply', + full_name='spotify.MercuryReply', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='status_code', + full_name='spotify.MercuryReply.status_code', + index=0, + number=1, + type=17, + cpp_type=1, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='status_message', + full_name='spotify.MercuryReply.status_message', + index=1, + number=2, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode('utf-8'), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='cache_policy', + full_name='spotify.MercuryReply.cache_policy', + index=2, + number=3, + type=14, + cpp_type=8, + label=1, + has_default_value=False, + default_value=1, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='ttl', + full_name='spotify.MercuryReply.ttl', + index=3, + number=4, + type=17, + cpp_type=1, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='etag', + full_name='spotify.MercuryReply.etag', + index=4, + number=5, + type=12, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"", + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='content_type', + full_name='spotify.MercuryReply.content_type', + index=5, + number=6, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode('utf-8'), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='body', + full_name='spotify.MercuryReply.body', + index=6, + number=7, + type=12, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"", + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + ], + extensions=[], + nested_types=[], + enum_types=[ + _MERCURYREPLY_CACHEPOLICY, + ], + serialized_options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[], + serialized_start=238, + serialized_end=483, +) + +_HEADER = _descriptor.Descriptor( + name='Header', + full_name='spotify.Header', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='uri', + full_name='spotify.Header.uri', + index=0, + number=1, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode('utf-8'), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='content_type', + full_name='spotify.Header.content_type', + index=1, + number=2, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode('utf-8'), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='method', + full_name='spotify.Header.method', + index=2, + number=3, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode('utf-8'), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='status_code', + full_name='spotify.Header.status_code', + index=3, + number=4, + type=17, + cpp_type=1, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='user_fields', + full_name='spotify.Header.user_fields', + index=4, + number=6, + type=11, + cpp_type=10, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[], + serialized_start=485, + serialized_end=606, +) + +_USERFIELD = _descriptor.Descriptor( + name='UserField', + full_name='spotify.UserField', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='key', + full_name='spotify.UserField.key', + index=0, + number=1, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode('utf-8'), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='value', + full_name='spotify.UserField.value', + index=1, + number=2, + type=12, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"", + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[], + serialized_start=608, + serialized_end=647, +) + +_MERCURYMULTIGETREQUEST.fields_by_name[ + 'request'].message_type = _MERCURYREQUEST +_MERCURYMULTIGETREPLY.fields_by_name['reply'].message_type = _MERCURYREPLY +_MERCURYREPLY.fields_by_name[ + 'cache_policy'].enum_type = _MERCURYREPLY_CACHEPOLICY +_MERCURYREPLY_CACHEPOLICY.containing_type = _MERCURYREPLY +_HEADER.fields_by_name['user_fields'].message_type = _USERFIELD +DESCRIPTOR.message_types_by_name[ + 'MercuryMultiGetRequest'] = _MERCURYMULTIGETREQUEST +DESCRIPTOR.message_types_by_name[ + 'MercuryMultiGetReply'] = _MERCURYMULTIGETREPLY +DESCRIPTOR.message_types_by_name['MercuryRequest'] = _MERCURYREQUEST +DESCRIPTOR.message_types_by_name['MercuryReply'] = _MERCURYREPLY +DESCRIPTOR.message_types_by_name['Header'] = _HEADER +DESCRIPTOR.message_types_by_name['UserField'] = _USERFIELD +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +MercuryMultiGetRequest = _reflection.GeneratedProtocolMessageType( + 'MercuryMultiGetRequest', + (_message.Message, ), + { + 'DESCRIPTOR': _MERCURYMULTIGETREQUEST, + '__module__': 'mercury_pb2' + # @@protoc_insertion_point(class_scope:spotify.MercuryMultiGetRequest) + }) +_sym_db.RegisterMessage(MercuryMultiGetRequest) + +MercuryMultiGetReply = _reflection.GeneratedProtocolMessageType( + 'MercuryMultiGetReply', + (_message.Message, ), + { + 'DESCRIPTOR': _MERCURYMULTIGETREPLY, + '__module__': 'mercury_pb2' + # @@protoc_insertion_point(class_scope:spotify.MercuryMultiGetReply) + }) +_sym_db.RegisterMessage(MercuryMultiGetReply) + +MercuryRequest = _reflection.GeneratedProtocolMessageType( + 'MercuryRequest', + (_message.Message, ), + { + 'DESCRIPTOR': _MERCURYREQUEST, + '__module__': 'mercury_pb2' + # @@protoc_insertion_point(class_scope:spotify.MercuryRequest) + }) +_sym_db.RegisterMessage(MercuryRequest) + +MercuryReply = _reflection.GeneratedProtocolMessageType( + 'MercuryReply', + (_message.Message, ), + { + 'DESCRIPTOR': _MERCURYREPLY, + '__module__': 'mercury_pb2' + # @@protoc_insertion_point(class_scope:spotify.MercuryReply) + }) +_sym_db.RegisterMessage(MercuryReply) + +Header = _reflection.GeneratedProtocolMessageType( + 'Header', + (_message.Message, ), + { + 'DESCRIPTOR': _HEADER, + '__module__': 'mercury_pb2' + # @@protoc_insertion_point(class_scope:spotify.Header) + }) +_sym_db.RegisterMessage(Header) + +UserField = _reflection.GeneratedProtocolMessageType( + 'UserField', + (_message.Message, ), + { + 'DESCRIPTOR': _USERFIELD, + '__module__': 'mercury_pb2' + # @@protoc_insertion_point(class_scope:spotify.UserField) + }) +_sym_db.RegisterMessage(UserField) + +DESCRIPTOR._options = None +# @@protoc_insertion_point(module_scope) diff --git a/librespot/proto/Metadata_pb2.py b/librespot/proto/Metadata_pb2.py new file mode 100644 index 0000000..e8ac38c --- /dev/null +++ b/librespot/proto/Metadata_pb2.py @@ -0,0 +1,3698 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: metadata.proto +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + +DESCRIPTOR = _descriptor.FileDescriptor( + name='metadata.proto', + package='spotify.metadata.proto', + syntax='proto2', + serialized_options=b'\n\024com.spotify.metadataB\010MetadataH\002', + create_key=_descriptor._internal_create_key, + serialized_pb= + b'\n\x0emetadata.proto\x12\x16spotify.metadata.proto\"\x8a\x07\n\x06\x41rtist\x12\x0b\n\x03gid\x18\x01 \x01(\x0c\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x12\n\npopularity\x18\x03 \x01(\x11\x12\x34\n\ttop_track\x18\x04 \x03(\x0b\x32!.spotify.metadata.proto.TopTracks\x12\x37\n\x0b\x61lbum_group\x18\x05 \x03(\x0b\x32\".spotify.metadata.proto.AlbumGroup\x12\x38\n\x0csingle_group\x18\x06 \x03(\x0b\x32\".spotify.metadata.proto.AlbumGroup\x12=\n\x11\x63ompilation_group\x18\x07 \x03(\x0b\x32\".spotify.metadata.proto.AlbumGroup\x12<\n\x10\x61ppears_on_group\x18\x08 \x03(\x0b\x32\".spotify.metadata.proto.AlbumGroup\x12\r\n\x05genre\x18\t \x03(\t\x12\x37\n\x0b\x65xternal_id\x18\n \x03(\x0b\x32\".spotify.metadata.proto.ExternalId\x12/\n\x08portrait\x18\x0b \x03(\x0b\x32\x1d.spotify.metadata.proto.Image\x12\x34\n\tbiography\x18\x0c \x03(\x0b\x32!.spotify.metadata.proto.Biography\x12?\n\x0f\x61\x63tivity_period\x18\r \x03(\x0b\x32&.spotify.metadata.proto.ActivityPeriod\x12\x38\n\x0brestriction\x18\x0e \x03(\x0b\x32#.spotify.metadata.proto.Restriction\x12/\n\x07related\x18\x0f \x03(\x0b\x32\x1e.spotify.metadata.proto.Artist\x12\x1f\n\x17is_portrait_album_cover\x18\x10 \x01(\x08\x12:\n\x0eportrait_group\x18\x11 \x01(\x0b\x32\".spotify.metadata.proto.ImageGroup\x12\x37\n\x0bsale_period\x18\x12 \x03(\x0b\x32\".spotify.metadata.proto.SalePeriod\x12:\n\x0c\x61vailability\x18\x14 \x03(\x0b\x32$.spotify.metadata.proto.Availability\"\xe8\x06\n\x05\x41lbum\x12\x0b\n\x03gid\x18\x01 \x01(\x0c\x12\x0c\n\x04name\x18\x02 \x01(\t\x12.\n\x06\x61rtist\x18\x03 \x03(\x0b\x32\x1e.spotify.metadata.proto.Artist\x12\x30\n\x04type\x18\x04 \x01(\x0e\x32\".spotify.metadata.proto.Album.Type\x12\r\n\x05label\x18\x05 \x01(\t\x12*\n\x04\x64\x61te\x18\x06 \x01(\x0b\x32\x1c.spotify.metadata.proto.Date\x12\x12\n\npopularity\x18\x07 \x01(\x11\x12\r\n\x05genre\x18\x08 \x03(\t\x12,\n\x05\x63over\x18\t \x03(\x0b\x32\x1d.spotify.metadata.proto.Image\x12\x37\n\x0b\x65xternal_id\x18\n \x03(\x0b\x32\".spotify.metadata.proto.ExternalId\x12*\n\x04\x64isc\x18\x0b \x03(\x0b\x32\x1c.spotify.metadata.proto.Disc\x12\x0e\n\x06review\x18\x0c \x03(\t\x12\x34\n\tcopyright\x18\r \x03(\x0b\x32!.spotify.metadata.proto.Copyright\x12\x38\n\x0brestriction\x18\x0e \x03(\x0b\x32#.spotify.metadata.proto.Restriction\x12.\n\x07related\x18\x0f \x03(\x0b\x32\x1d.spotify.metadata.proto.Album\x12\x37\n\x0bsale_period\x18\x10 \x03(\x0b\x32\".spotify.metadata.proto.SalePeriod\x12\x37\n\x0b\x63over_group\x18\x11 \x01(\x0b\x32\".spotify.metadata.proto.ImageGroup\x12\x16\n\x0eoriginal_title\x18\x12 \x01(\t\x12\x15\n\rversion_title\x18\x13 \x01(\t\x12\x10\n\x08type_str\x18\x14 \x01(\t\x12:\n\x0c\x61vailability\x18\x17 \x03(\x0b\x32$.spotify.metadata.proto.Availability\"R\n\x04Type\x12\t\n\x05\x41LBUM\x10\x01\x12\n\n\x06SINGLE\x10\x02\x12\x0f\n\x0b\x43OMPILATION\x10\x03\x12\x06\n\x02\x45P\x10\x04\x12\r\n\tAUDIOBOOK\x10\x05\x12\x0b\n\x07PODCAST\x10\x06\"\xd5\x05\n\x05Track\x12\x0b\n\x03gid\x18\x01 \x01(\x0c\x12\x0c\n\x04name\x18\x02 \x01(\t\x12,\n\x05\x61lbum\x18\x03 \x01(\x0b\x32\x1d.spotify.metadata.proto.Album\x12.\n\x06\x61rtist\x18\x04 \x03(\x0b\x32\x1e.spotify.metadata.proto.Artist\x12\x0e\n\x06number\x18\x05 \x01(\x11\x12\x13\n\x0b\x64isc_number\x18\x06 \x01(\x11\x12\x10\n\x08\x64uration\x18\x07 \x01(\x11\x12\x12\n\npopularity\x18\x08 \x01(\x11\x12\x10\n\x08\x65xplicit\x18\t \x01(\x08\x12\x37\n\x0b\x65xternal_id\x18\n \x03(\x0b\x32\".spotify.metadata.proto.ExternalId\x12\x38\n\x0brestriction\x18\x0b \x03(\x0b\x32#.spotify.metadata.proto.Restriction\x12/\n\x04\x66ile\x18\x0c \x03(\x0b\x32!.spotify.metadata.proto.AudioFile\x12\x32\n\x0b\x61lternative\x18\r \x03(\x0b\x32\x1d.spotify.metadata.proto.Track\x12\x37\n\x0bsale_period\x18\x0e \x03(\x0b\x32\".spotify.metadata.proto.SalePeriod\x12\x32\n\x07preview\x18\x0f \x03(\x0b\x32!.spotify.metadata.proto.AudioFile\x12\x0c\n\x04tags\x18\x10 \x03(\t\x12\x1f\n\x17\x65\x61rliest_live_timestamp\x18\x11 \x01(\x03\x12\x12\n\nhas_lyrics\x18\x12 \x01(\x08\x12:\n\x0c\x61vailability\x18\x13 \x03(\x0b\x32$.spotify.metadata.proto.Availability\x12\x32\n\x08licensor\x18\x15 \x01(\x0b\x32 .spotify.metadata.proto.Licensor\"\xbf\x05\n\x04Show\x12\x0b\n\x03gid\x18\x01 \x01(\x0c\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18@ \x01(\t\x12!\n\x15\x64\x65precated_popularity\x18\x41 \x01(\x11\x42\x02\x18\x01\x12\x11\n\tpublisher\x18\x42 \x01(\t\x12\x10\n\x08language\x18\x43 \x01(\t\x12\x10\n\x08\x65xplicit\x18\x44 \x01(\x08\x12\x37\n\x0b\x63over_image\x18\x45 \x01(\x0b\x32\".spotify.metadata.proto.ImageGroup\x12\x30\n\x07\x65pisode\x18\x46 \x03(\x0b\x32\x1f.spotify.metadata.proto.Episode\x12\x34\n\tcopyright\x18G \x03(\x0b\x32!.spotify.metadata.proto.Copyright\x12\x38\n\x0brestriction\x18H \x03(\x0b\x32#.spotify.metadata.proto.Restriction\x12\x0f\n\x07keyword\x18I \x03(\t\x12:\n\nmedia_type\x18J \x01(\x0e\x32&.spotify.metadata.proto.Show.MediaType\x12H\n\x11\x63onsumption_order\x18K \x01(\x0e\x32-.spotify.metadata.proto.Show.ConsumptionOrder\x12:\n\x0c\x61vailability\x18N \x03(\x0b\x32$.spotify.metadata.proto.Availability\x12\x13\n\x0btrailer_uri\x18S \x01(\t\",\n\tMediaType\x12\t\n\x05MIXED\x10\x00\x12\t\n\x05\x41UDIO\x10\x01\x12\t\n\x05VIDEO\x10\x02\"<\n\x10\x43onsumptionOrder\x12\x0e\n\nSEQUENTIAL\x10\x01\x12\x0c\n\x08\x45PISODIC\x10\x02\x12\n\n\x06RECENT\x10\x03\"\xf9\x06\n\x07\x45pisode\x12\x0b\n\x03gid\x18\x01 \x01(\x0c\x12\x0c\n\x04name\x18\x02 \x01(\t\x12\x10\n\x08\x64uration\x18\x07 \x01(\x11\x12\x30\n\x05\x61udio\x18\x0c \x03(\x0b\x32!.spotify.metadata.proto.AudioFile\x12\x13\n\x0b\x64\x65scription\x18@ \x01(\t\x12\x0e\n\x06number\x18\x41 \x01(\x11\x12\x32\n\x0cpublish_time\x18\x42 \x01(\x0b\x32\x1c.spotify.metadata.proto.Date\x12!\n\x15\x64\x65precated_popularity\x18\x43 \x01(\x11\x42\x02\x18\x01\x12\x37\n\x0b\x63over_image\x18\x44 \x01(\x0b\x32\".spotify.metadata.proto.ImageGroup\x12\x10\n\x08language\x18\x45 \x01(\t\x12\x10\n\x08\x65xplicit\x18\x46 \x01(\x08\x12*\n\x04show\x18G \x01(\x0b\x32\x1c.spotify.metadata.proto.Show\x12\x30\n\x05video\x18H \x03(\x0b\x32!.spotify.metadata.proto.VideoFile\x12\x38\n\rvideo_preview\x18I \x03(\x0b\x32!.spotify.metadata.proto.VideoFile\x12\x38\n\raudio_preview\x18J \x03(\x0b\x32!.spotify.metadata.proto.AudioFile\x12\x38\n\x0brestriction\x18K \x03(\x0b\x32#.spotify.metadata.proto.Restriction\x12\x38\n\x0c\x66reeze_frame\x18L \x01(\x0b\x32\".spotify.metadata.proto.ImageGroup\x12\x0f\n\x07keyword\x18M \x03(\t\x12!\n\x19\x61llow_background_playback\x18Q \x01(\x08\x12:\n\x0c\x61vailability\x18R \x03(\x0b\x32$.spotify.metadata.proto.Availability\x12\x14\n\x0c\x65xternal_url\x18S \x01(\t\x12\x39\n\x04type\x18W \x01(\x0e\x32+.spotify.metadata.proto.Episode.EpisodeType\"/\n\x0b\x45pisodeType\x12\x08\n\x04\x46ULL\x10\x00\x12\x0b\n\x07TRAILER\x10\x01\x12\t\n\x05\x42ONUS\x10\x02\"\x18\n\x08Licensor\x12\x0c\n\x04uuid\x18\x01 \x01(\x0c\"J\n\tTopTracks\x12\x0f\n\x07\x63ountry\x18\x01 \x01(\t\x12,\n\x05track\x18\x02 \x03(\x0b\x32\x1d.spotify.metadata.proto.Track\"F\n\x0e\x41\x63tivityPeriod\x12\x12\n\nstart_year\x18\x01 \x01(\x11\x12\x10\n\x08\x65nd_year\x18\x02 \x01(\x11\x12\x0e\n\x06\x64\x65\x63\x61\x64\x65\x18\x03 \x01(\x11\":\n\nAlbumGroup\x12,\n\x05\x61lbum\x18\x01 \x03(\x0b\x32\x1d.spotify.metadata.proto.Album\"N\n\x04\x44\x61te\x12\x0c\n\x04year\x18\x01 \x01(\x11\x12\r\n\x05month\x18\x02 \x01(\x11\x12\x0b\n\x03\x64\x61y\x18\x03 \x01(\x11\x12\x0c\n\x04hour\x18\x04 \x01(\x11\x12\x0e\n\x06minute\x18\x05 \x01(\x11\"\xa0\x01\n\x05Image\x12\x0f\n\x07\x66ile_id\x18\x01 \x01(\x0c\x12\x30\n\x04size\x18\x02 \x01(\x0e\x32\".spotify.metadata.proto.Image.Size\x12\r\n\x05width\x18\x03 \x01(\x11\x12\x0e\n\x06height\x18\x04 \x01(\x11\"5\n\x04Size\x12\x0b\n\x07\x44\x45\x46\x41ULT\x10\x00\x12\t\n\x05SMALL\x10\x01\x12\t\n\x05LARGE\x10\x02\x12\n\n\x06XLARGE\x10\x03\":\n\nImageGroup\x12,\n\x05image\x18\x01 \x03(\x0b\x32\x1d.spotify.metadata.proto.Image\"\x86\x01\n\tBiography\x12\x0c\n\x04text\x18\x01 \x01(\t\x12/\n\x08portrait\x18\x02 \x03(\x0b\x32\x1d.spotify.metadata.proto.Image\x12:\n\x0eportrait_group\x18\x03 \x03(\x0b\x32\".spotify.metadata.proto.ImageGroup\"R\n\x04\x44isc\x12\x0e\n\x06number\x18\x01 \x01(\x11\x12\x0c\n\x04name\x18\x02 \x01(\t\x12,\n\x05track\x18\x03 \x03(\x0b\x32\x1d.spotify.metadata.proto.Track\"e\n\tCopyright\x12\x34\n\x04type\x18\x01 \x01(\x0e\x32&.spotify.metadata.proto.Copyright.Type\x12\x0c\n\x04text\x18\x02 \x01(\t\"\x14\n\x04Type\x12\x05\n\x01P\x10\x00\x12\x05\n\x01\x43\x10\x01\"\xdf\x02\n\x0bRestriction\x12@\n\tcatalogue\x18\x01 \x03(\x0e\x32-.spotify.metadata.proto.Restriction.Catalogue\x12\x36\n\x04type\x18\x04 \x01(\x0e\x32(.spotify.metadata.proto.Restriction.Type\x12\x15\n\rcatalogue_str\x18\x05 \x03(\t\x12\x1b\n\x11\x63ountries_allowed\x18\x02 \x01(\tH\x00\x12\x1d\n\x13\x63ountries_forbidden\x18\x03 \x01(\tH\x00\"U\n\tCatalogue\x12\x06\n\x02\x41\x44\x10\x00\x12\x10\n\x0cSUBSCRIPTION\x10\x01\x12\x11\n\rCATALOGUE_ALL\x10\x02\x12\x0b\n\x07SHUFFLE\x10\x03\x12\x0e\n\nCOMMERCIAL\x10\x04\"\x15\n\x04Type\x12\r\n\tSTREAMING\x10\x00\x42\x15\n\x13\x63ountry_restriction\"R\n\x0c\x41vailability\x12\x15\n\rcatalogue_str\x18\x01 \x03(\t\x12+\n\x05start\x18\x02 \x01(\x0b\x32\x1c.spotify.metadata.proto.Date\"\x9e\x01\n\nSalePeriod\x12\x38\n\x0brestriction\x18\x01 \x03(\x0b\x32#.spotify.metadata.proto.Restriction\x12+\n\x05start\x18\x02 \x01(\x0b\x32\x1c.spotify.metadata.proto.Date\x12)\n\x03\x65nd\x18\x03 \x01(\x0b\x32\x1c.spotify.metadata.proto.Date\"&\n\nExternalId\x12\x0c\n\x04type\x18\x01 \x01(\t\x12\n\n\x02id\x18\x02 \x01(\t\"\x89\x02\n\tAudioFile\x12\x0f\n\x07\x66ile_id\x18\x01 \x01(\x0c\x12\x38\n\x06\x66ormat\x18\x02 \x01(\x0e\x32(.spotify.metadata.proto.AudioFile.Format\"\xb0\x01\n\x06\x46ormat\x12\x11\n\rOGG_VORBIS_96\x10\x00\x12\x12\n\x0eOGG_VORBIS_160\x10\x01\x12\x12\n\x0eOGG_VORBIS_320\x10\x02\x12\x0b\n\x07MP3_256\x10\x03\x12\x0b\n\x07MP3_320\x10\x04\x12\x0b\n\x07MP3_160\x10\x05\x12\n\n\x06MP3_96\x10\x06\x12\x0f\n\x0bMP3_160_ENC\x10\x07\x12\n\n\x06\x41\x41\x43_24\x10\x08\x12\n\n\x06\x41\x41\x43_48\x10\t\x12\x0f\n\x0b\x41\x41\x43_24_NORM\x10\x10\"\x1c\n\tVideoFile\x12\x0f\n\x07\x66ile_id\x18\x01 \x01(\x0c\x42\"\n\x14\x63om.spotify.metadataB\x08MetadataH\x02' +) + +_ALBUM_TYPE = _descriptor.EnumDescriptor( + name='Type', + full_name='spotify.metadata.proto.Album.Type', + filename=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + values=[ + _descriptor.EnumValueDescriptor( + name='ALBUM', + index=0, + number=1, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='SINGLE', + index=1, + number=2, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='COMPILATION', + index=2, + number=3, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='EP', + index=3, + number=4, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='AUDIOBOOK', + index=4, + number=5, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='PODCAST', + index=5, + number=6, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + ], + containing_type=None, + serialized_options=None, + serialized_start=1742, + serialized_end=1824, +) +_sym_db.RegisterEnumDescriptor(_ALBUM_TYPE) + +_SHOW_MEDIATYPE = _descriptor.EnumDescriptor( + name='MediaType', + full_name='spotify.metadata.proto.Show.MediaType', + filename=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + values=[ + _descriptor.EnumValueDescriptor( + name='MIXED', + index=0, + number=0, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='AUDIO', + index=1, + number=1, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='VIDEO', + index=2, + number=2, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + ], + containing_type=None, + serialized_options=None, + serialized_start=3152, + serialized_end=3196, +) +_sym_db.RegisterEnumDescriptor(_SHOW_MEDIATYPE) + +_SHOW_CONSUMPTIONORDER = _descriptor.EnumDescriptor( + name='ConsumptionOrder', + full_name='spotify.metadata.proto.Show.ConsumptionOrder', + filename=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + values=[ + _descriptor.EnumValueDescriptor( + name='SEQUENTIAL', + index=0, + number=1, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='EPISODIC', + index=1, + number=2, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='RECENT', + index=2, + number=3, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + ], + containing_type=None, + serialized_options=None, + serialized_start=3198, + serialized_end=3258, +) +_sym_db.RegisterEnumDescriptor(_SHOW_CONSUMPTIONORDER) + +_EPISODE_EPISODETYPE = _descriptor.EnumDescriptor( + name='EpisodeType', + full_name='spotify.metadata.proto.Episode.EpisodeType', + filename=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + values=[ + _descriptor.EnumValueDescriptor( + name='FULL', + index=0, + number=0, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='TRAILER', + index=1, + number=1, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='BONUS', + index=2, + number=2, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + ], + containing_type=None, + serialized_options=None, + serialized_start=4103, + serialized_end=4150, +) +_sym_db.RegisterEnumDescriptor(_EPISODE_EPISODETYPE) + +_IMAGE_SIZE = _descriptor.EnumDescriptor( + name='Size', + full_name='spotify.metadata.proto.Image.Size', + filename=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + values=[ + _descriptor.EnumValueDescriptor( + name='DEFAULT', + index=0, + number=0, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='SMALL', + index=1, + number=1, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='LARGE', + index=2, + number=2, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='XLARGE', + index=3, + number=3, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + ], + containing_type=None, + serialized_options=None, + serialized_start=4574, + serialized_end=4627, +) +_sym_db.RegisterEnumDescriptor(_IMAGE_SIZE) + +_COPYRIGHT_TYPE = _descriptor.EnumDescriptor( + name='Type', + full_name='spotify.metadata.proto.Copyright.Type', + filename=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + values=[ + _descriptor.EnumValueDescriptor( + name='P', + index=0, + number=0, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='C', + index=1, + number=1, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + ], + containing_type=None, + serialized_options=None, + serialized_start=4991, + serialized_end=5011, +) +_sym_db.RegisterEnumDescriptor(_COPYRIGHT_TYPE) + +_RESTRICTION_CATALOGUE = _descriptor.EnumDescriptor( + name='Catalogue', + full_name='spotify.metadata.proto.Restriction.Catalogue', + filename=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + values=[ + _descriptor.EnumValueDescriptor( + name='AD', + index=0, + number=0, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='SUBSCRIPTION', + index=1, + number=1, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='CATALOGUE_ALL', + index=2, + number=2, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='SHUFFLE', + index=3, + number=3, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='COMMERCIAL', + index=4, + number=4, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + ], + containing_type=None, + serialized_options=None, + serialized_start=5234, + serialized_end=5319, +) +_sym_db.RegisterEnumDescriptor(_RESTRICTION_CATALOGUE) + +_RESTRICTION_TYPE = _descriptor.EnumDescriptor( + name='Type', + full_name='spotify.metadata.proto.Restriction.Type', + filename=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + values=[ + _descriptor.EnumValueDescriptor( + name='STREAMING', + index=0, + number=0, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + ], + containing_type=None, + serialized_options=None, + serialized_start=5321, + serialized_end=5342, +) +_sym_db.RegisterEnumDescriptor(_RESTRICTION_TYPE) + +_AUDIOFILE_FORMAT = _descriptor.EnumDescriptor( + name='Format', + full_name='spotify.metadata.proto.AudioFile.Format', + filename=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + values=[ + _descriptor.EnumValueDescriptor( + name='OGG_VORBIS_96', + index=0, + number=0, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='OGG_VORBIS_160', + index=1, + number=1, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='OGG_VORBIS_320', + index=2, + number=2, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='MP3_256', + index=3, + number=3, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='MP3_320', + index=4, + number=4, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='MP3_160', + index=5, + number=5, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='MP3_96', + index=6, + number=6, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='MP3_160_ENC', + index=7, + number=7, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='AAC_24', + index=8, + number=8, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='AAC_48', + index=9, + number=9, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='AAC_24_NORM', + index=10, + number=16, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + ], + containing_type=None, + serialized_options=None, + serialized_start=5742, + serialized_end=5918, +) +_sym_db.RegisterEnumDescriptor(_AUDIOFILE_FORMAT) + +_ARTIST = _descriptor.Descriptor( + name='Artist', + full_name='spotify.metadata.proto.Artist', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='gid', + full_name='spotify.metadata.proto.Artist.gid', + index=0, + number=1, + type=12, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"", + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='name', + full_name='spotify.metadata.proto.Artist.name', + index=1, + number=2, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode('utf-8'), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='popularity', + full_name='spotify.metadata.proto.Artist.popularity', + index=2, + number=3, + type=17, + cpp_type=1, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='top_track', + full_name='spotify.metadata.proto.Artist.top_track', + index=3, + number=4, + type=11, + cpp_type=10, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='album_group', + full_name='spotify.metadata.proto.Artist.album_group', + index=4, + number=5, + type=11, + cpp_type=10, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='single_group', + full_name='spotify.metadata.proto.Artist.single_group', + index=5, + number=6, + type=11, + cpp_type=10, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='compilation_group', + full_name='spotify.metadata.proto.Artist.compilation_group', + index=6, + number=7, + type=11, + cpp_type=10, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='appears_on_group', + full_name='spotify.metadata.proto.Artist.appears_on_group', + index=7, + number=8, + type=11, + cpp_type=10, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='genre', + full_name='spotify.metadata.proto.Artist.genre', + index=8, + number=9, + type=9, + cpp_type=9, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='external_id', + full_name='spotify.metadata.proto.Artist.external_id', + index=9, + number=10, + type=11, + cpp_type=10, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='portrait', + full_name='spotify.metadata.proto.Artist.portrait', + index=10, + number=11, + type=11, + cpp_type=10, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='biography', + full_name='spotify.metadata.proto.Artist.biography', + index=11, + number=12, + type=11, + cpp_type=10, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='activity_period', + full_name='spotify.metadata.proto.Artist.activity_period', + index=12, + number=13, + type=11, + cpp_type=10, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='restriction', + full_name='spotify.metadata.proto.Artist.restriction', + index=13, + number=14, + type=11, + cpp_type=10, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='related', + full_name='spotify.metadata.proto.Artist.related', + index=14, + number=15, + type=11, + cpp_type=10, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='is_portrait_album_cover', + full_name='spotify.metadata.proto.Artist.is_portrait_album_cover', + index=15, + number=16, + type=8, + cpp_type=7, + label=1, + has_default_value=False, + default_value=False, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='portrait_group', + full_name='spotify.metadata.proto.Artist.portrait_group', + index=16, + number=17, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='sale_period', + full_name='spotify.metadata.proto.Artist.sale_period', + index=17, + number=18, + type=11, + cpp_type=10, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='availability', + full_name='spotify.metadata.proto.Artist.availability', + index=18, + number=20, + type=11, + cpp_type=10, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[], + serialized_start=43, + serialized_end=949, +) + +_ALBUM = _descriptor.Descriptor( + name='Album', + full_name='spotify.metadata.proto.Album', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='gid', + full_name='spotify.metadata.proto.Album.gid', + index=0, + number=1, + type=12, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"", + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='name', + full_name='spotify.metadata.proto.Album.name', + index=1, + number=2, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode('utf-8'), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='artist', + full_name='spotify.metadata.proto.Album.artist', + index=2, + number=3, + type=11, + cpp_type=10, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='type', + full_name='spotify.metadata.proto.Album.type', + index=3, + number=4, + type=14, + cpp_type=8, + label=1, + has_default_value=False, + default_value=1, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='label', + full_name='spotify.metadata.proto.Album.label', + index=4, + number=5, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode('utf-8'), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='date', + full_name='spotify.metadata.proto.Album.date', + index=5, + number=6, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='popularity', + full_name='spotify.metadata.proto.Album.popularity', + index=6, + number=7, + type=17, + cpp_type=1, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='genre', + full_name='spotify.metadata.proto.Album.genre', + index=7, + number=8, + type=9, + cpp_type=9, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='cover', + full_name='spotify.metadata.proto.Album.cover', + index=8, + number=9, + type=11, + cpp_type=10, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='external_id', + full_name='spotify.metadata.proto.Album.external_id', + index=9, + number=10, + type=11, + cpp_type=10, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='disc', + full_name='spotify.metadata.proto.Album.disc', + index=10, + number=11, + type=11, + cpp_type=10, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='review', + full_name='spotify.metadata.proto.Album.review', + index=11, + number=12, + type=9, + cpp_type=9, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='copyright', + full_name='spotify.metadata.proto.Album.copyright', + index=12, + number=13, + type=11, + cpp_type=10, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='restriction', + full_name='spotify.metadata.proto.Album.restriction', + index=13, + number=14, + type=11, + cpp_type=10, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='related', + full_name='spotify.metadata.proto.Album.related', + index=14, + number=15, + type=11, + cpp_type=10, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='sale_period', + full_name='spotify.metadata.proto.Album.sale_period', + index=15, + number=16, + type=11, + cpp_type=10, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='cover_group', + full_name='spotify.metadata.proto.Album.cover_group', + index=16, + number=17, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='original_title', + full_name='spotify.metadata.proto.Album.original_title', + index=17, + number=18, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode('utf-8'), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='version_title', + full_name='spotify.metadata.proto.Album.version_title', + index=18, + number=19, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode('utf-8'), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='type_str', + full_name='spotify.metadata.proto.Album.type_str', + index=19, + number=20, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode('utf-8'), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='availability', + full_name='spotify.metadata.proto.Album.availability', + index=20, + number=23, + type=11, + cpp_type=10, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + ], + extensions=[], + nested_types=[], + enum_types=[ + _ALBUM_TYPE, + ], + serialized_options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[], + serialized_start=952, + serialized_end=1824, +) + +_TRACK = _descriptor.Descriptor( + name='Track', + full_name='spotify.metadata.proto.Track', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='gid', + full_name='spotify.metadata.proto.Track.gid', + index=0, + number=1, + type=12, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"", + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='name', + full_name='spotify.metadata.proto.Track.name', + index=1, + number=2, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode('utf-8'), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='album', + full_name='spotify.metadata.proto.Track.album', + index=2, + number=3, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='artist', + full_name='spotify.metadata.proto.Track.artist', + index=3, + number=4, + type=11, + cpp_type=10, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='number', + full_name='spotify.metadata.proto.Track.number', + index=4, + number=5, + type=17, + cpp_type=1, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='disc_number', + full_name='spotify.metadata.proto.Track.disc_number', + index=5, + number=6, + type=17, + cpp_type=1, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='duration', + full_name='spotify.metadata.proto.Track.duration', + index=6, + number=7, + type=17, + cpp_type=1, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='popularity', + full_name='spotify.metadata.proto.Track.popularity', + index=7, + number=8, + type=17, + cpp_type=1, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='explicit', + full_name='spotify.metadata.proto.Track.explicit', + index=8, + number=9, + type=8, + cpp_type=7, + label=1, + has_default_value=False, + default_value=False, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='external_id', + full_name='spotify.metadata.proto.Track.external_id', + index=9, + number=10, + type=11, + cpp_type=10, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='restriction', + full_name='spotify.metadata.proto.Track.restriction', + index=10, + number=11, + type=11, + cpp_type=10, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='file', + full_name='spotify.metadata.proto.Track.file', + index=11, + number=12, + type=11, + cpp_type=10, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='alternative', + full_name='spotify.metadata.proto.Track.alternative', + index=12, + number=13, + type=11, + cpp_type=10, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='sale_period', + full_name='spotify.metadata.proto.Track.sale_period', + index=13, + number=14, + type=11, + cpp_type=10, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='preview', + full_name='spotify.metadata.proto.Track.preview', + index=14, + number=15, + type=11, + cpp_type=10, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='tags', + full_name='spotify.metadata.proto.Track.tags', + index=15, + number=16, + type=9, + cpp_type=9, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='earliest_live_timestamp', + full_name='spotify.metadata.proto.Track.earliest_live_timestamp', + index=16, + number=17, + type=3, + cpp_type=2, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='has_lyrics', + full_name='spotify.metadata.proto.Track.has_lyrics', + index=17, + number=18, + type=8, + cpp_type=7, + label=1, + has_default_value=False, + default_value=False, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='availability', + full_name='spotify.metadata.proto.Track.availability', + index=18, + number=19, + type=11, + cpp_type=10, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='licensor', + full_name='spotify.metadata.proto.Track.licensor', + index=19, + number=21, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[], + serialized_start=1827, + serialized_end=2552, +) + +_SHOW = _descriptor.Descriptor( + name='Show', + full_name='spotify.metadata.proto.Show', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='gid', + full_name='spotify.metadata.proto.Show.gid', + index=0, + number=1, + type=12, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"", + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='name', + full_name='spotify.metadata.proto.Show.name', + index=1, + number=2, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode('utf-8'), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='description', + full_name='spotify.metadata.proto.Show.description', + index=2, + number=64, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode('utf-8'), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='deprecated_popularity', + full_name='spotify.metadata.proto.Show.deprecated_popularity', + index=3, + number=65, + type=17, + cpp_type=1, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=b'\030\001', + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='publisher', + full_name='spotify.metadata.proto.Show.publisher', + index=4, + number=66, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode('utf-8'), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='language', + full_name='spotify.metadata.proto.Show.language', + index=5, + number=67, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode('utf-8'), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='explicit', + full_name='spotify.metadata.proto.Show.explicit', + index=6, + number=68, + type=8, + cpp_type=7, + label=1, + has_default_value=False, + default_value=False, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='cover_image', + full_name='spotify.metadata.proto.Show.cover_image', + index=7, + number=69, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='episode', + full_name='spotify.metadata.proto.Show.episode', + index=8, + number=70, + type=11, + cpp_type=10, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='copyright', + full_name='spotify.metadata.proto.Show.copyright', + index=9, + number=71, + type=11, + cpp_type=10, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='restriction', + full_name='spotify.metadata.proto.Show.restriction', + index=10, + number=72, + type=11, + cpp_type=10, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='keyword', + full_name='spotify.metadata.proto.Show.keyword', + index=11, + number=73, + type=9, + cpp_type=9, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='media_type', + full_name='spotify.metadata.proto.Show.media_type', + index=12, + number=74, + type=14, + cpp_type=8, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='consumption_order', + full_name='spotify.metadata.proto.Show.consumption_order', + index=13, + number=75, + type=14, + cpp_type=8, + label=1, + has_default_value=False, + default_value=1, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='availability', + full_name='spotify.metadata.proto.Show.availability', + index=14, + number=78, + type=11, + cpp_type=10, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='trailer_uri', + full_name='spotify.metadata.proto.Show.trailer_uri', + index=15, + number=83, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode('utf-8'), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + ], + extensions=[], + nested_types=[], + enum_types=[ + _SHOW_MEDIATYPE, + _SHOW_CONSUMPTIONORDER, + ], + serialized_options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[], + serialized_start=2555, + serialized_end=3258, +) + +_EPISODE = _descriptor.Descriptor( + name='Episode', + full_name='spotify.metadata.proto.Episode', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='gid', + full_name='spotify.metadata.proto.Episode.gid', + index=0, + number=1, + type=12, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"", + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='name', + full_name='spotify.metadata.proto.Episode.name', + index=1, + number=2, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode('utf-8'), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='duration', + full_name='spotify.metadata.proto.Episode.duration', + index=2, + number=7, + type=17, + cpp_type=1, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='audio', + full_name='spotify.metadata.proto.Episode.audio', + index=3, + number=12, + type=11, + cpp_type=10, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='description', + full_name='spotify.metadata.proto.Episode.description', + index=4, + number=64, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode('utf-8'), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='number', + full_name='spotify.metadata.proto.Episode.number', + index=5, + number=65, + type=17, + cpp_type=1, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='publish_time', + full_name='spotify.metadata.proto.Episode.publish_time', + index=6, + number=66, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='deprecated_popularity', + full_name='spotify.metadata.proto.Episode.deprecated_popularity', + index=7, + number=67, + type=17, + cpp_type=1, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=b'\030\001', + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='cover_image', + full_name='spotify.metadata.proto.Episode.cover_image', + index=8, + number=68, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='language', + full_name='spotify.metadata.proto.Episode.language', + index=9, + number=69, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode('utf-8'), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='explicit', + full_name='spotify.metadata.proto.Episode.explicit', + index=10, + number=70, + type=8, + cpp_type=7, + label=1, + has_default_value=False, + default_value=False, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='show', + full_name='spotify.metadata.proto.Episode.show', + index=11, + number=71, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='video', + full_name='spotify.metadata.proto.Episode.video', + index=12, + number=72, + type=11, + cpp_type=10, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='video_preview', + full_name='spotify.metadata.proto.Episode.video_preview', + index=13, + number=73, + type=11, + cpp_type=10, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='audio_preview', + full_name='spotify.metadata.proto.Episode.audio_preview', + index=14, + number=74, + type=11, + cpp_type=10, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='restriction', + full_name='spotify.metadata.proto.Episode.restriction', + index=15, + number=75, + type=11, + cpp_type=10, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='freeze_frame', + full_name='spotify.metadata.proto.Episode.freeze_frame', + index=16, + number=76, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='keyword', + full_name='spotify.metadata.proto.Episode.keyword', + index=17, + number=77, + type=9, + cpp_type=9, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='allow_background_playback', + full_name= + 'spotify.metadata.proto.Episode.allow_background_playback', + index=18, + number=81, + type=8, + cpp_type=7, + label=1, + has_default_value=False, + default_value=False, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='availability', + full_name='spotify.metadata.proto.Episode.availability', + index=19, + number=82, + type=11, + cpp_type=10, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='external_url', + full_name='spotify.metadata.proto.Episode.external_url', + index=20, + number=83, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode('utf-8'), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='type', + full_name='spotify.metadata.proto.Episode.type', + index=21, + number=87, + type=14, + cpp_type=8, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + ], + extensions=[], + nested_types=[], + enum_types=[ + _EPISODE_EPISODETYPE, + ], + serialized_options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[], + serialized_start=3261, + serialized_end=4150, +) + +_LICENSOR = _descriptor.Descriptor( + name='Licensor', + full_name='spotify.metadata.proto.Licensor', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='uuid', + full_name='spotify.metadata.proto.Licensor.uuid', + index=0, + number=1, + type=12, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"", + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[], + serialized_start=4152, + serialized_end=4176, +) + +_TOPTRACKS = _descriptor.Descriptor( + name='TopTracks', + full_name='spotify.metadata.proto.TopTracks', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='country', + full_name='spotify.metadata.proto.TopTracks.country', + index=0, + number=1, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode('utf-8'), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='track', + full_name='spotify.metadata.proto.TopTracks.track', + index=1, + number=2, + type=11, + cpp_type=10, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[], + serialized_start=4178, + serialized_end=4252, +) + +_ACTIVITYPERIOD = _descriptor.Descriptor( + name='ActivityPeriod', + full_name='spotify.metadata.proto.ActivityPeriod', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='start_year', + full_name='spotify.metadata.proto.ActivityPeriod.start_year', + index=0, + number=1, + type=17, + cpp_type=1, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='end_year', + full_name='spotify.metadata.proto.ActivityPeriod.end_year', + index=1, + number=2, + type=17, + cpp_type=1, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='decade', + full_name='spotify.metadata.proto.ActivityPeriod.decade', + index=2, + number=3, + type=17, + cpp_type=1, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[], + serialized_start=4254, + serialized_end=4324, +) + +_ALBUMGROUP = _descriptor.Descriptor( + name='AlbumGroup', + full_name='spotify.metadata.proto.AlbumGroup', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='album', + full_name='spotify.metadata.proto.AlbumGroup.album', + index=0, + number=1, + type=11, + cpp_type=10, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[], + serialized_start=4326, + serialized_end=4384, +) + +_DATE = _descriptor.Descriptor( + name='Date', + full_name='spotify.metadata.proto.Date', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='year', + full_name='spotify.metadata.proto.Date.year', + index=0, + number=1, + type=17, + cpp_type=1, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='month', + full_name='spotify.metadata.proto.Date.month', + index=1, + number=2, + type=17, + cpp_type=1, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='day', + full_name='spotify.metadata.proto.Date.day', + index=2, + number=3, + type=17, + cpp_type=1, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='hour', + full_name='spotify.metadata.proto.Date.hour', + index=3, + number=4, + type=17, + cpp_type=1, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='minute', + full_name='spotify.metadata.proto.Date.minute', + index=4, + number=5, + type=17, + cpp_type=1, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[], + serialized_start=4386, + serialized_end=4464, +) + +_IMAGE = _descriptor.Descriptor( + name='Image', + full_name='spotify.metadata.proto.Image', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='file_id', + full_name='spotify.metadata.proto.Image.file_id', + index=0, + number=1, + type=12, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"", + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='size', + full_name='spotify.metadata.proto.Image.size', + index=1, + number=2, + type=14, + cpp_type=8, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='width', + full_name='spotify.metadata.proto.Image.width', + index=2, + number=3, + type=17, + cpp_type=1, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='height', + full_name='spotify.metadata.proto.Image.height', + index=3, + number=4, + type=17, + cpp_type=1, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + ], + extensions=[], + nested_types=[], + enum_types=[ + _IMAGE_SIZE, + ], + serialized_options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[], + serialized_start=4467, + serialized_end=4627, +) + +_IMAGEGROUP = _descriptor.Descriptor( + name='ImageGroup', + full_name='spotify.metadata.proto.ImageGroup', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='image', + full_name='spotify.metadata.proto.ImageGroup.image', + index=0, + number=1, + type=11, + cpp_type=10, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[], + serialized_start=4629, + serialized_end=4687, +) + +_BIOGRAPHY = _descriptor.Descriptor( + name='Biography', + full_name='spotify.metadata.proto.Biography', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='text', + full_name='spotify.metadata.proto.Biography.text', + index=0, + number=1, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode('utf-8'), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='portrait', + full_name='spotify.metadata.proto.Biography.portrait', + index=1, + number=2, + type=11, + cpp_type=10, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='portrait_group', + full_name='spotify.metadata.proto.Biography.portrait_group', + index=2, + number=3, + type=11, + cpp_type=10, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[], + serialized_start=4690, + serialized_end=4824, +) + +_DISC = _descriptor.Descriptor( + name='Disc', + full_name='spotify.metadata.proto.Disc', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='number', + full_name='spotify.metadata.proto.Disc.number', + index=0, + number=1, + type=17, + cpp_type=1, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='name', + full_name='spotify.metadata.proto.Disc.name', + index=1, + number=2, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode('utf-8'), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='track', + full_name='spotify.metadata.proto.Disc.track', + index=2, + number=3, + type=11, + cpp_type=10, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[], + serialized_start=4826, + serialized_end=4908, +) + +_COPYRIGHT = _descriptor.Descriptor( + name='Copyright', + full_name='spotify.metadata.proto.Copyright', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='type', + full_name='spotify.metadata.proto.Copyright.type', + index=0, + number=1, + type=14, + cpp_type=8, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='text', + full_name='spotify.metadata.proto.Copyright.text', + index=1, + number=2, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode('utf-8'), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + ], + extensions=[], + nested_types=[], + enum_types=[ + _COPYRIGHT_TYPE, + ], + serialized_options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[], + serialized_start=4910, + serialized_end=5011, +) + +_RESTRICTION = _descriptor.Descriptor( + name='Restriction', + full_name='spotify.metadata.proto.Restriction', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='catalogue', + full_name='spotify.metadata.proto.Restriction.catalogue', + index=0, + number=1, + type=14, + cpp_type=8, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='type', + full_name='spotify.metadata.proto.Restriction.type', + index=1, + number=4, + type=14, + cpp_type=8, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='catalogue_str', + full_name='spotify.metadata.proto.Restriction.catalogue_str', + index=2, + number=5, + type=9, + cpp_type=9, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='countries_allowed', + full_name='spotify.metadata.proto.Restriction.countries_allowed', + index=3, + number=2, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode('utf-8'), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='countries_forbidden', + full_name='spotify.metadata.proto.Restriction.countries_forbidden', + index=4, + number=3, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode('utf-8'), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + ], + extensions=[], + nested_types=[], + enum_types=[ + _RESTRICTION_CATALOGUE, + _RESTRICTION_TYPE, + ], + serialized_options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[ + _descriptor.OneofDescriptor( + name='country_restriction', + full_name='spotify.metadata.proto.Restriction.country_restriction', + index=0, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[]), + ], + serialized_start=5014, + serialized_end=5365, +) + +_AVAILABILITY = _descriptor.Descriptor( + name='Availability', + full_name='spotify.metadata.proto.Availability', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='catalogue_str', + full_name='spotify.metadata.proto.Availability.catalogue_str', + index=0, + number=1, + type=9, + cpp_type=9, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='start', + full_name='spotify.metadata.proto.Availability.start', + index=1, + number=2, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[], + serialized_start=5367, + serialized_end=5449, +) + +_SALEPERIOD = _descriptor.Descriptor( + name='SalePeriod', + full_name='spotify.metadata.proto.SalePeriod', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='restriction', + full_name='spotify.metadata.proto.SalePeriod.restriction', + index=0, + number=1, + type=11, + cpp_type=10, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='start', + full_name='spotify.metadata.proto.SalePeriod.start', + index=1, + number=2, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='end', + full_name='spotify.metadata.proto.SalePeriod.end', + index=2, + number=3, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[], + serialized_start=5452, + serialized_end=5610, +) + +_EXTERNALID = _descriptor.Descriptor( + name='ExternalId', + full_name='spotify.metadata.proto.ExternalId', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='type', + full_name='spotify.metadata.proto.ExternalId.type', + index=0, + number=1, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode('utf-8'), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='id', + full_name='spotify.metadata.proto.ExternalId.id', + index=1, + number=2, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode('utf-8'), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[], + serialized_start=5612, + serialized_end=5650, +) + +_AUDIOFILE = _descriptor.Descriptor( + name='AudioFile', + full_name='spotify.metadata.proto.AudioFile', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='file_id', + full_name='spotify.metadata.proto.AudioFile.file_id', + index=0, + number=1, + type=12, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"", + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='format', + full_name='spotify.metadata.proto.AudioFile.format', + index=1, + number=2, + type=14, + cpp_type=8, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + ], + extensions=[], + nested_types=[], + enum_types=[ + _AUDIOFILE_FORMAT, + ], + serialized_options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[], + serialized_start=5653, + serialized_end=5918, +) + +_VIDEOFILE = _descriptor.Descriptor( + name='VideoFile', + full_name='spotify.metadata.proto.VideoFile', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='file_id', + full_name='spotify.metadata.proto.VideoFile.file_id', + index=0, + number=1, + type=12, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"", + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[], + serialized_start=5920, + serialized_end=5948, +) + +_ARTIST.fields_by_name['top_track'].message_type = _TOPTRACKS +_ARTIST.fields_by_name['album_group'].message_type = _ALBUMGROUP +_ARTIST.fields_by_name['single_group'].message_type = _ALBUMGROUP +_ARTIST.fields_by_name['compilation_group'].message_type = _ALBUMGROUP +_ARTIST.fields_by_name['appears_on_group'].message_type = _ALBUMGROUP +_ARTIST.fields_by_name['external_id'].message_type = _EXTERNALID +_ARTIST.fields_by_name['portrait'].message_type = _IMAGE +_ARTIST.fields_by_name['biography'].message_type = _BIOGRAPHY +_ARTIST.fields_by_name['activity_period'].message_type = _ACTIVITYPERIOD +_ARTIST.fields_by_name['restriction'].message_type = _RESTRICTION +_ARTIST.fields_by_name['related'].message_type = _ARTIST +_ARTIST.fields_by_name['portrait_group'].message_type = _IMAGEGROUP +_ARTIST.fields_by_name['sale_period'].message_type = _SALEPERIOD +_ARTIST.fields_by_name['availability'].message_type = _AVAILABILITY +_ALBUM.fields_by_name['artist'].message_type = _ARTIST +_ALBUM.fields_by_name['type'].enum_type = _ALBUM_TYPE +_ALBUM.fields_by_name['date'].message_type = _DATE +_ALBUM.fields_by_name['cover'].message_type = _IMAGE +_ALBUM.fields_by_name['external_id'].message_type = _EXTERNALID +_ALBUM.fields_by_name['disc'].message_type = _DISC +_ALBUM.fields_by_name['copyright'].message_type = _COPYRIGHT +_ALBUM.fields_by_name['restriction'].message_type = _RESTRICTION +_ALBUM.fields_by_name['related'].message_type = _ALBUM +_ALBUM.fields_by_name['sale_period'].message_type = _SALEPERIOD +_ALBUM.fields_by_name['cover_group'].message_type = _IMAGEGROUP +_ALBUM.fields_by_name['availability'].message_type = _AVAILABILITY +_ALBUM_TYPE.containing_type = _ALBUM +_TRACK.fields_by_name['album'].message_type = _ALBUM +_TRACK.fields_by_name['artist'].message_type = _ARTIST +_TRACK.fields_by_name['external_id'].message_type = _EXTERNALID +_TRACK.fields_by_name['restriction'].message_type = _RESTRICTION +_TRACK.fields_by_name['file'].message_type = _AUDIOFILE +_TRACK.fields_by_name['alternative'].message_type = _TRACK +_TRACK.fields_by_name['sale_period'].message_type = _SALEPERIOD +_TRACK.fields_by_name['preview'].message_type = _AUDIOFILE +_TRACK.fields_by_name['availability'].message_type = _AVAILABILITY +_TRACK.fields_by_name['licensor'].message_type = _LICENSOR +_SHOW.fields_by_name['cover_image'].message_type = _IMAGEGROUP +_SHOW.fields_by_name['episode'].message_type = _EPISODE +_SHOW.fields_by_name['copyright'].message_type = _COPYRIGHT +_SHOW.fields_by_name['restriction'].message_type = _RESTRICTION +_SHOW.fields_by_name['media_type'].enum_type = _SHOW_MEDIATYPE +_SHOW.fields_by_name['consumption_order'].enum_type = _SHOW_CONSUMPTIONORDER +_SHOW.fields_by_name['availability'].message_type = _AVAILABILITY +_SHOW_MEDIATYPE.containing_type = _SHOW +_SHOW_CONSUMPTIONORDER.containing_type = _SHOW +_EPISODE.fields_by_name['audio'].message_type = _AUDIOFILE +_EPISODE.fields_by_name['publish_time'].message_type = _DATE +_EPISODE.fields_by_name['cover_image'].message_type = _IMAGEGROUP +_EPISODE.fields_by_name['show'].message_type = _SHOW +_EPISODE.fields_by_name['video'].message_type = _VIDEOFILE +_EPISODE.fields_by_name['video_preview'].message_type = _VIDEOFILE +_EPISODE.fields_by_name['audio_preview'].message_type = _AUDIOFILE +_EPISODE.fields_by_name['restriction'].message_type = _RESTRICTION +_EPISODE.fields_by_name['freeze_frame'].message_type = _IMAGEGROUP +_EPISODE.fields_by_name['availability'].message_type = _AVAILABILITY +_EPISODE.fields_by_name['type'].enum_type = _EPISODE_EPISODETYPE +_EPISODE_EPISODETYPE.containing_type = _EPISODE +_TOPTRACKS.fields_by_name['track'].message_type = _TRACK +_ALBUMGROUP.fields_by_name['album'].message_type = _ALBUM +_IMAGE.fields_by_name['size'].enum_type = _IMAGE_SIZE +_IMAGE_SIZE.containing_type = _IMAGE +_IMAGEGROUP.fields_by_name['image'].message_type = _IMAGE +_BIOGRAPHY.fields_by_name['portrait'].message_type = _IMAGE +_BIOGRAPHY.fields_by_name['portrait_group'].message_type = _IMAGEGROUP +_DISC.fields_by_name['track'].message_type = _TRACK +_COPYRIGHT.fields_by_name['type'].enum_type = _COPYRIGHT_TYPE +_COPYRIGHT_TYPE.containing_type = _COPYRIGHT +_RESTRICTION.fields_by_name['catalogue'].enum_type = _RESTRICTION_CATALOGUE +_RESTRICTION.fields_by_name['type'].enum_type = _RESTRICTION_TYPE +_RESTRICTION_CATALOGUE.containing_type = _RESTRICTION +_RESTRICTION_TYPE.containing_type = _RESTRICTION +_RESTRICTION.oneofs_by_name['country_restriction'].fields.append( + _RESTRICTION.fields_by_name['countries_allowed']) +_RESTRICTION.fields_by_name[ + 'countries_allowed'].containing_oneof = _RESTRICTION.oneofs_by_name[ + 'country_restriction'] +_RESTRICTION.oneofs_by_name['country_restriction'].fields.append( + _RESTRICTION.fields_by_name['countries_forbidden']) +_RESTRICTION.fields_by_name[ + 'countries_forbidden'].containing_oneof = _RESTRICTION.oneofs_by_name[ + 'country_restriction'] +_AVAILABILITY.fields_by_name['start'].message_type = _DATE +_SALEPERIOD.fields_by_name['restriction'].message_type = _RESTRICTION +_SALEPERIOD.fields_by_name['start'].message_type = _DATE +_SALEPERIOD.fields_by_name['end'].message_type = _DATE +_AUDIOFILE.fields_by_name['format'].enum_type = _AUDIOFILE_FORMAT +_AUDIOFILE_FORMAT.containing_type = _AUDIOFILE +DESCRIPTOR.message_types_by_name['Artist'] = _ARTIST +DESCRIPTOR.message_types_by_name['Album'] = _ALBUM +DESCRIPTOR.message_types_by_name['Track'] = _TRACK +DESCRIPTOR.message_types_by_name['Show'] = _SHOW +DESCRIPTOR.message_types_by_name['Episode'] = _EPISODE +DESCRIPTOR.message_types_by_name['Licensor'] = _LICENSOR +DESCRIPTOR.message_types_by_name['TopTracks'] = _TOPTRACKS +DESCRIPTOR.message_types_by_name['ActivityPeriod'] = _ACTIVITYPERIOD +DESCRIPTOR.message_types_by_name['AlbumGroup'] = _ALBUMGROUP +DESCRIPTOR.message_types_by_name['Date'] = _DATE +DESCRIPTOR.message_types_by_name['Image'] = _IMAGE +DESCRIPTOR.message_types_by_name['ImageGroup'] = _IMAGEGROUP +DESCRIPTOR.message_types_by_name['Biography'] = _BIOGRAPHY +DESCRIPTOR.message_types_by_name['Disc'] = _DISC +DESCRIPTOR.message_types_by_name['Copyright'] = _COPYRIGHT +DESCRIPTOR.message_types_by_name['Restriction'] = _RESTRICTION +DESCRIPTOR.message_types_by_name['Availability'] = _AVAILABILITY +DESCRIPTOR.message_types_by_name['SalePeriod'] = _SALEPERIOD +DESCRIPTOR.message_types_by_name['ExternalId'] = _EXTERNALID +DESCRIPTOR.message_types_by_name['AudioFile'] = _AUDIOFILE +DESCRIPTOR.message_types_by_name['VideoFile'] = _VIDEOFILE +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +Artist = _reflection.GeneratedProtocolMessageType( + 'Artist', + (_message.Message, ), + { + 'DESCRIPTOR': _ARTIST, + '__module__': 'metadata_pb2' + # @@protoc_insertion_point(class_scope:spotify.metadata.proto.Artist) + }) +_sym_db.RegisterMessage(Artist) + +Album = _reflection.GeneratedProtocolMessageType( + 'Album', + (_message.Message, ), + { + 'DESCRIPTOR': _ALBUM, + '__module__': 'metadata_pb2' + # @@protoc_insertion_point(class_scope:spotify.metadata.proto.Album) + }) +_sym_db.RegisterMessage(Album) + +Track = _reflection.GeneratedProtocolMessageType( + 'Track', + (_message.Message, ), + { + 'DESCRIPTOR': _TRACK, + '__module__': 'metadata_pb2' + # @@protoc_insertion_point(class_scope:spotify.metadata.proto.Track) + }) +_sym_db.RegisterMessage(Track) + +Show = _reflection.GeneratedProtocolMessageType( + 'Show', + (_message.Message, ), + { + 'DESCRIPTOR': _SHOW, + '__module__': 'metadata_pb2' + # @@protoc_insertion_point(class_scope:spotify.metadata.proto.Show) + }) +_sym_db.RegisterMessage(Show) + +Episode = _reflection.GeneratedProtocolMessageType( + 'Episode', + (_message.Message, ), + { + 'DESCRIPTOR': _EPISODE, + '__module__': 'metadata_pb2' + # @@protoc_insertion_point(class_scope:spotify.metadata.proto.Episode) + }) +_sym_db.RegisterMessage(Episode) + +Licensor = _reflection.GeneratedProtocolMessageType( + 'Licensor', + (_message.Message, ), + { + 'DESCRIPTOR': _LICENSOR, + '__module__': 'metadata_pb2' + # @@protoc_insertion_point(class_scope:spotify.metadata.proto.Licensor) + }) +_sym_db.RegisterMessage(Licensor) + +TopTracks = _reflection.GeneratedProtocolMessageType( + 'TopTracks', + (_message.Message, ), + { + 'DESCRIPTOR': _TOPTRACKS, + '__module__': 'metadata_pb2' + # @@protoc_insertion_point(class_scope:spotify.metadata.proto.TopTracks) + }) +_sym_db.RegisterMessage(TopTracks) + +ActivityPeriod = _reflection.GeneratedProtocolMessageType( + 'ActivityPeriod', + (_message.Message, ), + { + 'DESCRIPTOR': _ACTIVITYPERIOD, + '__module__': 'metadata_pb2' + # @@protoc_insertion_point(class_scope:spotify.metadata.proto.ActivityPeriod) + }) +_sym_db.RegisterMessage(ActivityPeriod) + +AlbumGroup = _reflection.GeneratedProtocolMessageType( + 'AlbumGroup', + (_message.Message, ), + { + 'DESCRIPTOR': _ALBUMGROUP, + '__module__': 'metadata_pb2' + # @@protoc_insertion_point(class_scope:spotify.metadata.proto.AlbumGroup) + }) +_sym_db.RegisterMessage(AlbumGroup) + +Date = _reflection.GeneratedProtocolMessageType( + 'Date', + (_message.Message, ), + { + 'DESCRIPTOR': _DATE, + '__module__': 'metadata_pb2' + # @@protoc_insertion_point(class_scope:spotify.metadata.proto.Date) + }) +_sym_db.RegisterMessage(Date) + +Image = _reflection.GeneratedProtocolMessageType( + 'Image', + (_message.Message, ), + { + 'DESCRIPTOR': _IMAGE, + '__module__': 'metadata_pb2' + # @@protoc_insertion_point(class_scope:spotify.metadata.proto.Image) + }) +_sym_db.RegisterMessage(Image) + +ImageGroup = _reflection.GeneratedProtocolMessageType( + 'ImageGroup', + (_message.Message, ), + { + 'DESCRIPTOR': _IMAGEGROUP, + '__module__': 'metadata_pb2' + # @@protoc_insertion_point(class_scope:spotify.metadata.proto.ImageGroup) + }) +_sym_db.RegisterMessage(ImageGroup) + +Biography = _reflection.GeneratedProtocolMessageType( + 'Biography', + (_message.Message, ), + { + 'DESCRIPTOR': _BIOGRAPHY, + '__module__': 'metadata_pb2' + # @@protoc_insertion_point(class_scope:spotify.metadata.proto.Biography) + }) +_sym_db.RegisterMessage(Biography) + +Disc = _reflection.GeneratedProtocolMessageType( + 'Disc', + (_message.Message, ), + { + 'DESCRIPTOR': _DISC, + '__module__': 'metadata_pb2' + # @@protoc_insertion_point(class_scope:spotify.metadata.proto.Disc) + }) +_sym_db.RegisterMessage(Disc) + +Copyright = _reflection.GeneratedProtocolMessageType( + 'Copyright', + (_message.Message, ), + { + 'DESCRIPTOR': _COPYRIGHT, + '__module__': 'metadata_pb2' + # @@protoc_insertion_point(class_scope:spotify.metadata.proto.Copyright) + }) +_sym_db.RegisterMessage(Copyright) + +Restriction = _reflection.GeneratedProtocolMessageType( + 'Restriction', + (_message.Message, ), + { + 'DESCRIPTOR': _RESTRICTION, + '__module__': 'metadata_pb2' + # @@protoc_insertion_point(class_scope:spotify.metadata.proto.Restriction) + }) +_sym_db.RegisterMessage(Restriction) + +Availability = _reflection.GeneratedProtocolMessageType( + 'Availability', + (_message.Message, ), + { + 'DESCRIPTOR': _AVAILABILITY, + '__module__': 'metadata_pb2' + # @@protoc_insertion_point(class_scope:spotify.metadata.proto.Availability) + }) +_sym_db.RegisterMessage(Availability) + +SalePeriod = _reflection.GeneratedProtocolMessageType( + 'SalePeriod', + (_message.Message, ), + { + 'DESCRIPTOR': _SALEPERIOD, + '__module__': 'metadata_pb2' + # @@protoc_insertion_point(class_scope:spotify.metadata.proto.SalePeriod) + }) +_sym_db.RegisterMessage(SalePeriod) + +ExternalId = _reflection.GeneratedProtocolMessageType( + 'ExternalId', + (_message.Message, ), + { + 'DESCRIPTOR': _EXTERNALID, + '__module__': 'metadata_pb2' + # @@protoc_insertion_point(class_scope:spotify.metadata.proto.ExternalId) + }) +_sym_db.RegisterMessage(ExternalId) + +AudioFile = _reflection.GeneratedProtocolMessageType( + 'AudioFile', + (_message.Message, ), + { + 'DESCRIPTOR': _AUDIOFILE, + '__module__': 'metadata_pb2' + # @@protoc_insertion_point(class_scope:spotify.metadata.proto.AudioFile) + }) +_sym_db.RegisterMessage(AudioFile) + +VideoFile = _reflection.GeneratedProtocolMessageType( + 'VideoFile', + (_message.Message, ), + { + 'DESCRIPTOR': _VIDEOFILE, + '__module__': 'metadata_pb2' + # @@protoc_insertion_point(class_scope:spotify.metadata.proto.VideoFile) + }) +_sym_db.RegisterMessage(VideoFile) + +DESCRIPTOR._options = None +_SHOW.fields_by_name['deprecated_popularity']._options = None +_EPISODE.fields_by_name['deprecated_popularity']._options = None +# @@protoc_insertion_point(module_scope) diff --git a/librespot/proto/PlayOrigin_pb2.py b/librespot/proto/PlayOrigin_pb2.py new file mode 100644 index 0000000..64b3efe --- /dev/null +++ b/librespot/proto/PlayOrigin_pb2.py @@ -0,0 +1,193 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: play_origin.proto +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database + +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + +DESCRIPTOR = _descriptor.FileDescriptor( + name="play_origin.proto", + package="spotify.player.proto", + syntax="proto2", + serialized_options=b"\n\023com.spotify.contextH\002", + create_key=_descriptor._internal_create_key, + serialized_pb= + b'\n\x11play_origin.proto\x12\x14spotify.player.proto"\xbf\x01\n\nPlayOrigin\x12\x1a\n\x12\x66\x65\x61ture_identifier\x18\x01 \x01(\t\x12\x17\n\x0f\x66\x65\x61ture_version\x18\x02 \x01(\t\x12\x10\n\x08view_uri\x18\x03 \x01(\t\x12\x19\n\x11\x65xternal_referrer\x18\x04 \x01(\t\x12\x1b\n\x13referrer_identifier\x18\x05 \x01(\t\x12\x19\n\x11\x64\x65vice_identifier\x18\x06 \x01(\t\x12\x17\n\x0f\x66\x65\x61ture_classes\x18\x07 \x03(\tB\x17\n\x13\x63om.spotify.contextH\x02', +) + +_PLAYORIGIN = _descriptor.Descriptor( + name="PlayOrigin", + full_name="spotify.player.proto.PlayOrigin", + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name="feature_identifier", + full_name="spotify.player.proto.PlayOrigin.feature_identifier", + index=0, + number=1, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="feature_version", + full_name="spotify.player.proto.PlayOrigin.feature_version", + index=1, + number=2, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="view_uri", + full_name="spotify.player.proto.PlayOrigin.view_uri", + index=2, + number=3, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="external_referrer", + full_name="spotify.player.proto.PlayOrigin.external_referrer", + index=3, + number=4, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="referrer_identifier", + full_name="spotify.player.proto.PlayOrigin.referrer_identifier", + index=4, + number=5, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="device_identifier", + full_name="spotify.player.proto.PlayOrigin.device_identifier", + index=5, + number=6, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="feature_classes", + full_name="spotify.player.proto.PlayOrigin.feature_classes", + index=6, + number=7, + type=9, + cpp_type=9, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax="proto2", + extension_ranges=[], + oneofs=[], + serialized_start=44, + serialized_end=235, +) + +DESCRIPTOR.message_types_by_name["PlayOrigin"] = _PLAYORIGIN +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +PlayOrigin = _reflection.GeneratedProtocolMessageType( + "PlayOrigin", + (_message.Message, ), + { + "DESCRIPTOR": _PLAYORIGIN, + "__module__": "play_origin_pb2" + # @@protoc_insertion_point(class_scope:spotify.player.proto.PlayOrigin) + }, +) +_sym_db.RegisterMessage(PlayOrigin) + +DESCRIPTOR._options = None +# @@protoc_insertion_point(module_scope) diff --git a/librespot/proto/Playback_pb2.py b/librespot/proto/Playback_pb2.py new file mode 100644 index 0000000..881cfeb --- /dev/null +++ b/librespot/proto/Playback_pb2.py @@ -0,0 +1,162 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: playback.proto +"""Generated protocol buffer code.""" +import ContextTrack_pb2 as context__track__pb2 +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database + +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + +DESCRIPTOR = _descriptor.FileDescriptor( + name="playback.proto", + package="spotify.player.proto.transfer", + syntax="proto2", + serialized_options=b"\n\024com.spotify.transferH\002", + create_key=_descriptor._internal_create_key, + serialized_pb= + b'\n\x0eplayback.proto\x12\x1dspotify.player.proto.transfer\x1a\x13\x63ontext_track.proto"\xa5\x01\n\x08Playback\x12\x11\n\ttimestamp\x18\x01 \x01(\x03\x12 \n\x18position_as_of_timestamp\x18\x02 \x01(\x05\x12\x16\n\x0eplayback_speed\x18\x03 \x01(\x01\x12\x11\n\tis_paused\x18\x04 \x01(\x08\x12\x39\n\rcurrent_track\x18\x05 \x01(\x0b\x32".spotify.player.proto.ContextTrackB\x18\n\x14\x63om.spotify.transferH\x02', + dependencies=[ + context__track__pb2.DESCRIPTOR, + ], +) + +_PLAYBACK = _descriptor.Descriptor( + name="Playback", + full_name="spotify.player.proto.transfer.Playback", + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name="timestamp", + full_name="spotify.player.proto.transfer.Playback.timestamp", + index=0, + number=1, + type=3, + cpp_type=2, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="position_as_of_timestamp", + full_name= + "spotify.player.proto.transfer.Playback.position_as_of_timestamp", + index=1, + number=2, + type=5, + cpp_type=1, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="playback_speed", + full_name="spotify.player.proto.transfer.Playback.playback_speed", + index=2, + number=3, + type=1, + cpp_type=5, + label=1, + has_default_value=False, + default_value=float(0), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="is_paused", + full_name="spotify.player.proto.transfer.Playback.is_paused", + index=3, + number=4, + type=8, + cpp_type=7, + label=1, + has_default_value=False, + default_value=False, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="current_track", + full_name="spotify.player.proto.transfer.Playback.current_track", + index=4, + number=5, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax="proto2", + extension_ranges=[], + oneofs=[], + serialized_start=71, + serialized_end=236, +) + +_PLAYBACK.fields_by_name[ + "current_track"].message_type = context__track__pb2._CONTEXTTRACK +DESCRIPTOR.message_types_by_name["Playback"] = _PLAYBACK +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +Playback = _reflection.GeneratedProtocolMessageType( + "Playback", + (_message.Message, ), + { + "DESCRIPTOR": _PLAYBACK, + "__module__": "playback_pb2" + # @@protoc_insertion_point(class_scope:spotify.player.proto.transfer.Playback) + }, +) +_sym_db.RegisterMessage(Playback) + +DESCRIPTOR._options = None +# @@protoc_insertion_point(module_scope) diff --git a/librespot/proto/Player_pb2.py b/librespot/proto/Player_pb2.py new file mode 100644 index 0000000..cd267de --- /dev/null +++ b/librespot/proto/Player_pb2.py @@ -0,0 +1,1851 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: player.proto +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + +DESCRIPTOR = _descriptor.FileDescriptor( + name='player.proto', + package='connectstate', + syntax='proto3', + serialized_options=b'\n\030com.spotify.connectstateH\002', + create_key=_descriptor._internal_create_key, + serialized_pb= + b'\n\x0cplayer.proto\x12\x0c\x63onnectstate\"\xea\x08\n\x0bPlayerState\x12\x11\n\ttimestamp\x18\x01 \x01(\x03\x12\x13\n\x0b\x63ontext_uri\x18\x02 \x01(\t\x12\x13\n\x0b\x63ontext_url\x18\x03 \x01(\t\x12\x38\n\x14\x63ontext_restrictions\x18\x04 \x01(\x0b\x32\x1a.connectstate.Restrictions\x12-\n\x0bplay_origin\x18\x05 \x01(\x0b\x32\x18.connectstate.PlayOrigin\x12)\n\x05index\x18\x06 \x01(\x0b\x32\x1a.connectstate.ContextIndex\x12*\n\x05track\x18\x07 \x01(\x0b\x32\x1b.connectstate.ProvidedTrack\x12\x13\n\x0bplayback_id\x18\x08 \x01(\t\x12\x16\n\x0eplayback_speed\x18\t \x01(\x01\x12 \n\x18position_as_of_timestamp\x18\n \x01(\x03\x12\x10\n\x08\x64uration\x18\x0b \x01(\x03\x12\x12\n\nis_playing\x18\x0c \x01(\x08\x12\x11\n\tis_paused\x18\r \x01(\x08\x12\x14\n\x0cis_buffering\x18\x0e \x01(\x08\x12\x1b\n\x13is_system_initiated\x18\x0f \x01(\x08\x12\x33\n\x07options\x18\x10 \x01(\x0b\x32\".connectstate.ContextPlayerOptions\x12\x30\n\x0crestrictions\x18\x11 \x01(\x0b\x32\x1a.connectstate.Restrictions\x12\x30\n\x0csuppressions\x18\x12 \x01(\x0b\x32\x1a.connectstate.Suppressions\x12\x30\n\x0bprev_tracks\x18\x13 \x03(\x0b\x32\x1b.connectstate.ProvidedTrack\x12\x30\n\x0bnext_tracks\x18\x14 \x03(\x0b\x32\x1b.connectstate.ProvidedTrack\x12H\n\x10\x63ontext_metadata\x18\x15 \x03(\x0b\x32..connectstate.PlayerState.ContextMetadataEntry\x12\x42\n\rpage_metadata\x18\x16 \x03(\x0b\x32+.connectstate.PlayerState.PageMetadataEntry\x12\x12\n\nsession_id\x18\x17 \x01(\t\x12\x16\n\x0equeue_revision\x18\x18 \x01(\t\x12\x10\n\x08position\x18\x19 \x01(\x03\x12\x12\n\nentity_uri\x18\x1a \x01(\t\x12,\n\x07reverse\x18\x1b \x03(\x0b\x32\x1b.connectstate.ProvidedTrack\x12+\n\x06\x66uture\x18\x1c \x03(\x0b\x32\x1b.connectstate.ProvidedTrack\x1a\x36\n\x14\x43ontextMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\x1a\x33\n\x11PageMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"\xda\x02\n\rProvidedTrack\x12\x0b\n\x03uri\x18\x01 \x01(\t\x12\x0b\n\x03uid\x18\x02 \x01(\t\x12;\n\x08metadata\x18\x03 \x03(\x0b\x32).connectstate.ProvidedTrack.MetadataEntry\x12\x0f\n\x07removed\x18\x04 \x03(\t\x12\x0f\n\x07\x62locked\x18\x05 \x03(\t\x12\x10\n\x08provider\x18\x06 \x01(\t\x12\x30\n\x0crestrictions\x18\x07 \x01(\x0b\x32\x1a.connectstate.Restrictions\x12\x11\n\talbum_uri\x18\x08 \x01(\t\x12\x18\n\x10\x64isallow_reasons\x18\t \x03(\t\x12\x12\n\nartist_uri\x18\n \x01(\t\x12\x1a\n\x12\x64isallow_undecided\x18\x0b \x03(\t\x1a/\n\rMetadataEntry\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t:\x02\x38\x01\"+\n\x0c\x43ontextIndex\x12\x0c\n\x04page\x18\x01 \x01(\r\x12\r\n\x05track\x18\x02 \x01(\r\"\x80\x08\n\x0cRestrictions\x12 \n\x18\x64isallow_pausing_reasons\x18\x01 \x03(\t\x12!\n\x19\x64isallow_resuming_reasons\x18\x02 \x03(\t\x12 \n\x18\x64isallow_seeking_reasons\x18\x03 \x03(\t\x12%\n\x1d\x64isallow_peeking_prev_reasons\x18\x04 \x03(\t\x12%\n\x1d\x64isallow_peeking_next_reasons\x18\x05 \x03(\t\x12&\n\x1e\x64isallow_skipping_prev_reasons\x18\x06 \x03(\t\x12&\n\x1e\x64isallow_skipping_next_reasons\x18\x07 \x03(\t\x12\x30\n(disallow_toggling_repeat_context_reasons\x18\x08 \x03(\t\x12.\n&disallow_toggling_repeat_track_reasons\x18\t \x03(\t\x12)\n!disallow_toggling_shuffle_reasons\x18\n \x03(\t\x12\"\n\x1a\x64isallow_set_queue_reasons\x18\x0b \x03(\t\x12.\n&disallow_interrupting_playback_reasons\x18\x0c \x03(\t\x12.\n&disallow_transferring_playback_reasons\x18\r \x03(\t\x12\'\n\x1f\x64isallow_remote_control_reasons\x18\x0e \x03(\t\x12\x33\n+disallow_inserting_into_next_tracks_reasons\x18\x0f \x03(\t\x12\x36\n.disallow_inserting_into_context_tracks_reasons\x18\x10 \x03(\t\x12\x32\n*disallow_reordering_in_next_tracks_reasons\x18\x11 \x03(\t\x12\x35\n-disallow_reordering_in_context_tracks_reasons\x18\x12 \x03(\t\x12\x32\n*disallow_removing_from_next_tracks_reasons\x18\x13 \x03(\t\x12\x35\n-disallow_removing_from_context_tracks_reasons\x18\x14 \x03(\t\x12)\n!disallow_updating_context_reasons\x18\x15 \x03(\t\x12 \n\x18\x64isallow_playing_reasons\x18\x16 \x03(\t\x12!\n\x19\x64isallow_stopping_reasons\x18\x17 \x03(\t\"\xbf\x01\n\nPlayOrigin\x12\x1a\n\x12\x66\x65\x61ture_identifier\x18\x01 \x01(\t\x12\x17\n\x0f\x66\x65\x61ture_version\x18\x02 \x01(\t\x12\x10\n\x08view_uri\x18\x03 \x01(\t\x12\x19\n\x11\x65xternal_referrer\x18\x04 \x01(\t\x12\x1b\n\x13referrer_identifier\x18\x05 \x01(\t\x12\x19\n\x11\x64\x65vice_identifier\x18\x06 \x01(\t\x12\x17\n\x0f\x66\x65\x61ture_classes\x18\x07 \x03(\t\"e\n\x14\x43ontextPlayerOptions\x12\x19\n\x11shuffling_context\x18\x01 \x01(\x08\x12\x19\n\x11repeating_context\x18\x02 \x01(\x08\x12\x17\n\x0frepeating_track\x18\x03 \x01(\x08\"!\n\x0cSuppressions\x12\x11\n\tproviders\x18\x01 \x03(\tB\x1c\n\x18\x63om.spotify.connectstateH\x02\x62\x06proto3' +) + +_PLAYERSTATE_CONTEXTMETADATAENTRY = _descriptor.Descriptor( + name='ContextMetadataEntry', + full_name='connectstate.PlayerState.ContextMetadataEntry', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='key', + full_name='connectstate.PlayerState.ContextMetadataEntry.key', + index=0, + number=1, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode('utf-8'), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='value', + full_name='connectstate.PlayerState.ContextMetadataEntry.value', + index=1, + number=2, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode('utf-8'), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=b'8\001', + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[], + serialized_start=1054, + serialized_end=1108, +) + +_PLAYERSTATE_PAGEMETADATAENTRY = _descriptor.Descriptor( + name='PageMetadataEntry', + full_name='connectstate.PlayerState.PageMetadataEntry', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='key', + full_name='connectstate.PlayerState.PageMetadataEntry.key', + index=0, + number=1, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode('utf-8'), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='value', + full_name='connectstate.PlayerState.PageMetadataEntry.value', + index=1, + number=2, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode('utf-8'), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=b'8\001', + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[], + serialized_start=1110, + serialized_end=1161, +) + +_PLAYERSTATE = _descriptor.Descriptor( + name='PlayerState', + full_name='connectstate.PlayerState', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='timestamp', + full_name='connectstate.PlayerState.timestamp', + index=0, + number=1, + type=3, + cpp_type=2, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='context_uri', + full_name='connectstate.PlayerState.context_uri', + index=1, + number=2, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode('utf-8'), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='context_url', + full_name='connectstate.PlayerState.context_url', + index=2, + number=3, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode('utf-8'), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='context_restrictions', + full_name='connectstate.PlayerState.context_restrictions', + index=3, + number=4, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='play_origin', + full_name='connectstate.PlayerState.play_origin', + index=4, + number=5, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='index', + full_name='connectstate.PlayerState.index', + index=5, + number=6, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='track', + full_name='connectstate.PlayerState.track', + index=6, + number=7, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='playback_id', + full_name='connectstate.PlayerState.playback_id', + index=7, + number=8, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode('utf-8'), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='playback_speed', + full_name='connectstate.PlayerState.playback_speed', + index=8, + number=9, + type=1, + cpp_type=5, + label=1, + has_default_value=False, + default_value=float(0), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='position_as_of_timestamp', + full_name='connectstate.PlayerState.position_as_of_timestamp', + index=9, + number=10, + type=3, + cpp_type=2, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='duration', + full_name='connectstate.PlayerState.duration', + index=10, + number=11, + type=3, + cpp_type=2, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='is_playing', + full_name='connectstate.PlayerState.is_playing', + index=11, + number=12, + type=8, + cpp_type=7, + label=1, + has_default_value=False, + default_value=False, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='is_paused', + full_name='connectstate.PlayerState.is_paused', + index=12, + number=13, + type=8, + cpp_type=7, + label=1, + has_default_value=False, + default_value=False, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='is_buffering', + full_name='connectstate.PlayerState.is_buffering', + index=13, + number=14, + type=8, + cpp_type=7, + label=1, + has_default_value=False, + default_value=False, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='is_system_initiated', + full_name='connectstate.PlayerState.is_system_initiated', + index=14, + number=15, + type=8, + cpp_type=7, + label=1, + has_default_value=False, + default_value=False, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='options', + full_name='connectstate.PlayerState.options', + index=15, + number=16, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='restrictions', + full_name='connectstate.PlayerState.restrictions', + index=16, + number=17, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='suppressions', + full_name='connectstate.PlayerState.suppressions', + index=17, + number=18, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='prev_tracks', + full_name='connectstate.PlayerState.prev_tracks', + index=18, + number=19, + type=11, + cpp_type=10, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='next_tracks', + full_name='connectstate.PlayerState.next_tracks', + index=19, + number=20, + type=11, + cpp_type=10, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='context_metadata', + full_name='connectstate.PlayerState.context_metadata', + index=20, + number=21, + type=11, + cpp_type=10, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='page_metadata', + full_name='connectstate.PlayerState.page_metadata', + index=21, + number=22, + type=11, + cpp_type=10, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='session_id', + full_name='connectstate.PlayerState.session_id', + index=22, + number=23, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode('utf-8'), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='queue_revision', + full_name='connectstate.PlayerState.queue_revision', + index=23, + number=24, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode('utf-8'), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='position', + full_name='connectstate.PlayerState.position', + index=24, + number=25, + type=3, + cpp_type=2, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='entity_uri', + full_name='connectstate.PlayerState.entity_uri', + index=25, + number=26, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode('utf-8'), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='reverse', + full_name='connectstate.PlayerState.reverse', + index=26, + number=27, + type=11, + cpp_type=10, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='future', + full_name='connectstate.PlayerState.future', + index=27, + number=28, + type=11, + cpp_type=10, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + ], + extensions=[], + nested_types=[ + _PLAYERSTATE_CONTEXTMETADATAENTRY, + _PLAYERSTATE_PAGEMETADATAENTRY, + ], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[], + serialized_start=31, + serialized_end=1161, +) + +_PROVIDEDTRACK_METADATAENTRY = _descriptor.Descriptor( + name='MetadataEntry', + full_name='connectstate.ProvidedTrack.MetadataEntry', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='key', + full_name='connectstate.ProvidedTrack.MetadataEntry.key', + index=0, + number=1, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode('utf-8'), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='value', + full_name='connectstate.ProvidedTrack.MetadataEntry.value', + index=1, + number=2, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode('utf-8'), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=b'8\001', + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[], + serialized_start=1463, + serialized_end=1510, +) + +_PROVIDEDTRACK = _descriptor.Descriptor( + name='ProvidedTrack', + full_name='connectstate.ProvidedTrack', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='uri', + full_name='connectstate.ProvidedTrack.uri', + index=0, + number=1, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode('utf-8'), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='uid', + full_name='connectstate.ProvidedTrack.uid', + index=1, + number=2, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode('utf-8'), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='metadata', + full_name='connectstate.ProvidedTrack.metadata', + index=2, + number=3, + type=11, + cpp_type=10, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='removed', + full_name='connectstate.ProvidedTrack.removed', + index=3, + number=4, + type=9, + cpp_type=9, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='blocked', + full_name='connectstate.ProvidedTrack.blocked', + index=4, + number=5, + type=9, + cpp_type=9, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='provider', + full_name='connectstate.ProvidedTrack.provider', + index=5, + number=6, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode('utf-8'), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='restrictions', + full_name='connectstate.ProvidedTrack.restrictions', + index=6, + number=7, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='album_uri', + full_name='connectstate.ProvidedTrack.album_uri', + index=7, + number=8, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode('utf-8'), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='disallow_reasons', + full_name='connectstate.ProvidedTrack.disallow_reasons', + index=8, + number=9, + type=9, + cpp_type=9, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='artist_uri', + full_name='connectstate.ProvidedTrack.artist_uri', + index=9, + number=10, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode('utf-8'), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='disallow_undecided', + full_name='connectstate.ProvidedTrack.disallow_undecided', + index=10, + number=11, + type=9, + cpp_type=9, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + ], + extensions=[], + nested_types=[ + _PROVIDEDTRACK_METADATAENTRY, + ], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[], + serialized_start=1164, + serialized_end=1510, +) + +_CONTEXTINDEX = _descriptor.Descriptor( + name='ContextIndex', + full_name='connectstate.ContextIndex', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='page', + full_name='connectstate.ContextIndex.page', + index=0, + number=1, + type=13, + cpp_type=3, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='track', + full_name='connectstate.ContextIndex.track', + index=1, + number=2, + type=13, + cpp_type=3, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[], + serialized_start=1512, + serialized_end=1555, +) + +_RESTRICTIONS = _descriptor.Descriptor( + name='Restrictions', + full_name='connectstate.Restrictions', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='disallow_pausing_reasons', + full_name='connectstate.Restrictions.disallow_pausing_reasons', + index=0, + number=1, + type=9, + cpp_type=9, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='disallow_resuming_reasons', + full_name='connectstate.Restrictions.disallow_resuming_reasons', + index=1, + number=2, + type=9, + cpp_type=9, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='disallow_seeking_reasons', + full_name='connectstate.Restrictions.disallow_seeking_reasons', + index=2, + number=3, + type=9, + cpp_type=9, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='disallow_peeking_prev_reasons', + full_name='connectstate.Restrictions.disallow_peeking_prev_reasons', + index=3, + number=4, + type=9, + cpp_type=9, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='disallow_peeking_next_reasons', + full_name='connectstate.Restrictions.disallow_peeking_next_reasons', + index=4, + number=5, + type=9, + cpp_type=9, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='disallow_skipping_prev_reasons', + full_name= + 'connectstate.Restrictions.disallow_skipping_prev_reasons', + index=5, + number=6, + type=9, + cpp_type=9, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='disallow_skipping_next_reasons', + full_name= + 'connectstate.Restrictions.disallow_skipping_next_reasons', + index=6, + number=7, + type=9, + cpp_type=9, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='disallow_toggling_repeat_context_reasons', + full_name= + 'connectstate.Restrictions.disallow_toggling_repeat_context_reasons', + index=7, + number=8, + type=9, + cpp_type=9, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='disallow_toggling_repeat_track_reasons', + full_name= + 'connectstate.Restrictions.disallow_toggling_repeat_track_reasons', + index=8, + number=9, + type=9, + cpp_type=9, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='disallow_toggling_shuffle_reasons', + full_name= + 'connectstate.Restrictions.disallow_toggling_shuffle_reasons', + index=9, + number=10, + type=9, + cpp_type=9, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='disallow_set_queue_reasons', + full_name='connectstate.Restrictions.disallow_set_queue_reasons', + index=10, + number=11, + type=9, + cpp_type=9, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='disallow_interrupting_playback_reasons', + full_name= + 'connectstate.Restrictions.disallow_interrupting_playback_reasons', + index=11, + number=12, + type=9, + cpp_type=9, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='disallow_transferring_playback_reasons', + full_name= + 'connectstate.Restrictions.disallow_transferring_playback_reasons', + index=12, + number=13, + type=9, + cpp_type=9, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='disallow_remote_control_reasons', + full_name= + 'connectstate.Restrictions.disallow_remote_control_reasons', + index=13, + number=14, + type=9, + cpp_type=9, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='disallow_inserting_into_next_tracks_reasons', + full_name= + 'connectstate.Restrictions.disallow_inserting_into_next_tracks_reasons', + index=14, + number=15, + type=9, + cpp_type=9, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='disallow_inserting_into_context_tracks_reasons', + full_name= + 'connectstate.Restrictions.disallow_inserting_into_context_tracks_reasons', + index=15, + number=16, + type=9, + cpp_type=9, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='disallow_reordering_in_next_tracks_reasons', + full_name= + 'connectstate.Restrictions.disallow_reordering_in_next_tracks_reasons', + index=16, + number=17, + type=9, + cpp_type=9, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='disallow_reordering_in_context_tracks_reasons', + full_name= + 'connectstate.Restrictions.disallow_reordering_in_context_tracks_reasons', + index=17, + number=18, + type=9, + cpp_type=9, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='disallow_removing_from_next_tracks_reasons', + full_name= + 'connectstate.Restrictions.disallow_removing_from_next_tracks_reasons', + index=18, + number=19, + type=9, + cpp_type=9, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='disallow_removing_from_context_tracks_reasons', + full_name= + 'connectstate.Restrictions.disallow_removing_from_context_tracks_reasons', + index=19, + number=20, + type=9, + cpp_type=9, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='disallow_updating_context_reasons', + full_name= + 'connectstate.Restrictions.disallow_updating_context_reasons', + index=20, + number=21, + type=9, + cpp_type=9, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='disallow_playing_reasons', + full_name='connectstate.Restrictions.disallow_playing_reasons', + index=21, + number=22, + type=9, + cpp_type=9, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='disallow_stopping_reasons', + full_name='connectstate.Restrictions.disallow_stopping_reasons', + index=22, + number=23, + type=9, + cpp_type=9, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[], + serialized_start=1558, + serialized_end=2582, +) + +_PLAYORIGIN = _descriptor.Descriptor( + name='PlayOrigin', + full_name='connectstate.PlayOrigin', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='feature_identifier', + full_name='connectstate.PlayOrigin.feature_identifier', + index=0, + number=1, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode('utf-8'), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='feature_version', + full_name='connectstate.PlayOrigin.feature_version', + index=1, + number=2, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode('utf-8'), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='view_uri', + full_name='connectstate.PlayOrigin.view_uri', + index=2, + number=3, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode('utf-8'), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='external_referrer', + full_name='connectstate.PlayOrigin.external_referrer', + index=3, + number=4, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode('utf-8'), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='referrer_identifier', + full_name='connectstate.PlayOrigin.referrer_identifier', + index=4, + number=5, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode('utf-8'), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='device_identifier', + full_name='connectstate.PlayOrigin.device_identifier', + index=5, + number=6, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode('utf-8'), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='feature_classes', + full_name='connectstate.PlayOrigin.feature_classes', + index=6, + number=7, + type=9, + cpp_type=9, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[], + serialized_start=2585, + serialized_end=2776, +) + +_CONTEXTPLAYEROPTIONS = _descriptor.Descriptor( + name='ContextPlayerOptions', + full_name='connectstate.ContextPlayerOptions', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='shuffling_context', + full_name='connectstate.ContextPlayerOptions.shuffling_context', + index=0, + number=1, + type=8, + cpp_type=7, + label=1, + has_default_value=False, + default_value=False, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='repeating_context', + full_name='connectstate.ContextPlayerOptions.repeating_context', + index=1, + number=2, + type=8, + cpp_type=7, + label=1, + has_default_value=False, + default_value=False, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='repeating_track', + full_name='connectstate.ContextPlayerOptions.repeating_track', + index=2, + number=3, + type=8, + cpp_type=7, + label=1, + has_default_value=False, + default_value=False, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[], + serialized_start=2778, + serialized_end=2879, +) + +_SUPPRESSIONS = _descriptor.Descriptor( + name='Suppressions', + full_name='connectstate.Suppressions', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='providers', + full_name='connectstate.Suppressions.providers', + index=0, + number=1, + type=9, + cpp_type=9, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[], + serialized_start=2881, + serialized_end=2914, +) + +_PLAYERSTATE_CONTEXTMETADATAENTRY.containing_type = _PLAYERSTATE +_PLAYERSTATE_PAGEMETADATAENTRY.containing_type = _PLAYERSTATE +_PLAYERSTATE.fields_by_name[ + 'context_restrictions'].message_type = _RESTRICTIONS +_PLAYERSTATE.fields_by_name['play_origin'].message_type = _PLAYORIGIN +_PLAYERSTATE.fields_by_name['index'].message_type = _CONTEXTINDEX +_PLAYERSTATE.fields_by_name['track'].message_type = _PROVIDEDTRACK +_PLAYERSTATE.fields_by_name['options'].message_type = _CONTEXTPLAYEROPTIONS +_PLAYERSTATE.fields_by_name['restrictions'].message_type = _RESTRICTIONS +_PLAYERSTATE.fields_by_name['suppressions'].message_type = _SUPPRESSIONS +_PLAYERSTATE.fields_by_name['prev_tracks'].message_type = _PROVIDEDTRACK +_PLAYERSTATE.fields_by_name['next_tracks'].message_type = _PROVIDEDTRACK +_PLAYERSTATE.fields_by_name[ + 'context_metadata'].message_type = _PLAYERSTATE_CONTEXTMETADATAENTRY +_PLAYERSTATE.fields_by_name[ + 'page_metadata'].message_type = _PLAYERSTATE_PAGEMETADATAENTRY +_PLAYERSTATE.fields_by_name['reverse'].message_type = _PROVIDEDTRACK +_PLAYERSTATE.fields_by_name['future'].message_type = _PROVIDEDTRACK +_PROVIDEDTRACK_METADATAENTRY.containing_type = _PROVIDEDTRACK +_PROVIDEDTRACK.fields_by_name[ + 'metadata'].message_type = _PROVIDEDTRACK_METADATAENTRY +_PROVIDEDTRACK.fields_by_name['restrictions'].message_type = _RESTRICTIONS +DESCRIPTOR.message_types_by_name['PlayerState'] = _PLAYERSTATE +DESCRIPTOR.message_types_by_name['ProvidedTrack'] = _PROVIDEDTRACK +DESCRIPTOR.message_types_by_name['ContextIndex'] = _CONTEXTINDEX +DESCRIPTOR.message_types_by_name['Restrictions'] = _RESTRICTIONS +DESCRIPTOR.message_types_by_name['PlayOrigin'] = _PLAYORIGIN +DESCRIPTOR.message_types_by_name[ + 'ContextPlayerOptions'] = _CONTEXTPLAYEROPTIONS +DESCRIPTOR.message_types_by_name['Suppressions'] = _SUPPRESSIONS +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +PlayerState = _reflection.GeneratedProtocolMessageType( + 'PlayerState', + (_message.Message, ), + { + 'ContextMetadataEntry': + _reflection.GeneratedProtocolMessageType( + 'ContextMetadataEntry', + (_message.Message, ), + { + 'DESCRIPTOR': _PLAYERSTATE_CONTEXTMETADATAENTRY, + '__module__': 'player_pb2' + # @@protoc_insertion_point(class_scope:connectstate.PlayerState.ContextMetadataEntry) + }), + 'PageMetadataEntry': + _reflection.GeneratedProtocolMessageType( + 'PageMetadataEntry', + (_message.Message, ), + { + 'DESCRIPTOR': _PLAYERSTATE_PAGEMETADATAENTRY, + '__module__': 'player_pb2' + # @@protoc_insertion_point(class_scope:connectstate.PlayerState.PageMetadataEntry) + }), + 'DESCRIPTOR': + _PLAYERSTATE, + '__module__': + 'player_pb2' + # @@protoc_insertion_point(class_scope:connectstate.PlayerState) + }) +_sym_db.RegisterMessage(PlayerState) +_sym_db.RegisterMessage(PlayerState.ContextMetadataEntry) +_sym_db.RegisterMessage(PlayerState.PageMetadataEntry) + +ProvidedTrack = _reflection.GeneratedProtocolMessageType( + 'ProvidedTrack', + (_message.Message, ), + { + 'MetadataEntry': + _reflection.GeneratedProtocolMessageType( + 'MetadataEntry', + (_message.Message, ), + { + 'DESCRIPTOR': _PROVIDEDTRACK_METADATAENTRY, + '__module__': 'player_pb2' + # @@protoc_insertion_point(class_scope:connectstate.ProvidedTrack.MetadataEntry) + }), + 'DESCRIPTOR': + _PROVIDEDTRACK, + '__module__': + 'player_pb2' + # @@protoc_insertion_point(class_scope:connectstate.ProvidedTrack) + }) +_sym_db.RegisterMessage(ProvidedTrack) +_sym_db.RegisterMessage(ProvidedTrack.MetadataEntry) + +ContextIndex = _reflection.GeneratedProtocolMessageType( + 'ContextIndex', + (_message.Message, ), + { + 'DESCRIPTOR': _CONTEXTINDEX, + '__module__': 'player_pb2' + # @@protoc_insertion_point(class_scope:connectstate.ContextIndex) + }) +_sym_db.RegisterMessage(ContextIndex) + +Restrictions = _reflection.GeneratedProtocolMessageType( + 'Restrictions', + (_message.Message, ), + { + 'DESCRIPTOR': _RESTRICTIONS, + '__module__': 'player_pb2' + # @@protoc_insertion_point(class_scope:connectstate.Restrictions) + }) +_sym_db.RegisterMessage(Restrictions) + +PlayOrigin = _reflection.GeneratedProtocolMessageType( + 'PlayOrigin', + (_message.Message, ), + { + 'DESCRIPTOR': _PLAYORIGIN, + '__module__': 'player_pb2' + # @@protoc_insertion_point(class_scope:connectstate.PlayOrigin) + }) +_sym_db.RegisterMessage(PlayOrigin) + +ContextPlayerOptions = _reflection.GeneratedProtocolMessageType( + 'ContextPlayerOptions', + (_message.Message, ), + { + 'DESCRIPTOR': _CONTEXTPLAYEROPTIONS, + '__module__': 'player_pb2' + # @@protoc_insertion_point(class_scope:connectstate.ContextPlayerOptions) + }) +_sym_db.RegisterMessage(ContextPlayerOptions) + +Suppressions = _reflection.GeneratedProtocolMessageType( + 'Suppressions', + (_message.Message, ), + { + 'DESCRIPTOR': _SUPPRESSIONS, + '__module__': 'player_pb2' + # @@protoc_insertion_point(class_scope:connectstate.Suppressions) + }) +_sym_db.RegisterMessage(Suppressions) + +DESCRIPTOR._options = None +_PLAYERSTATE_CONTEXTMETADATAENTRY._options = None +_PLAYERSTATE_PAGEMETADATAENTRY._options = None +_PROVIDEDTRACK_METADATAENTRY._options = None +# @@protoc_insertion_point(module_scope) diff --git a/librespot/proto/Playlist4External_pb2.py b/librespot/proto/Playlist4External_pb2.py new file mode 100644 index 0000000..f49f4ff --- /dev/null +++ b/librespot/proto/Playlist4External_pb2.py @@ -0,0 +1,3221 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: playlist4_external.proto +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import enum_type_wrapper + +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + +DESCRIPTOR = _descriptor.FileDescriptor( + name="playlist4_external.proto", + package="spotify.playlist4.proto", + syntax="proto2", + serialized_options= + b"\n\025com.spotify.playlist4B\021Playlist4ApiProtoH\002", + create_key=_descriptor._internal_create_key, + serialized_pb= + b'\n\x18playlist4_external.proto\x12\x17spotify.playlist4.proto"P\n\x04Item\x12\x0b\n\x03uri\x18\x01 \x02(\t\x12;\n\nattributes\x18\x02 \x01(\x0b\x32\'.spotify.playlist4.proto.ItemAttributes"\x94\x01\n\x08MetaItem\x12\x10\n\x08revision\x18\x01 \x01(\x0c\x12;\n\nattributes\x18\x02 \x01(\x0b\x32\'.spotify.playlist4.proto.ListAttributes\x12\x0e\n\x06length\x18\x03 \x01(\x05\x12\x11\n\ttimestamp\x18\x04 \x01(\x03\x12\x16\n\x0eowner_username\x18\x05 \x01(\t"\x90\x01\n\tListItems\x12\x0b\n\x03pos\x18\x01 \x02(\x05\x12\x11\n\ttruncated\x18\x02 \x02(\x08\x12,\n\x05items\x18\x03 \x03(\x0b\x32\x1d.spotify.playlist4.proto.Item\x12\x35\n\nmeta_items\x18\x04 \x03(\x0b\x32!.spotify.playlist4.proto.MetaItem"1\n\x13\x46ormatListAttribute\x12\x0b\n\x03key\x18\x01 \x01(\t\x12\r\n\x05value\x18\x02 \x01(\t"\xf6\x01\n\x0eListAttributes\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\x13\n\x0b\x64\x65scription\x18\x02 \x01(\t\x12\x0f\n\x07picture\x18\x03 \x01(\x0c\x12\x15\n\rcollaborative\x18\x04 \x01(\x08\x12\x13\n\x0bpl3_version\x18\x05 \x01(\t\x12\x18\n\x10\x64\x65leted_by_owner\x18\x06 \x01(\x08\x12\x11\n\tclient_id\x18\n \x01(\t\x12\x0e\n\x06\x66ormat\x18\x0b \x01(\t\x12G\n\x11\x66ormat_attributes\x18\x0c \x03(\x0b\x32,.spotify.playlist4.proto.FormatListAttribute"\xb0\x01\n\x0eItemAttributes\x12\x10\n\x08\x61\x64\x64\x65\x64_by\x18\x01 \x01(\t\x12\x11\n\ttimestamp\x18\x02 \x01(\x03\x12\x0f\n\x07seen_at\x18\t \x01(\x03\x12\x0e\n\x06public\x18\n \x01(\x08\x12G\n\x11\x66ormat_attributes\x18\x0b \x03(\x0b\x32,.spotify.playlist4.proto.FormatListAttribute\x12\x0f\n\x07item_id\x18\x0c \x01(\x0c"l\n\x03\x41\x64\x64\x12\x12\n\nfrom_index\x18\x01 \x01(\x05\x12,\n\x05items\x18\x02 \x03(\x0b\x32\x1d.spotify.playlist4.proto.Item\x12\x10\n\x08\x61\x64\x64_last\x18\x04 \x01(\x08\x12\x11\n\tadd_first\x18\x05 \x01(\x08"m\n\x03Rem\x12\x12\n\nfrom_index\x18\x01 \x01(\x05\x12\x0e\n\x06length\x18\x02 \x01(\x05\x12,\n\x05items\x18\x03 \x03(\x0b\x32\x1d.spotify.playlist4.proto.Item\x12\x14\n\x0citems_as_key\x18\x07 \x01(\x08";\n\x03Mov\x12\x12\n\nfrom_index\x18\x01 \x02(\x05\x12\x0e\n\x06length\x18\x02 \x02(\x05\x12\x10\n\x08to_index\x18\x03 \x02(\x05"\x93\x01\n\x1aItemAttributesPartialState\x12\x37\n\x06values\x18\x01 \x02(\x0b\x32\'.spotify.playlist4.proto.ItemAttributes\x12<\n\x08no_value\x18\x02 \x03(\x0e\x32*.spotify.playlist4.proto.ItemAttributeKind"\x93\x01\n\x1aListAttributesPartialState\x12\x37\n\x06values\x18\x01 \x02(\x0b\x32\'.spotify.playlist4.proto.ListAttributes\x12<\n\x08no_value\x18\x02 \x03(\x0e\x32*.spotify.playlist4.proto.ListAttributeKind"\xbf\x01\n\x14UpdateItemAttributes\x12\r\n\x05index\x18\x01 \x02(\x05\x12K\n\x0enew_attributes\x18\x02 \x02(\x0b\x32\x33.spotify.playlist4.proto.ItemAttributesPartialState\x12K\n\x0eold_attributes\x18\x03 \x01(\x0b\x32\x33.spotify.playlist4.proto.ItemAttributesPartialState"\xb0\x01\n\x14UpdateListAttributes\x12K\n\x0enew_attributes\x18\x01 \x02(\x0b\x32\x33.spotify.playlist4.proto.ListAttributesPartialState\x12K\n\x0eold_attributes\x18\x02 \x01(\x0b\x32\x33.spotify.playlist4.proto.ListAttributesPartialState"\xc0\x03\n\x02Op\x12.\n\x04kind\x18\x01 \x02(\x0e\x32 .spotify.playlist4.proto.Op.Kind\x12)\n\x03\x61\x64\x64\x18\x02 \x01(\x0b\x32\x1c.spotify.playlist4.proto.Add\x12)\n\x03rem\x18\x03 \x01(\x0b\x32\x1c.spotify.playlist4.proto.Rem\x12)\n\x03mov\x18\x04 \x01(\x0b\x32\x1c.spotify.playlist4.proto.Mov\x12M\n\x16update_item_attributes\x18\x05 \x01(\x0b\x32-.spotify.playlist4.proto.UpdateItemAttributes\x12M\n\x16update_list_attributes\x18\x06 \x01(\x0b\x32-.spotify.playlist4.proto.UpdateListAttributes"k\n\x04Kind\x12\x10\n\x0cKIND_UNKNOWN\x10\x00\x12\x07\n\x03\x41\x44\x44\x10\x02\x12\x07\n\x03REM\x10\x03\x12\x07\n\x03MOV\x10\x04\x12\x1a\n\x16UPDATE_ITEM_ATTRIBUTES\x10\x05\x12\x1a\n\x16UPDATE_LIST_ATTRIBUTES\x10\x06"2\n\x06OpList\x12(\n\x03ops\x18\x01 \x03(\x0b\x32\x1b.spotify.playlist4.proto.Op"\xd5\x01\n\nChangeInfo\x12\x0c\n\x04user\x18\x01 \x01(\t\x12\x11\n\ttimestamp\x18\x02 \x01(\x03\x12\r\n\x05\x61\x64min\x18\x03 \x01(\x08\x12\x0c\n\x04undo\x18\x04 \x01(\x08\x12\x0c\n\x04redo\x18\x05 \x01(\x08\x12\r\n\x05merge\x18\x06 \x01(\x08\x12\x12\n\ncompressed\x18\x07 \x01(\x08\x12\x11\n\tmigration\x18\x08 \x01(\x08\x12\x10\n\x08split_id\x18\t \x01(\x05\x12\x33\n\x06source\x18\n \x01(\x0b\x32#.spotify.playlist4.proto.SourceInfo"\xe8\x01\n\nSourceInfo\x12:\n\x06\x63lient\x18\x01 \x01(\x0e\x32*.spotify.playlist4.proto.SourceInfo.Client\x12\x0b\n\x03\x61pp\x18\x03 \x01(\t\x12\x0e\n\x06source\x18\x04 \x01(\t\x12\x0f\n\x07version\x18\x05 \x01(\t"p\n\x06\x43lient\x12\x12\n\x0e\x43LIENT_UNKNOWN\x10\x00\x12\x11\n\rNATIVE_HERMES\x10\x01\x12\n\n\x06\x43LIENT\x10\x02\x12\n\n\x06PYTHON\x10\x03\x12\x08\n\x04JAVA\x10\x04\x12\r\n\tWEBPLAYER\x10\x05\x12\x0e\n\nLIBSPOTIFY\x10\x06"z\n\x05\x44\x65lta\x12\x14\n\x0c\x62\x61se_version\x18\x01 \x01(\x0c\x12(\n\x03ops\x18\x02 \x03(\x0b\x32\x1b.spotify.playlist4.proto.Op\x12\x31\n\x04info\x18\x04 \x01(\x0b\x32#.spotify.playlist4.proto.ChangeInfo"\\\n\x04\x44iff\x12\x15\n\rfrom_revision\x18\x01 \x02(\x0c\x12(\n\x03ops\x18\x02 \x03(\x0b\x32\x1b.spotify.playlist4.proto.Op\x12\x13\n\x0bto_revision\x18\x03 \x02(\x0c"\xa0\x01\n\x0bListChanges\x12\x15\n\rbase_revision\x18\x01 \x01(\x0c\x12.\n\x06\x64\x65ltas\x18\x02 \x03(\x0b\x32\x1e.spotify.playlist4.proto.Delta\x12 \n\x18want_resulting_revisions\x18\x03 \x01(\x08\x12\x18\n\x10want_sync_result\x18\x04 \x01(\x08\x12\x0e\n\x06nonces\x18\x06 \x03(\x03"\x8f\x03\n\x13SelectedListContent\x12\x10\n\x08revision\x18\x01 \x01(\x0c\x12\x0e\n\x06length\x18\x02 \x01(\x05\x12;\n\nattributes\x18\x03 \x01(\x0b\x32\'.spotify.playlist4.proto.ListAttributes\x12\x34\n\x08\x63ontents\x18\x05 \x01(\x0b\x32".spotify.playlist4.proto.ListItems\x12+\n\x04\x64iff\x18\x06 \x01(\x0b\x32\x1d.spotify.playlist4.proto.Diff\x12\x32\n\x0bsync_result\x18\x07 \x01(\x0b\x32\x1d.spotify.playlist4.proto.Diff\x12\x1b\n\x13resulting_revisions\x18\x08 \x03(\x0c\x12\x16\n\x0emultiple_heads\x18\t \x01(\x08\x12\x12\n\nup_to_date\x18\n \x01(\x08\x12\x0e\n\x06nonces\x18\x0e \x03(\x03\x12\x11\n\ttimestamp\x18\x0f \x01(\x03\x12\x16\n\x0eowner_username\x18\x10 \x01(\t"0\n\x0f\x43reateListReply\x12\x0b\n\x03uri\x18\x01 \x02(\x0c\x12\x10\n\x08revision\x18\x02 \x01(\x0c",\n\x0bModifyReply\x12\x0b\n\x03uri\x18\x01 \x02(\x0c\x12\x10\n\x08revision\x18\x02 \x01(\x0c" \n\x10SubscribeRequest\x12\x0c\n\x04uris\x18\x01 \x03(\x0c""\n\x12UnsubscribeRequest\x12\x0c\n\x04uris\x18\x01 \x03(\x0c"\x80\x01\n\x18PlaylistModificationInfo\x12\x0b\n\x03uri\x18\x01 \x01(\x0c\x12\x14\n\x0cnew_revision\x18\x02 \x01(\x0c\x12\x17\n\x0fparent_revision\x18\x03 \x01(\x0c\x12(\n\x03ops\x18\x04 \x03(\x0b\x32\x1b.spotify.playlist4.proto.Op*\xe6\x01\n\x11ListAttributeKind\x12\x10\n\x0cLIST_UNKNOWN\x10\x00\x12\r\n\tLIST_NAME\x10\x01\x12\x14\n\x10LIST_DESCRIPTION\x10\x02\x12\x10\n\x0cLIST_PICTURE\x10\x03\x12\x16\n\x12LIST_COLLABORATIVE\x10\x04\x12\x14\n\x10LIST_PL3_VERSION\x10\x05\x12\x19\n\x15LIST_DELETED_BY_OWNER\x10\x06\x12\x12\n\x0eLIST_CLIENT_ID\x10\n\x12\x0f\n\x0bLIST_FORMAT\x10\x0b\x12\x1a\n\x16LIST_FORMAT_ATTRIBUTES\x10\x0c*\x98\x01\n\x11ItemAttributeKind\x12\x10\n\x0cITEM_UNKNOWN\x10\x00\x12\x11\n\rITEM_ADDED_BY\x10\x01\x12\x12\n\x0eITEM_TIMESTAMP\x10\x02\x12\x10\n\x0cITEM_SEEN_AT\x10\t\x12\x0f\n\x0bITEM_PUBLIC\x10\n\x12\x1a\n\x16ITEM_FORMAT_ATTRIBUTES\x10\x0b\x12\x0b\n\x07ITEM_ID\x10\x0c\x42,\n\x15\x63om.spotify.playlist4B\x11Playlist4ApiProtoH\x02', +) + +_LISTATTRIBUTEKIND = _descriptor.EnumDescriptor( + name="ListAttributeKind", + full_name="spotify.playlist4.proto.ListAttributeKind", + filename=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + values=[ + _descriptor.EnumValueDescriptor( + name="LIST_UNKNOWN", + index=0, + number=0, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key, + ), + _descriptor.EnumValueDescriptor( + name="LIST_NAME", + index=1, + number=1, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key, + ), + _descriptor.EnumValueDescriptor( + name="LIST_DESCRIPTION", + index=2, + number=2, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key, + ), + _descriptor.EnumValueDescriptor( + name="LIST_PICTURE", + index=3, + number=3, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key, + ), + _descriptor.EnumValueDescriptor( + name="LIST_COLLABORATIVE", + index=4, + number=4, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key, + ), + _descriptor.EnumValueDescriptor( + name="LIST_PL3_VERSION", + index=5, + number=5, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key, + ), + _descriptor.EnumValueDescriptor( + name="LIST_DELETED_BY_OWNER", + index=6, + number=6, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key, + ), + _descriptor.EnumValueDescriptor( + name="LIST_CLIENT_ID", + index=7, + number=10, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key, + ), + _descriptor.EnumValueDescriptor( + name="LIST_FORMAT", + index=8, + number=11, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key, + ), + _descriptor.EnumValueDescriptor( + name="LIST_FORMAT_ATTRIBUTES", + index=9, + number=12, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key, + ), + ], + containing_type=None, + serialized_options=None, + serialized_start=3902, + serialized_end=4132, +) +_sym_db.RegisterEnumDescriptor(_LISTATTRIBUTEKIND) + +ListAttributeKind = enum_type_wrapper.EnumTypeWrapper(_LISTATTRIBUTEKIND) +_ITEMATTRIBUTEKIND = _descriptor.EnumDescriptor( + name="ItemAttributeKind", + full_name="spotify.playlist4.proto.ItemAttributeKind", + filename=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + values=[ + _descriptor.EnumValueDescriptor( + name="ITEM_UNKNOWN", + index=0, + number=0, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key, + ), + _descriptor.EnumValueDescriptor( + name="ITEM_ADDED_BY", + index=1, + number=1, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key, + ), + _descriptor.EnumValueDescriptor( + name="ITEM_TIMESTAMP", + index=2, + number=2, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key, + ), + _descriptor.EnumValueDescriptor( + name="ITEM_SEEN_AT", + index=3, + number=9, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key, + ), + _descriptor.EnumValueDescriptor( + name="ITEM_PUBLIC", + index=4, + number=10, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key, + ), + _descriptor.EnumValueDescriptor( + name="ITEM_FORMAT_ATTRIBUTES", + index=5, + number=11, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key, + ), + _descriptor.EnumValueDescriptor( + name="ITEM_ID", + index=6, + number=12, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key, + ), + ], + containing_type=None, + serialized_options=None, + serialized_start=4135, + serialized_end=4287, +) +_sym_db.RegisterEnumDescriptor(_ITEMATTRIBUTEKIND) + +ItemAttributeKind = enum_type_wrapper.EnumTypeWrapper(_ITEMATTRIBUTEKIND) +LIST_UNKNOWN = 0 +LIST_NAME = 1 +LIST_DESCRIPTION = 2 +LIST_PICTURE = 3 +LIST_COLLABORATIVE = 4 +LIST_PL3_VERSION = 5 +LIST_DELETED_BY_OWNER = 6 +LIST_CLIENT_ID = 10 +LIST_FORMAT = 11 +LIST_FORMAT_ATTRIBUTES = 12 +ITEM_UNKNOWN = 0 +ITEM_ADDED_BY = 1 +ITEM_TIMESTAMP = 2 +ITEM_SEEN_AT = 9 +ITEM_PUBLIC = 10 +ITEM_FORMAT_ATTRIBUTES = 11 +ITEM_ID = 12 + +_OP_KIND = _descriptor.EnumDescriptor( + name="Kind", + full_name="spotify.playlist4.proto.Op.Kind", + filename=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + values=[ + _descriptor.EnumValueDescriptor( + name="KIND_UNKNOWN", + index=0, + number=0, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key, + ), + _descriptor.EnumValueDescriptor( + name="ADD", + index=1, + number=2, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key, + ), + _descriptor.EnumValueDescriptor( + name="REM", + index=2, + number=3, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key, + ), + _descriptor.EnumValueDescriptor( + name="MOV", + index=3, + number=4, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key, + ), + _descriptor.EnumValueDescriptor( + name="UPDATE_ITEM_ATTRIBUTES", + index=4, + number=5, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key, + ), + _descriptor.EnumValueDescriptor( + name="UPDATE_LIST_ATTRIBUTES", + index=5, + number=6, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key, + ), + ], + containing_type=None, + serialized_options=None, + serialized_start=2209, + serialized_end=2316, +) +_sym_db.RegisterEnumDescriptor(_OP_KIND) + +_SOURCEINFO_CLIENT = _descriptor.EnumDescriptor( + name="Client", + full_name="spotify.playlist4.proto.SourceInfo.Client", + filename=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + values=[ + _descriptor.EnumValueDescriptor( + name="CLIENT_UNKNOWN", + index=0, + number=0, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key, + ), + _descriptor.EnumValueDescriptor( + name="NATIVE_HERMES", + index=1, + number=1, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key, + ), + _descriptor.EnumValueDescriptor( + name="CLIENT", + index=2, + number=2, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key, + ), + _descriptor.EnumValueDescriptor( + name="PYTHON", + index=3, + number=3, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key, + ), + _descriptor.EnumValueDescriptor( + name="JAVA", + index=4, + number=4, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key, + ), + _descriptor.EnumValueDescriptor( + name="WEBPLAYER", + index=5, + number=5, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key, + ), + _descriptor.EnumValueDescriptor( + name="LIBSPOTIFY", + index=6, + number=6, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key, + ), + ], + containing_type=None, + serialized_options=None, + serialized_start=2707, + serialized_end=2819, +) +_sym_db.RegisterEnumDescriptor(_SOURCEINFO_CLIENT) + +_ITEM = _descriptor.Descriptor( + name="Item", + full_name="spotify.playlist4.proto.Item", + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name="uri", + full_name="spotify.playlist4.proto.Item.uri", + index=0, + number=1, + type=9, + cpp_type=9, + label=2, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="attributes", + full_name="spotify.playlist4.proto.Item.attributes", + index=1, + number=2, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax="proto2", + extension_ranges=[], + oneofs=[], + serialized_start=53, + serialized_end=133, +) + +_METAITEM = _descriptor.Descriptor( + name="MetaItem", + full_name="spotify.playlist4.proto.MetaItem", + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name="revision", + full_name="spotify.playlist4.proto.MetaItem.revision", + index=0, + number=1, + type=12, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"", + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="attributes", + full_name="spotify.playlist4.proto.MetaItem.attributes", + index=1, + number=2, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="length", + full_name="spotify.playlist4.proto.MetaItem.length", + index=2, + number=3, + type=5, + cpp_type=1, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="timestamp", + full_name="spotify.playlist4.proto.MetaItem.timestamp", + index=3, + number=4, + type=3, + cpp_type=2, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="owner_username", + full_name="spotify.playlist4.proto.MetaItem.owner_username", + index=4, + number=5, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax="proto2", + extension_ranges=[], + oneofs=[], + serialized_start=136, + serialized_end=284, +) + +_LISTITEMS = _descriptor.Descriptor( + name="ListItems", + full_name="spotify.playlist4.proto.ListItems", + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name="pos", + full_name="spotify.playlist4.proto.ListItems.pos", + index=0, + number=1, + type=5, + cpp_type=1, + label=2, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="truncated", + full_name="spotify.playlist4.proto.ListItems.truncated", + index=1, + number=2, + type=8, + cpp_type=7, + label=2, + has_default_value=False, + default_value=False, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="items", + full_name="spotify.playlist4.proto.ListItems.items", + index=2, + number=3, + type=11, + cpp_type=10, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="meta_items", + full_name="spotify.playlist4.proto.ListItems.meta_items", + index=3, + number=4, + type=11, + cpp_type=10, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax="proto2", + extension_ranges=[], + oneofs=[], + serialized_start=287, + serialized_end=431, +) + +_FORMATLISTATTRIBUTE = _descriptor.Descriptor( + name="FormatListAttribute", + full_name="spotify.playlist4.proto.FormatListAttribute", + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name="key", + full_name="spotify.playlist4.proto.FormatListAttribute.key", + index=0, + number=1, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="value", + full_name="spotify.playlist4.proto.FormatListAttribute.value", + index=1, + number=2, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax="proto2", + extension_ranges=[], + oneofs=[], + serialized_start=433, + serialized_end=482, +) + +_LISTATTRIBUTES = _descriptor.Descriptor( + name="ListAttributes", + full_name="spotify.playlist4.proto.ListAttributes", + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name="name", + full_name="spotify.playlist4.proto.ListAttributes.name", + index=0, + number=1, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="description", + full_name="spotify.playlist4.proto.ListAttributes.description", + index=1, + number=2, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="picture", + full_name="spotify.playlist4.proto.ListAttributes.picture", + index=2, + number=3, + type=12, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"", + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="collaborative", + full_name="spotify.playlist4.proto.ListAttributes.collaborative", + index=3, + number=4, + type=8, + cpp_type=7, + label=1, + has_default_value=False, + default_value=False, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="pl3_version", + full_name="spotify.playlist4.proto.ListAttributes.pl3_version", + index=4, + number=5, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="deleted_by_owner", + full_name="spotify.playlist4.proto.ListAttributes.deleted_by_owner", + index=5, + number=6, + type=8, + cpp_type=7, + label=1, + has_default_value=False, + default_value=False, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="client_id", + full_name="spotify.playlist4.proto.ListAttributes.client_id", + index=6, + number=10, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="format", + full_name="spotify.playlist4.proto.ListAttributes.format", + index=7, + number=11, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="format_attributes", + full_name= + "spotify.playlist4.proto.ListAttributes.format_attributes", + index=8, + number=12, + type=11, + cpp_type=10, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax="proto2", + extension_ranges=[], + oneofs=[], + serialized_start=485, + serialized_end=731, +) + +_ITEMATTRIBUTES = _descriptor.Descriptor( + name="ItemAttributes", + full_name="spotify.playlist4.proto.ItemAttributes", + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name="added_by", + full_name="spotify.playlist4.proto.ItemAttributes.added_by", + index=0, + number=1, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="timestamp", + full_name="spotify.playlist4.proto.ItemAttributes.timestamp", + index=1, + number=2, + type=3, + cpp_type=2, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="seen_at", + full_name="spotify.playlist4.proto.ItemAttributes.seen_at", + index=2, + number=9, + type=3, + cpp_type=2, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="public", + full_name="spotify.playlist4.proto.ItemAttributes.public", + index=3, + number=10, + type=8, + cpp_type=7, + label=1, + has_default_value=False, + default_value=False, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="format_attributes", + full_name= + "spotify.playlist4.proto.ItemAttributes.format_attributes", + index=4, + number=11, + type=11, + cpp_type=10, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="item_id", + full_name="spotify.playlist4.proto.ItemAttributes.item_id", + index=5, + number=12, + type=12, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"", + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax="proto2", + extension_ranges=[], + oneofs=[], + serialized_start=734, + serialized_end=910, +) + +_ADD = _descriptor.Descriptor( + name="Add", + full_name="spotify.playlist4.proto.Add", + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name="from_index", + full_name="spotify.playlist4.proto.Add.from_index", + index=0, + number=1, + type=5, + cpp_type=1, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="items", + full_name="spotify.playlist4.proto.Add.items", + index=1, + number=2, + type=11, + cpp_type=10, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="add_last", + full_name="spotify.playlist4.proto.Add.add_last", + index=2, + number=4, + type=8, + cpp_type=7, + label=1, + has_default_value=False, + default_value=False, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="add_first", + full_name="spotify.playlist4.proto.Add.add_first", + index=3, + number=5, + type=8, + cpp_type=7, + label=1, + has_default_value=False, + default_value=False, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax="proto2", + extension_ranges=[], + oneofs=[], + serialized_start=912, + serialized_end=1020, +) + +_REM = _descriptor.Descriptor( + name="Rem", + full_name="spotify.playlist4.proto.Rem", + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name="from_index", + full_name="spotify.playlist4.proto.Rem.from_index", + index=0, + number=1, + type=5, + cpp_type=1, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="length", + full_name="spotify.playlist4.proto.Rem.length", + index=1, + number=2, + type=5, + cpp_type=1, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="items", + full_name="spotify.playlist4.proto.Rem.items", + index=2, + number=3, + type=11, + cpp_type=10, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="items_as_key", + full_name="spotify.playlist4.proto.Rem.items_as_key", + index=3, + number=7, + type=8, + cpp_type=7, + label=1, + has_default_value=False, + default_value=False, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax="proto2", + extension_ranges=[], + oneofs=[], + serialized_start=1022, + serialized_end=1131, +) + +_MOV = _descriptor.Descriptor( + name="Mov", + full_name="spotify.playlist4.proto.Mov", + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name="from_index", + full_name="spotify.playlist4.proto.Mov.from_index", + index=0, + number=1, + type=5, + cpp_type=1, + label=2, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="length", + full_name="spotify.playlist4.proto.Mov.length", + index=1, + number=2, + type=5, + cpp_type=1, + label=2, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="to_index", + full_name="spotify.playlist4.proto.Mov.to_index", + index=2, + number=3, + type=5, + cpp_type=1, + label=2, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax="proto2", + extension_ranges=[], + oneofs=[], + serialized_start=1133, + serialized_end=1192, +) + +_ITEMATTRIBUTESPARTIALSTATE = _descriptor.Descriptor( + name="ItemAttributesPartialState", + full_name="spotify.playlist4.proto.ItemAttributesPartialState", + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name="values", + full_name= + "spotify.playlist4.proto.ItemAttributesPartialState.values", + index=0, + number=1, + type=11, + cpp_type=10, + label=2, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="no_value", + full_name= + "spotify.playlist4.proto.ItemAttributesPartialState.no_value", + index=1, + number=2, + type=14, + cpp_type=8, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax="proto2", + extension_ranges=[], + oneofs=[], + serialized_start=1195, + serialized_end=1342, +) + +_LISTATTRIBUTESPARTIALSTATE = _descriptor.Descriptor( + name="ListAttributesPartialState", + full_name="spotify.playlist4.proto.ListAttributesPartialState", + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name="values", + full_name= + "spotify.playlist4.proto.ListAttributesPartialState.values", + index=0, + number=1, + type=11, + cpp_type=10, + label=2, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="no_value", + full_name= + "spotify.playlist4.proto.ListAttributesPartialState.no_value", + index=1, + number=2, + type=14, + cpp_type=8, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax="proto2", + extension_ranges=[], + oneofs=[], + serialized_start=1345, + serialized_end=1492, +) + +_UPDATEITEMATTRIBUTES = _descriptor.Descriptor( + name="UpdateItemAttributes", + full_name="spotify.playlist4.proto.UpdateItemAttributes", + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name="index", + full_name="spotify.playlist4.proto.UpdateItemAttributes.index", + index=0, + number=1, + type=5, + cpp_type=1, + label=2, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="new_attributes", + full_name= + "spotify.playlist4.proto.UpdateItemAttributes.new_attributes", + index=1, + number=2, + type=11, + cpp_type=10, + label=2, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="old_attributes", + full_name= + "spotify.playlist4.proto.UpdateItemAttributes.old_attributes", + index=2, + number=3, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax="proto2", + extension_ranges=[], + oneofs=[], + serialized_start=1495, + serialized_end=1686, +) + +_UPDATELISTATTRIBUTES = _descriptor.Descriptor( + name="UpdateListAttributes", + full_name="spotify.playlist4.proto.UpdateListAttributes", + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name="new_attributes", + full_name= + "spotify.playlist4.proto.UpdateListAttributes.new_attributes", + index=0, + number=1, + type=11, + cpp_type=10, + label=2, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="old_attributes", + full_name= + "spotify.playlist4.proto.UpdateListAttributes.old_attributes", + index=1, + number=2, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax="proto2", + extension_ranges=[], + oneofs=[], + serialized_start=1689, + serialized_end=1865, +) + +_OP = _descriptor.Descriptor( + name="Op", + full_name="spotify.playlist4.proto.Op", + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name="kind", + full_name="spotify.playlist4.proto.Op.kind", + index=0, + number=1, + type=14, + cpp_type=8, + label=2, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="add", + full_name="spotify.playlist4.proto.Op.add", + index=1, + number=2, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="rem", + full_name="spotify.playlist4.proto.Op.rem", + index=2, + number=3, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="mov", + full_name="spotify.playlist4.proto.Op.mov", + index=3, + number=4, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="update_item_attributes", + full_name="spotify.playlist4.proto.Op.update_item_attributes", + index=4, + number=5, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="update_list_attributes", + full_name="spotify.playlist4.proto.Op.update_list_attributes", + index=5, + number=6, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + ], + extensions=[], + nested_types=[], + enum_types=[ + _OP_KIND, + ], + serialized_options=None, + is_extendable=False, + syntax="proto2", + extension_ranges=[], + oneofs=[], + serialized_start=1868, + serialized_end=2316, +) + +_OPLIST = _descriptor.Descriptor( + name="OpList", + full_name="spotify.playlist4.proto.OpList", + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name="ops", + full_name="spotify.playlist4.proto.OpList.ops", + index=0, + number=1, + type=11, + cpp_type=10, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax="proto2", + extension_ranges=[], + oneofs=[], + serialized_start=2318, + serialized_end=2368, +) + +_CHANGEINFO = _descriptor.Descriptor( + name="ChangeInfo", + full_name="spotify.playlist4.proto.ChangeInfo", + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name="user", + full_name="spotify.playlist4.proto.ChangeInfo.user", + index=0, + number=1, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="timestamp", + full_name="spotify.playlist4.proto.ChangeInfo.timestamp", + index=1, + number=2, + type=3, + cpp_type=2, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="admin", + full_name="spotify.playlist4.proto.ChangeInfo.admin", + index=2, + number=3, + type=8, + cpp_type=7, + label=1, + has_default_value=False, + default_value=False, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="undo", + full_name="spotify.playlist4.proto.ChangeInfo.undo", + index=3, + number=4, + type=8, + cpp_type=7, + label=1, + has_default_value=False, + default_value=False, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="redo", + full_name="spotify.playlist4.proto.ChangeInfo.redo", + index=4, + number=5, + type=8, + cpp_type=7, + label=1, + has_default_value=False, + default_value=False, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="merge", + full_name="spotify.playlist4.proto.ChangeInfo.merge", + index=5, + number=6, + type=8, + cpp_type=7, + label=1, + has_default_value=False, + default_value=False, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="compressed", + full_name="spotify.playlist4.proto.ChangeInfo.compressed", + index=6, + number=7, + type=8, + cpp_type=7, + label=1, + has_default_value=False, + default_value=False, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="migration", + full_name="spotify.playlist4.proto.ChangeInfo.migration", + index=7, + number=8, + type=8, + cpp_type=7, + label=1, + has_default_value=False, + default_value=False, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="split_id", + full_name="spotify.playlist4.proto.ChangeInfo.split_id", + index=8, + number=9, + type=5, + cpp_type=1, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="source", + full_name="spotify.playlist4.proto.ChangeInfo.source", + index=9, + number=10, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax="proto2", + extension_ranges=[], + oneofs=[], + serialized_start=2371, + serialized_end=2584, +) + +_SOURCEINFO = _descriptor.Descriptor( + name="SourceInfo", + full_name="spotify.playlist4.proto.SourceInfo", + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name="client", + full_name="spotify.playlist4.proto.SourceInfo.client", + index=0, + number=1, + type=14, + cpp_type=8, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="app", + full_name="spotify.playlist4.proto.SourceInfo.app", + index=1, + number=3, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="source", + full_name="spotify.playlist4.proto.SourceInfo.source", + index=2, + number=4, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="version", + full_name="spotify.playlist4.proto.SourceInfo.version", + index=3, + number=5, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + ], + extensions=[], + nested_types=[], + enum_types=[ + _SOURCEINFO_CLIENT, + ], + serialized_options=None, + is_extendable=False, + syntax="proto2", + extension_ranges=[], + oneofs=[], + serialized_start=2587, + serialized_end=2819, +) + +_DELTA = _descriptor.Descriptor( + name="Delta", + full_name="spotify.playlist4.proto.Delta", + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name="base_version", + full_name="spotify.playlist4.proto.Delta.base_version", + index=0, + number=1, + type=12, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"", + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="ops", + full_name="spotify.playlist4.proto.Delta.ops", + index=1, + number=2, + type=11, + cpp_type=10, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="info", + full_name="spotify.playlist4.proto.Delta.info", + index=2, + number=4, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax="proto2", + extension_ranges=[], + oneofs=[], + serialized_start=2821, + serialized_end=2943, +) + +_DIFF = _descriptor.Descriptor( + name="Diff", + full_name="spotify.playlist4.proto.Diff", + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name="from_revision", + full_name="spotify.playlist4.proto.Diff.from_revision", + index=0, + number=1, + type=12, + cpp_type=9, + label=2, + has_default_value=False, + default_value=b"", + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="ops", + full_name="spotify.playlist4.proto.Diff.ops", + index=1, + number=2, + type=11, + cpp_type=10, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="to_revision", + full_name="spotify.playlist4.proto.Diff.to_revision", + index=2, + number=3, + type=12, + cpp_type=9, + label=2, + has_default_value=False, + default_value=b"", + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax="proto2", + extension_ranges=[], + oneofs=[], + serialized_start=2945, + serialized_end=3037, +) + +_LISTCHANGES = _descriptor.Descriptor( + name="ListChanges", + full_name="spotify.playlist4.proto.ListChanges", + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name="base_revision", + full_name="spotify.playlist4.proto.ListChanges.base_revision", + index=0, + number=1, + type=12, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"", + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="deltas", + full_name="spotify.playlist4.proto.ListChanges.deltas", + index=1, + number=2, + type=11, + cpp_type=10, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="want_resulting_revisions", + full_name= + "spotify.playlist4.proto.ListChanges.want_resulting_revisions", + index=2, + number=3, + type=8, + cpp_type=7, + label=1, + has_default_value=False, + default_value=False, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="want_sync_result", + full_name="spotify.playlist4.proto.ListChanges.want_sync_result", + index=3, + number=4, + type=8, + cpp_type=7, + label=1, + has_default_value=False, + default_value=False, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="nonces", + full_name="spotify.playlist4.proto.ListChanges.nonces", + index=4, + number=6, + type=3, + cpp_type=2, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax="proto2", + extension_ranges=[], + oneofs=[], + serialized_start=3040, + serialized_end=3200, +) + +_SELECTEDLISTCONTENT = _descriptor.Descriptor( + name="SelectedListContent", + full_name="spotify.playlist4.proto.SelectedListContent", + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name="revision", + full_name="spotify.playlist4.proto.SelectedListContent.revision", + index=0, + number=1, + type=12, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"", + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="length", + full_name="spotify.playlist4.proto.SelectedListContent.length", + index=1, + number=2, + type=5, + cpp_type=1, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="attributes", + full_name="spotify.playlist4.proto.SelectedListContent.attributes", + index=2, + number=3, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="contents", + full_name="spotify.playlist4.proto.SelectedListContent.contents", + index=3, + number=5, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="diff", + full_name="spotify.playlist4.proto.SelectedListContent.diff", + index=4, + number=6, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="sync_result", + full_name="spotify.playlist4.proto.SelectedListContent.sync_result", + index=5, + number=7, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="resulting_revisions", + full_name= + "spotify.playlist4.proto.SelectedListContent.resulting_revisions", + index=6, + number=8, + type=12, + cpp_type=9, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="multiple_heads", + full_name= + "spotify.playlist4.proto.SelectedListContent.multiple_heads", + index=7, + number=9, + type=8, + cpp_type=7, + label=1, + has_default_value=False, + default_value=False, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="up_to_date", + full_name="spotify.playlist4.proto.SelectedListContent.up_to_date", + index=8, + number=10, + type=8, + cpp_type=7, + label=1, + has_default_value=False, + default_value=False, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="nonces", + full_name="spotify.playlist4.proto.SelectedListContent.nonces", + index=9, + number=14, + type=3, + cpp_type=2, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="timestamp", + full_name="spotify.playlist4.proto.SelectedListContent.timestamp", + index=10, + number=15, + type=3, + cpp_type=2, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="owner_username", + full_name= + "spotify.playlist4.proto.SelectedListContent.owner_username", + index=11, + number=16, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax="proto2", + extension_ranges=[], + oneofs=[], + serialized_start=3203, + serialized_end=3602, +) + +_CREATELISTREPLY = _descriptor.Descriptor( + name="CreateListReply", + full_name="spotify.playlist4.proto.CreateListReply", + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name="uri", + full_name="spotify.playlist4.proto.CreateListReply.uri", + index=0, + number=1, + type=12, + cpp_type=9, + label=2, + has_default_value=False, + default_value=b"", + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="revision", + full_name="spotify.playlist4.proto.CreateListReply.revision", + index=1, + number=2, + type=12, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"", + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax="proto2", + extension_ranges=[], + oneofs=[], + serialized_start=3604, + serialized_end=3652, +) + +_MODIFYREPLY = _descriptor.Descriptor( + name="ModifyReply", + full_name="spotify.playlist4.proto.ModifyReply", + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name="uri", + full_name="spotify.playlist4.proto.ModifyReply.uri", + index=0, + number=1, + type=12, + cpp_type=9, + label=2, + has_default_value=False, + default_value=b"", + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="revision", + full_name="spotify.playlist4.proto.ModifyReply.revision", + index=1, + number=2, + type=12, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"", + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax="proto2", + extension_ranges=[], + oneofs=[], + serialized_start=3654, + serialized_end=3698, +) + +_SUBSCRIBEREQUEST = _descriptor.Descriptor( + name="SubscribeRequest", + full_name="spotify.playlist4.proto.SubscribeRequest", + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name="uris", + full_name="spotify.playlist4.proto.SubscribeRequest.uris", + index=0, + number=1, + type=12, + cpp_type=9, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax="proto2", + extension_ranges=[], + oneofs=[], + serialized_start=3700, + serialized_end=3732, +) + +_UNSUBSCRIBEREQUEST = _descriptor.Descriptor( + name="UnsubscribeRequest", + full_name="spotify.playlist4.proto.UnsubscribeRequest", + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name="uris", + full_name="spotify.playlist4.proto.UnsubscribeRequest.uris", + index=0, + number=1, + type=12, + cpp_type=9, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax="proto2", + extension_ranges=[], + oneofs=[], + serialized_start=3734, + serialized_end=3768, +) + +_PLAYLISTMODIFICATIONINFO = _descriptor.Descriptor( + name="PlaylistModificationInfo", + full_name="spotify.playlist4.proto.PlaylistModificationInfo", + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name="uri", + full_name="spotify.playlist4.proto.PlaylistModificationInfo.uri", + index=0, + number=1, + type=12, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"", + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="new_revision", + full_name= + "spotify.playlist4.proto.PlaylistModificationInfo.new_revision", + index=1, + number=2, + type=12, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"", + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="parent_revision", + full_name= + "spotify.playlist4.proto.PlaylistModificationInfo.parent_revision", + index=2, + number=3, + type=12, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"", + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="ops", + full_name="spotify.playlist4.proto.PlaylistModificationInfo.ops", + index=3, + number=4, + type=11, + cpp_type=10, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax="proto2", + extension_ranges=[], + oneofs=[], + serialized_start=3771, + serialized_end=3899, +) + +_ITEM.fields_by_name["attributes"].message_type = _ITEMATTRIBUTES +_METAITEM.fields_by_name["attributes"].message_type = _LISTATTRIBUTES +_LISTITEMS.fields_by_name["items"].message_type = _ITEM +_LISTITEMS.fields_by_name["meta_items"].message_type = _METAITEM +_LISTATTRIBUTES.fields_by_name[ + "format_attributes"].message_type = _FORMATLISTATTRIBUTE +_ITEMATTRIBUTES.fields_by_name[ + "format_attributes"].message_type = _FORMATLISTATTRIBUTE +_ADD.fields_by_name["items"].message_type = _ITEM +_REM.fields_by_name["items"].message_type = _ITEM +_ITEMATTRIBUTESPARTIALSTATE.fields_by_name[ + "values"].message_type = _ITEMATTRIBUTES +_ITEMATTRIBUTESPARTIALSTATE.fields_by_name[ + "no_value"].enum_type = _ITEMATTRIBUTEKIND +_LISTATTRIBUTESPARTIALSTATE.fields_by_name[ + "values"].message_type = _LISTATTRIBUTES +_LISTATTRIBUTESPARTIALSTATE.fields_by_name[ + "no_value"].enum_type = _LISTATTRIBUTEKIND +_UPDATEITEMATTRIBUTES.fields_by_name[ + "new_attributes"].message_type = _ITEMATTRIBUTESPARTIALSTATE +_UPDATEITEMATTRIBUTES.fields_by_name[ + "old_attributes"].message_type = _ITEMATTRIBUTESPARTIALSTATE +_UPDATELISTATTRIBUTES.fields_by_name[ + "new_attributes"].message_type = _LISTATTRIBUTESPARTIALSTATE +_UPDATELISTATTRIBUTES.fields_by_name[ + "old_attributes"].message_type = _LISTATTRIBUTESPARTIALSTATE +_OP.fields_by_name["kind"].enum_type = _OP_KIND +_OP.fields_by_name["add"].message_type = _ADD +_OP.fields_by_name["rem"].message_type = _REM +_OP.fields_by_name["mov"].message_type = _MOV +_OP.fields_by_name[ + "update_item_attributes"].message_type = _UPDATEITEMATTRIBUTES +_OP.fields_by_name[ + "update_list_attributes"].message_type = _UPDATELISTATTRIBUTES +_OP_KIND.containing_type = _OP +_OPLIST.fields_by_name["ops"].message_type = _OP +_CHANGEINFO.fields_by_name["source"].message_type = _SOURCEINFO +_SOURCEINFO.fields_by_name["client"].enum_type = _SOURCEINFO_CLIENT +_SOURCEINFO_CLIENT.containing_type = _SOURCEINFO +_DELTA.fields_by_name["ops"].message_type = _OP +_DELTA.fields_by_name["info"].message_type = _CHANGEINFO +_DIFF.fields_by_name["ops"].message_type = _OP +_LISTCHANGES.fields_by_name["deltas"].message_type = _DELTA +_SELECTEDLISTCONTENT.fields_by_name[ + "attributes"].message_type = _LISTATTRIBUTES +_SELECTEDLISTCONTENT.fields_by_name["contents"].message_type = _LISTITEMS +_SELECTEDLISTCONTENT.fields_by_name["diff"].message_type = _DIFF +_SELECTEDLISTCONTENT.fields_by_name["sync_result"].message_type = _DIFF +_PLAYLISTMODIFICATIONINFO.fields_by_name["ops"].message_type = _OP +DESCRIPTOR.message_types_by_name["Item"] = _ITEM +DESCRIPTOR.message_types_by_name["MetaItem"] = _METAITEM +DESCRIPTOR.message_types_by_name["ListItems"] = _LISTITEMS +DESCRIPTOR.message_types_by_name["FormatListAttribute"] = _FORMATLISTATTRIBUTE +DESCRIPTOR.message_types_by_name["ListAttributes"] = _LISTATTRIBUTES +DESCRIPTOR.message_types_by_name["ItemAttributes"] = _ITEMATTRIBUTES +DESCRIPTOR.message_types_by_name["Add"] = _ADD +DESCRIPTOR.message_types_by_name["Rem"] = _REM +DESCRIPTOR.message_types_by_name["Mov"] = _MOV +DESCRIPTOR.message_types_by_name[ + "ItemAttributesPartialState"] = _ITEMATTRIBUTESPARTIALSTATE +DESCRIPTOR.message_types_by_name[ + "ListAttributesPartialState"] = _LISTATTRIBUTESPARTIALSTATE +DESCRIPTOR.message_types_by_name[ + "UpdateItemAttributes"] = _UPDATEITEMATTRIBUTES +DESCRIPTOR.message_types_by_name[ + "UpdateListAttributes"] = _UPDATELISTATTRIBUTES +DESCRIPTOR.message_types_by_name["Op"] = _OP +DESCRIPTOR.message_types_by_name["OpList"] = _OPLIST +DESCRIPTOR.message_types_by_name["ChangeInfo"] = _CHANGEINFO +DESCRIPTOR.message_types_by_name["SourceInfo"] = _SOURCEINFO +DESCRIPTOR.message_types_by_name["Delta"] = _DELTA +DESCRIPTOR.message_types_by_name["Diff"] = _DIFF +DESCRIPTOR.message_types_by_name["ListChanges"] = _LISTCHANGES +DESCRIPTOR.message_types_by_name["SelectedListContent"] = _SELECTEDLISTCONTENT +DESCRIPTOR.message_types_by_name["CreateListReply"] = _CREATELISTREPLY +DESCRIPTOR.message_types_by_name["ModifyReply"] = _MODIFYREPLY +DESCRIPTOR.message_types_by_name["SubscribeRequest"] = _SUBSCRIBEREQUEST +DESCRIPTOR.message_types_by_name["UnsubscribeRequest"] = _UNSUBSCRIBEREQUEST +DESCRIPTOR.message_types_by_name[ + "PlaylistModificationInfo"] = _PLAYLISTMODIFICATIONINFO +DESCRIPTOR.enum_types_by_name["ListAttributeKind"] = _LISTATTRIBUTEKIND +DESCRIPTOR.enum_types_by_name["ItemAttributeKind"] = _ITEMATTRIBUTEKIND +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +Item = _reflection.GeneratedProtocolMessageType( + "Item", + (_message.Message, ), + { + "DESCRIPTOR": _ITEM, + "__module__": "playlist4_external_pb2" + # @@protoc_insertion_point(class_scope:spotify.playlist4.proto.Item) + }, +) +_sym_db.RegisterMessage(Item) + +MetaItem = _reflection.GeneratedProtocolMessageType( + "MetaItem", + (_message.Message, ), + { + "DESCRIPTOR": _METAITEM, + "__module__": "playlist4_external_pb2" + # @@protoc_insertion_point(class_scope:spotify.playlist4.proto.MetaItem) + }, +) +_sym_db.RegisterMessage(MetaItem) + +ListItems = _reflection.GeneratedProtocolMessageType( + "ListItems", + (_message.Message, ), + { + "DESCRIPTOR": _LISTITEMS, + "__module__": "playlist4_external_pb2" + # @@protoc_insertion_point(class_scope:spotify.playlist4.proto.ListItems) + }, +) +_sym_db.RegisterMessage(ListItems) + +FormatListAttribute = _reflection.GeneratedProtocolMessageType( + "FormatListAttribute", + (_message.Message, ), + { + "DESCRIPTOR": _FORMATLISTATTRIBUTE, + "__module__": "playlist4_external_pb2" + # @@protoc_insertion_point(class_scope:spotify.playlist4.proto.FormatListAttribute) + }, +) +_sym_db.RegisterMessage(FormatListAttribute) + +ListAttributes = _reflection.GeneratedProtocolMessageType( + "ListAttributes", + (_message.Message, ), + { + "DESCRIPTOR": _LISTATTRIBUTES, + "__module__": "playlist4_external_pb2" + # @@protoc_insertion_point(class_scope:spotify.playlist4.proto.ListAttributes) + }, +) +_sym_db.RegisterMessage(ListAttributes) + +ItemAttributes = _reflection.GeneratedProtocolMessageType( + "ItemAttributes", + (_message.Message, ), + { + "DESCRIPTOR": _ITEMATTRIBUTES, + "__module__": "playlist4_external_pb2" + # @@protoc_insertion_point(class_scope:spotify.playlist4.proto.ItemAttributes) + }, +) +_sym_db.RegisterMessage(ItemAttributes) + +Add = _reflection.GeneratedProtocolMessageType( + "Add", + (_message.Message, ), + { + "DESCRIPTOR": _ADD, + "__module__": "playlist4_external_pb2" + # @@protoc_insertion_point(class_scope:spotify.playlist4.proto.Add) + }, +) +_sym_db.RegisterMessage(Add) + +Rem = _reflection.GeneratedProtocolMessageType( + "Rem", + (_message.Message, ), + { + "DESCRIPTOR": _REM, + "__module__": "playlist4_external_pb2" + # @@protoc_insertion_point(class_scope:spotify.playlist4.proto.Rem) + }, +) +_sym_db.RegisterMessage(Rem) + +Mov = _reflection.GeneratedProtocolMessageType( + "Mov", + (_message.Message, ), + { + "DESCRIPTOR": _MOV, + "__module__": "playlist4_external_pb2" + # @@protoc_insertion_point(class_scope:spotify.playlist4.proto.Mov) + }, +) +_sym_db.RegisterMessage(Mov) + +ItemAttributesPartialState = _reflection.GeneratedProtocolMessageType( + "ItemAttributesPartialState", + (_message.Message, ), + { + "DESCRIPTOR": _ITEMATTRIBUTESPARTIALSTATE, + "__module__": "playlist4_external_pb2" + # @@protoc_insertion_point(class_scope:spotify.playlist4.proto.ItemAttributesPartialState) + }, +) +_sym_db.RegisterMessage(ItemAttributesPartialState) + +ListAttributesPartialState = _reflection.GeneratedProtocolMessageType( + "ListAttributesPartialState", + (_message.Message, ), + { + "DESCRIPTOR": _LISTATTRIBUTESPARTIALSTATE, + "__module__": "playlist4_external_pb2" + # @@protoc_insertion_point(class_scope:spotify.playlist4.proto.ListAttributesPartialState) + }, +) +_sym_db.RegisterMessage(ListAttributesPartialState) + +UpdateItemAttributes = _reflection.GeneratedProtocolMessageType( + "UpdateItemAttributes", + (_message.Message, ), + { + "DESCRIPTOR": _UPDATEITEMATTRIBUTES, + "__module__": "playlist4_external_pb2" + # @@protoc_insertion_point(class_scope:spotify.playlist4.proto.UpdateItemAttributes) + }, +) +_sym_db.RegisterMessage(UpdateItemAttributes) + +UpdateListAttributes = _reflection.GeneratedProtocolMessageType( + "UpdateListAttributes", + (_message.Message, ), + { + "DESCRIPTOR": _UPDATELISTATTRIBUTES, + "__module__": "playlist4_external_pb2" + # @@protoc_insertion_point(class_scope:spotify.playlist4.proto.UpdateListAttributes) + }, +) +_sym_db.RegisterMessage(UpdateListAttributes) + +Op = _reflection.GeneratedProtocolMessageType( + "Op", + (_message.Message, ), + { + "DESCRIPTOR": _OP, + "__module__": "playlist4_external_pb2" + # @@protoc_insertion_point(class_scope:spotify.playlist4.proto.Op) + }, +) +_sym_db.RegisterMessage(Op) + +OpList = _reflection.GeneratedProtocolMessageType( + "OpList", + (_message.Message, ), + { + "DESCRIPTOR": _OPLIST, + "__module__": "playlist4_external_pb2" + # @@protoc_insertion_point(class_scope:spotify.playlist4.proto.OpList) + }, +) +_sym_db.RegisterMessage(OpList) + +ChangeInfo = _reflection.GeneratedProtocolMessageType( + "ChangeInfo", + (_message.Message, ), + { + "DESCRIPTOR": _CHANGEINFO, + "__module__": "playlist4_external_pb2" + # @@protoc_insertion_point(class_scope:spotify.playlist4.proto.ChangeInfo) + }, +) +_sym_db.RegisterMessage(ChangeInfo) + +SourceInfo = _reflection.GeneratedProtocolMessageType( + "SourceInfo", + (_message.Message, ), + { + "DESCRIPTOR": _SOURCEINFO, + "__module__": "playlist4_external_pb2" + # @@protoc_insertion_point(class_scope:spotify.playlist4.proto.SourceInfo) + }, +) +_sym_db.RegisterMessage(SourceInfo) + +Delta = _reflection.GeneratedProtocolMessageType( + "Delta", + (_message.Message, ), + { + "DESCRIPTOR": _DELTA, + "__module__": "playlist4_external_pb2" + # @@protoc_insertion_point(class_scope:spotify.playlist4.proto.Delta) + }, +) +_sym_db.RegisterMessage(Delta) + +Diff = _reflection.GeneratedProtocolMessageType( + "Diff", + (_message.Message, ), + { + "DESCRIPTOR": _DIFF, + "__module__": "playlist4_external_pb2" + # @@protoc_insertion_point(class_scope:spotify.playlist4.proto.Diff) + }, +) +_sym_db.RegisterMessage(Diff) + +ListChanges = _reflection.GeneratedProtocolMessageType( + "ListChanges", + (_message.Message, ), + { + "DESCRIPTOR": _LISTCHANGES, + "__module__": "playlist4_external_pb2" + # @@protoc_insertion_point(class_scope:spotify.playlist4.proto.ListChanges) + }, +) +_sym_db.RegisterMessage(ListChanges) + +SelectedListContent = _reflection.GeneratedProtocolMessageType( + "SelectedListContent", + (_message.Message, ), + { + "DESCRIPTOR": _SELECTEDLISTCONTENT, + "__module__": "playlist4_external_pb2" + # @@protoc_insertion_point(class_scope:spotify.playlist4.proto.SelectedListContent) + }, +) +_sym_db.RegisterMessage(SelectedListContent) + +CreateListReply = _reflection.GeneratedProtocolMessageType( + "CreateListReply", + (_message.Message, ), + { + "DESCRIPTOR": _CREATELISTREPLY, + "__module__": "playlist4_external_pb2" + # @@protoc_insertion_point(class_scope:spotify.playlist4.proto.CreateListReply) + }, +) +_sym_db.RegisterMessage(CreateListReply) + +ModifyReply = _reflection.GeneratedProtocolMessageType( + "ModifyReply", + (_message.Message, ), + { + "DESCRIPTOR": _MODIFYREPLY, + "__module__": "playlist4_external_pb2" + # @@protoc_insertion_point(class_scope:spotify.playlist4.proto.ModifyReply) + }, +) +_sym_db.RegisterMessage(ModifyReply) + +SubscribeRequest = _reflection.GeneratedProtocolMessageType( + "SubscribeRequest", + (_message.Message, ), + { + "DESCRIPTOR": _SUBSCRIBEREQUEST, + "__module__": "playlist4_external_pb2" + # @@protoc_insertion_point(class_scope:spotify.playlist4.proto.SubscribeRequest) + }, +) +_sym_db.RegisterMessage(SubscribeRequest) + +UnsubscribeRequest = _reflection.GeneratedProtocolMessageType( + "UnsubscribeRequest", + (_message.Message, ), + { + "DESCRIPTOR": _UNSUBSCRIBEREQUEST, + "__module__": "playlist4_external_pb2" + # @@protoc_insertion_point(class_scope:spotify.playlist4.proto.UnsubscribeRequest) + }, +) +_sym_db.RegisterMessage(UnsubscribeRequest) + +PlaylistModificationInfo = _reflection.GeneratedProtocolMessageType( + "PlaylistModificationInfo", + (_message.Message, ), + { + "DESCRIPTOR": _PLAYLISTMODIFICATIONINFO, + "__module__": "playlist4_external_pb2" + # @@protoc_insertion_point(class_scope:spotify.playlist4.proto.PlaylistModificationInfo) + }, +) +_sym_db.RegisterMessage(PlaylistModificationInfo) + +DESCRIPTOR._options = None +# @@protoc_insertion_point(module_scope) diff --git a/librespot/proto/PlaylistAnnotate3_pb2.py b/librespot/proto/PlaylistAnnotate3_pb2.py new file mode 100644 index 0000000..265b99b --- /dev/null +++ b/librespot/proto/PlaylistAnnotate3_pb2.py @@ -0,0 +1,460 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: playlist_annotate3.proto +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import enum_type_wrapper + +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + +DESCRIPTOR = _descriptor.FileDescriptor( + name="playlist_annotate3.proto", + package="spotify_playlist_annotate3.proto", + syntax="proto2", + serialized_options=b"\n\036com.spotify.playlist_annotate3H\002", + create_key=_descriptor._internal_create_key, + serialized_pb= + b'\n\x18playlist_annotate3.proto\x12 spotify_playlist_annotate3.proto"a\n\x0fTakedownRequest\x12N\n\x12\x61\x62use_report_state\x18\x01 \x01(\x0e\x32\x32.spotify_playlist_annotate3.proto.AbuseReportState"9\n\x0f\x41nnotateRequest\x12\x13\n\x0b\x64\x65scription\x18\x01 \x01(\t\x12\x11\n\timage_uri\x18\x02 \x01(\t"5\n\x11TranscodedPicture\x12\x13\n\x0btarget_name\x18\x01 \x01(\t\x12\x0b\n\x03uri\x18\x02 \x01(\t"\xf4\x02\n\x12PlaylistAnnotation\x12\x13\n\x0b\x64\x65scription\x18\x01 \x01(\t\x12\x0f\n\x07picture\x18\x02 \x01(\t\x12i\n\x1a\x64\x65precated_render_features\x18\x03 \x01(\x0e\x32\x30.spotify_playlist_annotate3.proto.RenderFeatures:\x0fNORMAL_FEATURESB\x02\x18\x01\x12O\n\x12transcoded_picture\x18\x04 \x03(\x0b\x32\x33.spotify_playlist_annotate3.proto.TranscodedPicture\x12(\n\x1ais_abuse_reporting_enabled\x18\x06 \x01(\x08:\x04true\x12R\n\x12\x61\x62use_report_state\x18\x07 \x01(\x0e\x32\x32.spotify_playlist_annotate3.proto.AbuseReportState:\x02OK*<\n\x0eRenderFeatures\x12\x13\n\x0fNORMAL_FEATURES\x10\x01\x12\x15\n\x11\x45XTENDED_FEATURES\x10\x02**\n\x10\x41\x62useReportState\x12\x06\n\x02OK\x10\x00\x12\x0e\n\nTAKEN_DOWN\x10\x01\x42"\n\x1e\x63om.spotify.playlist_annotate3H\x02', +) + +_RENDERFEATURES = _descriptor.EnumDescriptor( + name="RenderFeatures", + full_name="spotify_playlist_annotate3.proto.RenderFeatures", + filename=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + values=[ + _descriptor.EnumValueDescriptor( + name="NORMAL_FEATURES", + index=0, + number=1, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key, + ), + _descriptor.EnumValueDescriptor( + name="EXTENDED_FEATURES", + index=1, + number=2, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key, + ), + ], + containing_type=None, + serialized_options=None, + serialized_start=650, + serialized_end=710, +) +_sym_db.RegisterEnumDescriptor(_RENDERFEATURES) + +RenderFeatures = enum_type_wrapper.EnumTypeWrapper(_RENDERFEATURES) +_ABUSEREPORTSTATE = _descriptor.EnumDescriptor( + name="AbuseReportState", + full_name="spotify_playlist_annotate3.proto.AbuseReportState", + filename=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + values=[ + _descriptor.EnumValueDescriptor( + name="OK", + index=0, + number=0, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key, + ), + _descriptor.EnumValueDescriptor( + name="TAKEN_DOWN", + index=1, + number=1, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key, + ), + ], + containing_type=None, + serialized_options=None, + serialized_start=712, + serialized_end=754, +) +_sym_db.RegisterEnumDescriptor(_ABUSEREPORTSTATE) + +AbuseReportState = enum_type_wrapper.EnumTypeWrapper(_ABUSEREPORTSTATE) +NORMAL_FEATURES = 1 +EXTENDED_FEATURES = 2 +OK = 0 +TAKEN_DOWN = 1 + +_TAKEDOWNREQUEST = _descriptor.Descriptor( + name="TakedownRequest", + full_name="spotify_playlist_annotate3.proto.TakedownRequest", + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name="abuse_report_state", + full_name= + "spotify_playlist_annotate3.proto.TakedownRequest.abuse_report_state", + index=0, + number=1, + type=14, + cpp_type=8, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax="proto2", + extension_ranges=[], + oneofs=[], + serialized_start=62, + serialized_end=159, +) + +_ANNOTATEREQUEST = _descriptor.Descriptor( + name="AnnotateRequest", + full_name="spotify_playlist_annotate3.proto.AnnotateRequest", + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name="description", + full_name= + "spotify_playlist_annotate3.proto.AnnotateRequest.description", + index=0, + number=1, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="image_uri", + full_name= + "spotify_playlist_annotate3.proto.AnnotateRequest.image_uri", + index=1, + number=2, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax="proto2", + extension_ranges=[], + oneofs=[], + serialized_start=161, + serialized_end=218, +) + +_TRANSCODEDPICTURE = _descriptor.Descriptor( + name="TranscodedPicture", + full_name="spotify_playlist_annotate3.proto.TranscodedPicture", + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name="target_name", + full_name= + "spotify_playlist_annotate3.proto.TranscodedPicture.target_name", + index=0, + number=1, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="uri", + full_name="spotify_playlist_annotate3.proto.TranscodedPicture.uri", + index=1, + number=2, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax="proto2", + extension_ranges=[], + oneofs=[], + serialized_start=220, + serialized_end=273, +) + +_PLAYLISTANNOTATION = _descriptor.Descriptor( + name="PlaylistAnnotation", + full_name="spotify_playlist_annotate3.proto.PlaylistAnnotation", + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name="description", + full_name= + "spotify_playlist_annotate3.proto.PlaylistAnnotation.description", + index=0, + number=1, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="picture", + full_name= + "spotify_playlist_annotate3.proto.PlaylistAnnotation.picture", + index=1, + number=2, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="deprecated_render_features", + full_name= + "spotify_playlist_annotate3.proto.PlaylistAnnotation.deprecated_render_features", + index=2, + number=3, + type=14, + cpp_type=8, + label=1, + has_default_value=True, + default_value=1, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=b"\030\001", + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="transcoded_picture", + full_name= + "spotify_playlist_annotate3.proto.PlaylistAnnotation.transcoded_picture", + index=3, + number=4, + type=11, + cpp_type=10, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="is_abuse_reporting_enabled", + full_name= + "spotify_playlist_annotate3.proto.PlaylistAnnotation.is_abuse_reporting_enabled", + index=4, + number=6, + type=8, + cpp_type=7, + label=1, + has_default_value=True, + default_value=True, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="abuse_report_state", + full_name= + "spotify_playlist_annotate3.proto.PlaylistAnnotation.abuse_report_state", + index=5, + number=7, + type=14, + cpp_type=8, + label=1, + has_default_value=True, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax="proto2", + extension_ranges=[], + oneofs=[], + serialized_start=276, + serialized_end=648, +) + +_TAKEDOWNREQUEST.fields_by_name[ + "abuse_report_state"].enum_type = _ABUSEREPORTSTATE +_PLAYLISTANNOTATION.fields_by_name[ + "deprecated_render_features"].enum_type = _RENDERFEATURES +_PLAYLISTANNOTATION.fields_by_name[ + "transcoded_picture"].message_type = _TRANSCODEDPICTURE +_PLAYLISTANNOTATION.fields_by_name[ + "abuse_report_state"].enum_type = _ABUSEREPORTSTATE +DESCRIPTOR.message_types_by_name["TakedownRequest"] = _TAKEDOWNREQUEST +DESCRIPTOR.message_types_by_name["AnnotateRequest"] = _ANNOTATEREQUEST +DESCRIPTOR.message_types_by_name["TranscodedPicture"] = _TRANSCODEDPICTURE +DESCRIPTOR.message_types_by_name["PlaylistAnnotation"] = _PLAYLISTANNOTATION +DESCRIPTOR.enum_types_by_name["RenderFeatures"] = _RENDERFEATURES +DESCRIPTOR.enum_types_by_name["AbuseReportState"] = _ABUSEREPORTSTATE +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +TakedownRequest = _reflection.GeneratedProtocolMessageType( + "TakedownRequest", + (_message.Message, ), + { + "DESCRIPTOR": _TAKEDOWNREQUEST, + "__module__": "playlist_annotate3_pb2" + # @@protoc_insertion_point(class_scope:spotify_playlist_annotate3.proto.TakedownRequest) + }, +) +_sym_db.RegisterMessage(TakedownRequest) + +AnnotateRequest = _reflection.GeneratedProtocolMessageType( + "AnnotateRequest", + (_message.Message, ), + { + "DESCRIPTOR": _ANNOTATEREQUEST, + "__module__": "playlist_annotate3_pb2" + # @@protoc_insertion_point(class_scope:spotify_playlist_annotate3.proto.AnnotateRequest) + }, +) +_sym_db.RegisterMessage(AnnotateRequest) + +TranscodedPicture = _reflection.GeneratedProtocolMessageType( + "TranscodedPicture", + (_message.Message, ), + { + "DESCRIPTOR": _TRANSCODEDPICTURE, + "__module__": "playlist_annotate3_pb2" + # @@protoc_insertion_point(class_scope:spotify_playlist_annotate3.proto.TranscodedPicture) + }, +) +_sym_db.RegisterMessage(TranscodedPicture) + +PlaylistAnnotation = _reflection.GeneratedProtocolMessageType( + "PlaylistAnnotation", + (_message.Message, ), + { + "DESCRIPTOR": _PLAYLISTANNOTATION, + "__module__": "playlist_annotate3_pb2" + # @@protoc_insertion_point(class_scope:spotify_playlist_annotate3.proto.PlaylistAnnotation) + }, +) +_sym_db.RegisterMessage(PlaylistAnnotation) + +DESCRIPTOR._options = None +_PLAYLISTANNOTATION.fields_by_name[ + "deprecated_render_features"]._options = None +# @@protoc_insertion_point(module_scope) diff --git a/librespot/proto/Pubsub_pb2.py b/librespot/proto/Pubsub_pb2.py new file mode 100644 index 0000000..abe1b3e --- /dev/null +++ b/librespot/proto/Pubsub_pb2.py @@ -0,0 +1,112 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: pubsub.proto +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + +DESCRIPTOR = _descriptor.FileDescriptor( + name='pubsub.proto', + package='spotify', + syntax='proto2', + serialized_options=b'\n\013com.spotify', + create_key=_descriptor._internal_create_key, + serialized_pb= + b'\n\x0cpubsub.proto\x12\x07spotify\"@\n\x0cSubscription\x12\x0b\n\x03uri\x18\x01 \x01(\t\x12\x0e\n\x06\x65xpiry\x18\x02 \x01(\x05\x12\x13\n\x0bstatus_code\x18\x03 \x01(\x05\x42\r\n\x0b\x63om.spotify' +) + +_SUBSCRIPTION = _descriptor.Descriptor( + name='Subscription', + full_name='spotify.Subscription', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='uri', + full_name='spotify.Subscription.uri', + index=0, + number=1, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode('utf-8'), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='expiry', + full_name='spotify.Subscription.expiry', + index=1, + number=2, + type=5, + cpp_type=1, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='status_code', + full_name='spotify.Subscription.status_code', + index=2, + number=3, + type=5, + cpp_type=1, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax='proto2', + extension_ranges=[], + oneofs=[], + serialized_start=25, + serialized_end=89, +) + +DESCRIPTOR.message_types_by_name['Subscription'] = _SUBSCRIPTION +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +Subscription = _reflection.GeneratedProtocolMessageType( + 'Subscription', + (_message.Message, ), + { + 'DESCRIPTOR': _SUBSCRIPTION, + '__module__': 'pubsub_pb2' + # @@protoc_insertion_point(class_scope:spotify.Subscription) + }) +_sym_db.RegisterMessage(Subscription) + +DESCRIPTOR._options = None +# @@protoc_insertion_point(module_scope) diff --git a/librespot/proto/Queue_pb2.py b/librespot/proto/Queue_pb2.py new file mode 100644 index 0000000..0abb762 --- /dev/null +++ b/librespot/proto/Queue_pb2.py @@ -0,0 +1,104 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: queue.proto +"""Generated protocol buffer code.""" +import ContextTrack_pb2 as context__track__pb2 +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database + +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + +DESCRIPTOR = _descriptor.FileDescriptor( + name="queue.proto", + package="spotify.player.proto.transfer", + syntax="proto2", + serialized_options=b"\n\024com.spotify.transferH\002", + create_key=_descriptor._internal_create_key, + serialized_pb= + b'\n\x0bqueue.proto\x12\x1dspotify.player.proto.transfer\x1a\x13\x63ontext_track.proto"U\n\x05Queue\x12\x32\n\x06tracks\x18\x01 \x03(\x0b\x32".spotify.player.proto.ContextTrack\x12\x18\n\x10is_playing_queue\x18\x02 \x01(\x08\x42\x18\n\x14\x63om.spotify.transferH\x02', + dependencies=[ + context__track__pb2.DESCRIPTOR, + ], +) + +_QUEUE = _descriptor.Descriptor( + name="Queue", + full_name="spotify.player.proto.transfer.Queue", + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name="tracks", + full_name="spotify.player.proto.transfer.Queue.tracks", + index=0, + number=1, + type=11, + cpp_type=10, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="is_playing_queue", + full_name="spotify.player.proto.transfer.Queue.is_playing_queue", + index=1, + number=2, + type=8, + cpp_type=7, + label=1, + has_default_value=False, + default_value=False, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax="proto2", + extension_ranges=[], + oneofs=[], + serialized_start=67, + serialized_end=152, +) + +_QUEUE.fields_by_name[ + "tracks"].message_type = context__track__pb2._CONTEXTTRACK +DESCRIPTOR.message_types_by_name["Queue"] = _QUEUE +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +Queue = _reflection.GeneratedProtocolMessageType( + "Queue", + (_message.Message, ), + { + "DESCRIPTOR": _QUEUE, + "__module__": "queue_pb2" + # @@protoc_insertion_point(class_scope:spotify.player.proto.transfer.Queue) + }, +) +_sym_db.RegisterMessage(Queue) + +DESCRIPTOR._options = None +# @@protoc_insertion_point(module_scope) diff --git a/librespot/proto/Restrictions_pb2.py b/librespot/proto/Restrictions_pb2.py new file mode 100644 index 0000000..489e934 --- /dev/null +++ b/librespot/proto/Restrictions_pb2.py @@ -0,0 +1,480 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: restrictions.proto +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database + +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + +DESCRIPTOR = _descriptor.FileDescriptor( + name="restrictions.proto", + package="spotify.player.proto", + syntax="proto2", + serialized_options=b"\n\023com.spotify.contextH\002", + create_key=_descriptor._internal_create_key, + serialized_pb= + b'\n\x12restrictions.proto\x12\x14spotify.player.proto"\xbb\x07\n\x0cRestrictions\x12 \n\x18\x64isallow_pausing_reasons\x18\x01 \x03(\t\x12!\n\x19\x64isallow_resuming_reasons\x18\x02 \x03(\t\x12 \n\x18\x64isallow_seeking_reasons\x18\x03 \x03(\t\x12%\n\x1d\x64isallow_peeking_prev_reasons\x18\x04 \x03(\t\x12%\n\x1d\x64isallow_peeking_next_reasons\x18\x05 \x03(\t\x12&\n\x1e\x64isallow_skipping_prev_reasons\x18\x06 \x03(\t\x12&\n\x1e\x64isallow_skipping_next_reasons\x18\x07 \x03(\t\x12\x30\n(disallow_toggling_repeat_context_reasons\x18\x08 \x03(\t\x12.\n&disallow_toggling_repeat_track_reasons\x18\t \x03(\t\x12)\n!disallow_toggling_shuffle_reasons\x18\n \x03(\t\x12"\n\x1a\x64isallow_set_queue_reasons\x18\x0b \x03(\t\x12.\n&disallow_interrupting_playback_reasons\x18\x0c \x03(\t\x12.\n&disallow_transferring_playback_reasons\x18\r \x03(\t\x12\'\n\x1f\x64isallow_remote_control_reasons\x18\x0e \x03(\t\x12\x33\n+disallow_inserting_into_next_tracks_reasons\x18\x0f \x03(\t\x12\x36\n.disallow_inserting_into_context_tracks_reasons\x18\x10 \x03(\t\x12\x32\n*disallow_reordering_in_next_tracks_reasons\x18\x11 \x03(\t\x12\x35\n-disallow_reordering_in_context_tracks_reasons\x18\x12 \x03(\t\x12\x32\n*disallow_removing_from_next_tracks_reasons\x18\x13 \x03(\t\x12\x35\n-disallow_removing_from_context_tracks_reasons\x18\x14 \x03(\t\x12)\n!disallow_updating_context_reasons\x18\x15 \x03(\tB\x17\n\x13\x63om.spotify.contextH\x02', +) + +_RESTRICTIONS = _descriptor.Descriptor( + name="Restrictions", + full_name="spotify.player.proto.Restrictions", + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name="disallow_pausing_reasons", + full_name= + "spotify.player.proto.Restrictions.disallow_pausing_reasons", + index=0, + number=1, + type=9, + cpp_type=9, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="disallow_resuming_reasons", + full_name= + "spotify.player.proto.Restrictions.disallow_resuming_reasons", + index=1, + number=2, + type=9, + cpp_type=9, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="disallow_seeking_reasons", + full_name= + "spotify.player.proto.Restrictions.disallow_seeking_reasons", + index=2, + number=3, + type=9, + cpp_type=9, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="disallow_peeking_prev_reasons", + full_name= + "spotify.player.proto.Restrictions.disallow_peeking_prev_reasons", + index=3, + number=4, + type=9, + cpp_type=9, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="disallow_peeking_next_reasons", + full_name= + "spotify.player.proto.Restrictions.disallow_peeking_next_reasons", + index=4, + number=5, + type=9, + cpp_type=9, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="disallow_skipping_prev_reasons", + full_name= + "spotify.player.proto.Restrictions.disallow_skipping_prev_reasons", + index=5, + number=6, + type=9, + cpp_type=9, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="disallow_skipping_next_reasons", + full_name= + "spotify.player.proto.Restrictions.disallow_skipping_next_reasons", + index=6, + number=7, + type=9, + cpp_type=9, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="disallow_toggling_repeat_context_reasons", + full_name= + "spotify.player.proto.Restrictions.disallow_toggling_repeat_context_reasons", + index=7, + number=8, + type=9, + cpp_type=9, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="disallow_toggling_repeat_track_reasons", + full_name= + "spotify.player.proto.Restrictions.disallow_toggling_repeat_track_reasons", + index=8, + number=9, + type=9, + cpp_type=9, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="disallow_toggling_shuffle_reasons", + full_name= + "spotify.player.proto.Restrictions.disallow_toggling_shuffle_reasons", + index=9, + number=10, + type=9, + cpp_type=9, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="disallow_set_queue_reasons", + full_name= + "spotify.player.proto.Restrictions.disallow_set_queue_reasons", + index=10, + number=11, + type=9, + cpp_type=9, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="disallow_interrupting_playback_reasons", + full_name= + "spotify.player.proto.Restrictions.disallow_interrupting_playback_reasons", + index=11, + number=12, + type=9, + cpp_type=9, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="disallow_transferring_playback_reasons", + full_name= + "spotify.player.proto.Restrictions.disallow_transferring_playback_reasons", + index=12, + number=13, + type=9, + cpp_type=9, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="disallow_remote_control_reasons", + full_name= + "spotify.player.proto.Restrictions.disallow_remote_control_reasons", + index=13, + number=14, + type=9, + cpp_type=9, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="disallow_inserting_into_next_tracks_reasons", + full_name= + "spotify.player.proto.Restrictions.disallow_inserting_into_next_tracks_reasons", + index=14, + number=15, + type=9, + cpp_type=9, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="disallow_inserting_into_context_tracks_reasons", + full_name= + "spotify.player.proto.Restrictions.disallow_inserting_into_context_tracks_reasons", + index=15, + number=16, + type=9, + cpp_type=9, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="disallow_reordering_in_next_tracks_reasons", + full_name= + "spotify.player.proto.Restrictions.disallow_reordering_in_next_tracks_reasons", + index=16, + number=17, + type=9, + cpp_type=9, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="disallow_reordering_in_context_tracks_reasons", + full_name= + "spotify.player.proto.Restrictions.disallow_reordering_in_context_tracks_reasons", + index=17, + number=18, + type=9, + cpp_type=9, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="disallow_removing_from_next_tracks_reasons", + full_name= + "spotify.player.proto.Restrictions.disallow_removing_from_next_tracks_reasons", + index=18, + number=19, + type=9, + cpp_type=9, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="disallow_removing_from_context_tracks_reasons", + full_name= + "spotify.player.proto.Restrictions.disallow_removing_from_context_tracks_reasons", + index=19, + number=20, + type=9, + cpp_type=9, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="disallow_updating_context_reasons", + full_name= + "spotify.player.proto.Restrictions.disallow_updating_context_reasons", + index=20, + number=21, + type=9, + cpp_type=9, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax="proto2", + extension_ranges=[], + oneofs=[], + serialized_start=45, + serialized_end=1000, +) + +DESCRIPTOR.message_types_by_name["Restrictions"] = _RESTRICTIONS +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +Restrictions = _reflection.GeneratedProtocolMessageType( + "Restrictions", + (_message.Message, ), + { + "DESCRIPTOR": _RESTRICTIONS, + "__module__": "restrictions_pb2" + # @@protoc_insertion_point(class_scope:spotify.player.proto.Restrictions) + }, +) +_sym_db.RegisterMessage(Restrictions) + +DESCRIPTOR._options = None +# @@protoc_insertion_point(module_scope) diff --git a/librespot/proto/Session_pb2.py b/librespot/proto/Session_pb2.py new file mode 100644 index 0000000..9214092 --- /dev/null +++ b/librespot/proto/Session_pb2.py @@ -0,0 +1,149 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: session.proto +"""Generated protocol buffer code.""" +import Context_pb2 as context__pb2 +import ContextPlayerOptions_pb2 as context__player__options__pb2 +import PlayOrigin_pb2 as play__origin__pb2 +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database + +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + +DESCRIPTOR = _descriptor.FileDescriptor( + name="session.proto", + package="spotify.player.proto.transfer", + syntax="proto2", + serialized_options=b"\n\024com.spotify.transferH\002", + create_key=_descriptor._internal_create_key, + serialized_pb= + b'\n\rsession.proto\x12\x1dspotify.player.proto.transfer\x1a\rcontext.proto\x1a\x1c\x63ontext_player_options.proto\x1a\x11play_origin.proto"\xd3\x01\n\x07Session\x12\x35\n\x0bplay_origin\x18\x01 \x01(\x0b\x32 .spotify.player.proto.PlayOrigin\x12.\n\x07\x63ontext\x18\x02 \x01(\x0b\x32\x1d.spotify.player.proto.Context\x12\x13\n\x0b\x63urrent_uid\x18\x03 \x01(\t\x12L\n\x10option_overrides\x18\x04 \x01(\x0b\x32\x32.spotify.player.proto.ContextPlayerOptionOverridesB\x18\n\x14\x63om.spotify.transferH\x02', + dependencies=[ + context__pb2.DESCRIPTOR, + context__player__options__pb2.DESCRIPTOR, + play__origin__pb2.DESCRIPTOR, + ], +) + +_SESSION = _descriptor.Descriptor( + name="Session", + full_name="spotify.player.proto.transfer.Session", + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name="play_origin", + full_name="spotify.player.proto.transfer.Session.play_origin", + index=0, + number=1, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="context", + full_name="spotify.player.proto.transfer.Session.context", + index=1, + number=2, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="current_uid", + full_name="spotify.player.proto.transfer.Session.current_uid", + index=2, + number=3, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="option_overrides", + full_name="spotify.player.proto.transfer.Session.option_overrides", + index=3, + number=4, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax="proto2", + extension_ranges=[], + oneofs=[], + serialized_start=113, + serialized_end=324, +) + +_SESSION.fields_by_name[ + "play_origin"].message_type = play__origin__pb2._PLAYORIGIN +_SESSION.fields_by_name["context"].message_type = context__pb2._CONTEXT +_SESSION.fields_by_name[ + "option_overrides"].message_type = context__player__options__pb2._CONTEXTPLAYEROPTIONOVERRIDES +DESCRIPTOR.message_types_by_name["Session"] = _SESSION +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +Session = _reflection.GeneratedProtocolMessageType( + "Session", + (_message.Message, ), + { + "DESCRIPTOR": _SESSION, + "__module__": "session_pb2" + # @@protoc_insertion_point(class_scope:spotify.player.proto.transfer.Session) + }, +) +_sym_db.RegisterMessage(Session) + +DESCRIPTOR._options = None +# @@protoc_insertion_point(module_scope) diff --git a/librespot/proto/StorageResolve_pb2.py b/librespot/proto/StorageResolve_pb2.py new file mode 100644 index 0000000..3319832 --- /dev/null +++ b/librespot/proto/StorageResolve_pb2.py @@ -0,0 +1,154 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: storage-resolve.proto +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + +DESCRIPTOR = _descriptor.FileDescriptor( + name='storage-resolve.proto', + package='spotify.download.proto', + syntax='proto3', + serialized_options=b'\n\023com.spotify.storageH\002', + create_key=_descriptor._internal_create_key, + serialized_pb= + b'\n\x15storage-resolve.proto\x12\x16spotify.download.proto\"\xaf\x01\n\x16StorageResolveResponse\x12\x45\n\x06result\x18\x01 \x01(\x0e\x32\x35.spotify.download.proto.StorageResolveResponse.Result\x12\x0e\n\x06\x63\x64nurl\x18\x02 \x03(\t\x12\x0e\n\x06\x66ileid\x18\x04 \x01(\x0c\".\n\x06Result\x12\x07\n\x03\x43\x44N\x10\x00\x12\x0b\n\x07STORAGE\x10\x01\x12\x0e\n\nRESTRICTED\x10\x03\x42\x17\n\x13\x63om.spotify.storageH\x02\x62\x06proto3' +) + +_STORAGERESOLVERESPONSE_RESULT = _descriptor.EnumDescriptor( + name='Result', + full_name='spotify.download.proto.StorageResolveResponse.Result', + filename=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + values=[ + _descriptor.EnumValueDescriptor( + name='CDN', + index=0, + number=0, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='STORAGE', + index=1, + number=1, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + _descriptor.EnumValueDescriptor( + name='RESTRICTED', + index=2, + number=3, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key), + ], + containing_type=None, + serialized_options=None, + serialized_start=179, + serialized_end=225, +) +_sym_db.RegisterEnumDescriptor(_STORAGERESOLVERESPONSE_RESULT) + +_STORAGERESOLVERESPONSE = _descriptor.Descriptor( + name='StorageResolveResponse', + full_name='spotify.download.proto.StorageResolveResponse', + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name='result', + full_name='spotify.download.proto.StorageResolveResponse.result', + index=0, + number=1, + type=14, + cpp_type=8, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='cdnurl', + full_name='spotify.download.proto.StorageResolveResponse.cdnurl', + index=1, + number=2, + type=9, + cpp_type=9, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + _descriptor.FieldDescriptor( + name='fileid', + full_name='spotify.download.proto.StorageResolveResponse.fileid', + index=2, + number=4, + type=12, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"", + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key), + ], + extensions=[], + nested_types=[], + enum_types=[ + _STORAGERESOLVERESPONSE_RESULT, + ], + serialized_options=None, + is_extendable=False, + syntax='proto3', + extension_ranges=[], + oneofs=[], + serialized_start=50, + serialized_end=225, +) + +_STORAGERESOLVERESPONSE.fields_by_name[ + 'result'].enum_type = _STORAGERESOLVERESPONSE_RESULT +_STORAGERESOLVERESPONSE_RESULT.containing_type = _STORAGERESOLVERESPONSE +DESCRIPTOR.message_types_by_name[ + 'StorageResolveResponse'] = _STORAGERESOLVERESPONSE +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +StorageResolveResponse = _reflection.GeneratedProtocolMessageType( + 'StorageResolveResponse', + (_message.Message, ), + { + 'DESCRIPTOR': _STORAGERESOLVERESPONSE, + '__module__': 'storage_resolve_pb2' + # @@protoc_insertion_point(class_scope:spotify.download.proto.StorageResolveResponse) + }) +_sym_db.RegisterMessage(StorageResolveResponse) + +DESCRIPTOR._options = None +# @@protoc_insertion_point(module_scope) diff --git a/librespot/proto/TransferState_pb2.py b/librespot/proto/TransferState_pb2.py new file mode 100644 index 0000000..1db7786 --- /dev/null +++ b/librespot/proto/TransferState_pb2.py @@ -0,0 +1,174 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: transfer_state.proto +"""Generated protocol buffer code.""" +import ContextPlayerOptions_pb2 as context__player__options__pb2 +import Playback_pb2 as playback__pb2 +import Queue_pb2 as queue__pb2 +import Session_pb2 as session__pb2 +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database + +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + +DESCRIPTOR = _descriptor.FileDescriptor( + name="transfer_state.proto", + package="spotify.player.proto.transfer", + syntax="proto2", + serialized_options=b"\n\024com.spotify.transferH\002", + create_key=_descriptor._internal_create_key, + serialized_pb= + b"\n\x14transfer_state.proto\x12\x1dspotify.player.proto.transfer\x1a\x1c\x63ontext_player_options.proto\x1a\x0eplayback.proto\x1a\rsession.proto\x1a\x0bqueue.proto\"\x99\x02\n\rTransferState\x12;\n\x07options\x18\x01 \x01(\x0b\x32*.spotify.player.proto.ContextPlayerOptions\x12\x39\n\x08playback\x18\x02 \x01(\x0b\x32'.spotify.player.proto.transfer.Playback\x12?\n\x0f\x63urrent_session\x18\x03 \x01(\x0b\x32&.spotify.player.proto.transfer.Session\x12\x33\n\x05queue\x18\x04 \x01(\x0b\x32$.spotify.player.proto.transfer.Queue\x12\x1a\n\x12\x63reation_timestamp\x18\x05 \x01(\x03\x42\x18\n\x14\x63om.spotify.transferH\x02", + dependencies=[ + context__player__options__pb2.DESCRIPTOR, + playback__pb2.DESCRIPTOR, + session__pb2.DESCRIPTOR, + queue__pb2.DESCRIPTOR, + ], +) + +_TRANSFERSTATE = _descriptor.Descriptor( + name="TransferState", + full_name="spotify.player.proto.transfer.TransferState", + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name="options", + full_name="spotify.player.proto.transfer.TransferState.options", + index=0, + number=1, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="playback", + full_name="spotify.player.proto.transfer.TransferState.playback", + index=1, + number=2, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="current_session", + full_name= + "spotify.player.proto.transfer.TransferState.current_session", + index=2, + number=3, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="queue", + full_name="spotify.player.proto.transfer.TransferState.queue", + index=3, + number=4, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="creation_timestamp", + full_name= + "spotify.player.proto.transfer.TransferState.creation_timestamp", + index=4, + number=5, + type=3, + cpp_type=2, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax="proto2", + extension_ranges=[], + oneofs=[], + serialized_start=130, + serialized_end=411, +) + +_TRANSFERSTATE.fields_by_name[ + "options"].message_type = context__player__options__pb2._CONTEXTPLAYEROPTIONS +_TRANSFERSTATE.fields_by_name[ + "playback"].message_type = playback__pb2._PLAYBACK +_TRANSFERSTATE.fields_by_name[ + "current_session"].message_type = session__pb2._SESSION +_TRANSFERSTATE.fields_by_name["queue"].message_type = queue__pb2._QUEUE +DESCRIPTOR.message_types_by_name["TransferState"] = _TRANSFERSTATE +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +TransferState = _reflection.GeneratedProtocolMessageType( + "TransferState", + (_message.Message, ), + { + "DESCRIPTOR": _TRANSFERSTATE, + "__module__": "transfer_state_pb2" + # @@protoc_insertion_point(class_scope:spotify.player.proto.transfer.TransferState) + }, +) +_sym_db.RegisterMessage(TransferState) + +DESCRIPTOR._options = None +# @@protoc_insertion_point(module_scope) diff --git a/librespot/proto/__init__.py b/librespot/proto/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/librespot/proto/spotify/__init__.py b/librespot/proto/spotify/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/librespot/proto/spotify/login5/__init__.py b/librespot/proto/spotify/login5/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/librespot/proto/spotify/login5/v3/ClientInfo_pb2.py b/librespot/proto/spotify/login5/v3/ClientInfo_pb2.py new file mode 100644 index 0000000..81fc083 --- /dev/null +++ b/librespot/proto/spotify/login5/v3/ClientInfo_pb2.py @@ -0,0 +1,98 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: spotify/login5/v3/client_info.proto +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database + +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + +DESCRIPTOR = _descriptor.FileDescriptor( + name="spotify/login5/v3/client_info.proto", + package="spotify.login5.v3", + syntax="proto3", + serialized_options=b"\n\024com.spotify.login5v3", + create_key=_descriptor._internal_create_key, + serialized_pb= + b'\n#spotify/login5/v3/client_info.proto\x12\x11spotify.login5.v3"2\n\nClientInfo\x12\x11\n\tclient_id\x18\x01 \x01(\t\x12\x11\n\tdevice_id\x18\x02 \x01(\tB\x16\n\x14\x63om.spotify.login5v3b\x06proto3', +) + +_CLIENTINFO = _descriptor.Descriptor( + name="ClientInfo", + full_name="spotify.login5.v3.ClientInfo", + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name="client_id", + full_name="spotify.login5.v3.ClientInfo.client_id", + index=0, + number=1, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="device_id", + full_name="spotify.login5.v3.ClientInfo.device_id", + index=1, + number=2, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax="proto3", + extension_ranges=[], + oneofs=[], + serialized_start=58, + serialized_end=108, +) + +DESCRIPTOR.message_types_by_name["ClientInfo"] = _CLIENTINFO +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +ClientInfo = _reflection.GeneratedProtocolMessageType( + "ClientInfo", + (_message.Message, ), + { + "DESCRIPTOR": _CLIENTINFO, + "__module__": "spotify.login5.v3.client_info_pb2" + # @@protoc_insertion_point(class_scope:spotify.login5.v3.ClientInfo) + }, +) +_sym_db.RegisterMessage(ClientInfo) + +DESCRIPTOR._options = None +# @@protoc_insertion_point(module_scope) diff --git a/librespot/proto/spotify/login5/v3/Login5_pb2.py b/librespot/proto/spotify/login5/v3/Login5_pb2.py new file mode 100644 index 0000000..566aca9 --- /dev/null +++ b/librespot/proto/spotify/login5/v3/Login5_pb2.py @@ -0,0 +1,972 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: spotify/login5/v3/login5.proto +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database +from google.protobuf.internal import enum_type_wrapper +from spotify.login5.v3 import \ + client_info_pb2 as spotify_dot_login5_dot_v3_dot_client__info__pb2 +from spotify.login5.v3 import \ + user_info_pb2 as spotify_dot_login5_dot_v3_dot_user__info__pb2 +from spotify.login5.v3.challenges import \ + code_pb2 as spotify_dot_login5_dot_v3_dot_challenges_dot_code__pb2 +from spotify.login5.v3.challenges import \ + hashcash_pb2 as spotify_dot_login5_dot_v3_dot_challenges_dot_hashcash__pb2 +from spotify.login5.v3.credentials import \ + credentials_pb2 as \ + spotify_dot_login5_dot_v3_dot_credentials_dot_credentials__pb2 +from spotify.login5.v3.identifiers import \ + identifiers_pb2 as \ + spotify_dot_login5_dot_v3_dot_identifiers_dot_identifiers__pb2 + +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + +DESCRIPTOR = _descriptor.FileDescriptor( + name="spotify/login5/v3/login5.proto", + package="spotify.login5.v3", + syntax="proto3", + serialized_options=b"\n\024com.spotify.login5v3", + create_key=_descriptor._internal_create_key, + serialized_pb= + b'\n\x1espotify/login5/v3/login5.proto\x12\x11spotify.login5.v3\x1a#spotify/login5/v3/client_info.proto\x1a!spotify/login5/v3/user_info.proto\x1a\'spotify/login5/v3/challenges/code.proto\x1a+spotify/login5/v3/challenges/hashcash.proto\x1a/spotify/login5/v3/credentials/credentials.proto\x1a/spotify/login5/v3/identifiers/identifiers.proto">\n\nChallenges\x12\x30\n\nchallenges\x18\x01 \x03(\x0b\x32\x1c.spotify.login5.v3.Challenge"\x89\x01\n\tChallenge\x12\x41\n\x08hashcash\x18\x01 \x01(\x0b\x32/.spotify.login5.v3.challenges.HashcashChallenge\x12\x39\n\x04\x63ode\x18\x02 \x01(\x0b\x32+.spotify.login5.v3.challenges.CodeChallenge"M\n\x12\x43hallengeSolutions\x12\x37\n\tsolutions\x18\x01 \x03(\x0b\x32$.spotify.login5.v3.ChallengeSolution"\x8f\x01\n\x11\x43hallengeSolution\x12@\n\x08hashcash\x18\x01 \x01(\x0b\x32..spotify.login5.v3.challenges.HashcashSolution\x12\x38\n\x04\x63ode\x18\x02 \x01(\x0b\x32*.spotify.login5.v3.challenges.CodeSolution"\xad\x05\n\x0cLoginRequest\x12\x32\n\x0b\x63lient_info\x18\x01 \x01(\x0b\x32\x1d.spotify.login5.v3.ClientInfo\x12\x15\n\rlogin_context\x18\x02 \x01(\x0c\x12\x42\n\x13\x63hallenge_solutions\x18\x03 \x01(\x0b\x32%.spotify.login5.v3.ChallengeSolutions\x12J\n\x11stored_credential\x18\x64 \x01(\x0b\x32/.spotify.login5.v3.credentials.StoredCredential\x12\x39\n\x08password\x18\x65 \x01(\x0b\x32\'.spotify.login5.v3.credentials.Password\x12Q\n\x15\x66\x61\x63\x65\x62ook_access_token\x18\x66 \x01(\x0b\x32\x32.spotify.login5.v3.credentials.FacebookAccessToken\x12@\n\x0cphone_number\x18g \x01(\x0b\x32*.spotify.login5.v3.identifiers.PhoneNumber\x12\x43\n\x0eone_time_token\x18h \x01(\x0b\x32+.spotify.login5.v3.credentials.OneTimeToken\x12U\n\x17parent_child_credential\x18i \x01(\x0b\x32\x34.spotify.login5.v3.credentials.ParentChildCredential\x12V\n\x18\x61pple_sign_in_credential\x18j \x01(\x0b\x32\x34.spotify.login5.v3.credentials.AppleSignInCredential"m\n\x07LoginOk\x12\x10\n\x08username\x18\x01 \x01(\t\x12\x14\n\x0c\x61\x63\x63\x65ss_token\x18\x02 \x01(\t\x12\x19\n\x11stored_credential\x18\x03 \x01(\x0c\x12\x1f\n\x17\x61\x63\x63\x65ss_token_expires_in\x18\x04 \x01(\x05"\xf8\x02\n\rLoginResponse\x12&\n\x02ok\x18\x01 \x01(\x0b\x32\x1a.spotify.login5.v3.LoginOk\x12,\n\x05\x65rror\x18\x02 \x01(\x0e\x32\x1d.spotify.login5.v3.LoginError\x12\x31\n\nchallenges\x18\x03 \x01(\x0b\x32\x1d.spotify.login5.v3.Challenges\x12;\n\x08warnings\x18\x04 \x03(\x0e\x32).spotify.login5.v3.LoginResponse.Warnings\x12\x15\n\rlogin_context\x18\x05 \x01(\x0c\x12\x18\n\x10identifier_token\x18\x06 \x01(\t\x12.\n\tuser_info\x18\x07 \x01(\x0b\x32\x1b.spotify.login5.v3.UserInfo"@\n\x08Warnings\x12\x13\n\x0fUNKNOWN_WARNING\x10\x00\x12\x1f\n\x1b\x44\x45PRECATED_PROTOCOL_VERSION\x10\x01*\xd3\x01\n\nLoginError\x12\x11\n\rUNKNOWN_ERROR\x10\x00\x12\x17\n\x13INVALID_CREDENTIALS\x10\x01\x12\x0f\n\x0b\x42\x41\x44_REQUEST\x10\x02\x12\x1e\n\x1aUNSUPPORTED_LOGIN_PROTOCOL\x10\x03\x12\x0b\n\x07TIMEOUT\x10\x04\x12\x16\n\x12UNKNOWN_IDENTIFIER\x10\x05\x12\x15\n\x11TOO_MANY_ATTEMPTS\x10\x06\x12\x17\n\x13INVALID_PHONENUMBER\x10\x07\x12\x13\n\x0fTRY_AGAIN_LATER\x10\x08\x42\x16\n\x14\x63om.spotify.login5v3b\x06proto3', + dependencies=[ + spotify_dot_login5_dot_v3_dot_client__info__pb2.DESCRIPTOR, + spotify_dot_login5_dot_v3_dot_user__info__pb2.DESCRIPTOR, + spotify_dot_login5_dot_v3_dot_challenges_dot_code__pb2.DESCRIPTOR, + spotify_dot_login5_dot_v3_dot_challenges_dot_hashcash__pb2.DESCRIPTOR, + spotify_dot_login5_dot_v3_dot_credentials_dot_credentials__pb2. + DESCRIPTOR, + spotify_dot_login5_dot_v3_dot_identifiers_dot_identifiers__pb2. + DESCRIPTOR, + ], +) + +_LOGINERROR = _descriptor.EnumDescriptor( + name="LoginError", + full_name="spotify.login5.v3.LoginError", + filename=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + values=[ + _descriptor.EnumValueDescriptor( + name="UNKNOWN_ERROR", + index=0, + number=0, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key, + ), + _descriptor.EnumValueDescriptor( + name="INVALID_CREDENTIALS", + index=1, + number=1, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key, + ), + _descriptor.EnumValueDescriptor( + name="BAD_REQUEST", + index=2, + number=2, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key, + ), + _descriptor.EnumValueDescriptor( + name="UNSUPPORTED_LOGIN_PROTOCOL", + index=3, + number=3, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key, + ), + _descriptor.EnumValueDescriptor( + name="TIMEOUT", + index=4, + number=4, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key, + ), + _descriptor.EnumValueDescriptor( + name="UNKNOWN_IDENTIFIER", + index=5, + number=5, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key, + ), + _descriptor.EnumValueDescriptor( + name="TOO_MANY_ATTEMPTS", + index=6, + number=6, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key, + ), + _descriptor.EnumValueDescriptor( + name="INVALID_PHONENUMBER", + index=7, + number=7, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key, + ), + _descriptor.EnumValueDescriptor( + name="TRY_AGAIN_LATER", + index=8, + number=8, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key, + ), + ], + containing_type=None, + serialized_options=None, + serialized_start=1917, + serialized_end=2128, +) +_sym_db.RegisterEnumDescriptor(_LOGINERROR) + +LoginError = enum_type_wrapper.EnumTypeWrapper(_LOGINERROR) +UNKNOWN_ERROR = 0 +INVALID_CREDENTIALS = 1 +BAD_REQUEST = 2 +UNSUPPORTED_LOGIN_PROTOCOL = 3 +TIMEOUT = 4 +UNKNOWN_IDENTIFIER = 5 +TOO_MANY_ATTEMPTS = 6 +INVALID_PHONENUMBER = 7 +TRY_AGAIN_LATER = 8 + +_LOGINRESPONSE_WARNINGS = _descriptor.EnumDescriptor( + name="Warnings", + full_name="spotify.login5.v3.LoginResponse.Warnings", + filename=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + values=[ + _descriptor.EnumValueDescriptor( + name="UNKNOWN_WARNING", + index=0, + number=0, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key, + ), + _descriptor.EnumValueDescriptor( + name="DEPRECATED_PROTOCOL_VERSION", + index=1, + number=1, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key, + ), + ], + containing_type=None, + serialized_options=None, + serialized_start=1850, + serialized_end=1914, +) +_sym_db.RegisterEnumDescriptor(_LOGINRESPONSE_WARNINGS) + +_CHALLENGES = _descriptor.Descriptor( + name="Challenges", + full_name="spotify.login5.v3.Challenges", + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name="challenges", + full_name="spotify.login5.v3.Challenges.challenges", + index=0, + number=1, + type=11, + cpp_type=10, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax="proto3", + extension_ranges=[], + oneofs=[], + serialized_start=309, + serialized_end=371, +) + +_CHALLENGE = _descriptor.Descriptor( + name="Challenge", + full_name="spotify.login5.v3.Challenge", + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name="hashcash", + full_name="spotify.login5.v3.Challenge.hashcash", + index=0, + number=1, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="code", + full_name="spotify.login5.v3.Challenge.code", + index=1, + number=2, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax="proto3", + extension_ranges=[], + oneofs=[], + serialized_start=374, + serialized_end=511, +) + +_CHALLENGESOLUTIONS = _descriptor.Descriptor( + name="ChallengeSolutions", + full_name="spotify.login5.v3.ChallengeSolutions", + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name="solutions", + full_name="spotify.login5.v3.ChallengeSolutions.solutions", + index=0, + number=1, + type=11, + cpp_type=10, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax="proto3", + extension_ranges=[], + oneofs=[], + serialized_start=513, + serialized_end=590, +) + +_CHALLENGESOLUTION = _descriptor.Descriptor( + name="ChallengeSolution", + full_name="spotify.login5.v3.ChallengeSolution", + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name="hashcash", + full_name="spotify.login5.v3.ChallengeSolution.hashcash", + index=0, + number=1, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="code", + full_name="spotify.login5.v3.ChallengeSolution.code", + index=1, + number=2, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax="proto3", + extension_ranges=[], + oneofs=[], + serialized_start=593, + serialized_end=736, +) + +_LOGINREQUEST = _descriptor.Descriptor( + name="LoginRequest", + full_name="spotify.login5.v3.LoginRequest", + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name="client_info", + full_name="spotify.login5.v3.LoginRequest.client_info", + index=0, + number=1, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="login_context", + full_name="spotify.login5.v3.LoginRequest.login_context", + index=1, + number=2, + type=12, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"", + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="challenge_solutions", + full_name="spotify.login5.v3.LoginRequest.challenge_solutions", + index=2, + number=3, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="stored_credential", + full_name="spotify.login5.v3.LoginRequest.stored_credential", + index=3, + number=100, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="password", + full_name="spotify.login5.v3.LoginRequest.password", + index=4, + number=101, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="facebook_access_token", + full_name="spotify.login5.v3.LoginRequest.facebook_access_token", + index=5, + number=102, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="phone_number", + full_name="spotify.login5.v3.LoginRequest.phone_number", + index=6, + number=103, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="one_time_token", + full_name="spotify.login5.v3.LoginRequest.one_time_token", + index=7, + number=104, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="parent_child_credential", + full_name="spotify.login5.v3.LoginRequest.parent_child_credential", + index=8, + number=105, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="apple_sign_in_credential", + full_name="spotify.login5.v3.LoginRequest.apple_sign_in_credential", + index=9, + number=106, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax="proto3", + extension_ranges=[], + oneofs=[], + serialized_start=739, + serialized_end=1424, +) + +_LOGINOK = _descriptor.Descriptor( + name="LoginOk", + full_name="spotify.login5.v3.LoginOk", + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name="username", + full_name="spotify.login5.v3.LoginOk.username", + index=0, + number=1, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="access_token", + full_name="spotify.login5.v3.LoginOk.access_token", + index=1, + number=2, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="stored_credential", + full_name="spotify.login5.v3.LoginOk.stored_credential", + index=2, + number=3, + type=12, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"", + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="access_token_expires_in", + full_name="spotify.login5.v3.LoginOk.access_token_expires_in", + index=3, + number=4, + type=5, + cpp_type=1, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax="proto3", + extension_ranges=[], + oneofs=[], + serialized_start=1426, + serialized_end=1535, +) + +_LOGINRESPONSE = _descriptor.Descriptor( + name="LoginResponse", + full_name="spotify.login5.v3.LoginResponse", + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name="ok", + full_name="spotify.login5.v3.LoginResponse.ok", + index=0, + number=1, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="error", + full_name="spotify.login5.v3.LoginResponse.error", + index=1, + number=2, + type=14, + cpp_type=8, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="challenges", + full_name="spotify.login5.v3.LoginResponse.challenges", + index=2, + number=3, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="warnings", + full_name="spotify.login5.v3.LoginResponse.warnings", + index=3, + number=4, + type=14, + cpp_type=8, + label=3, + has_default_value=False, + default_value=[], + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="login_context", + full_name="spotify.login5.v3.LoginResponse.login_context", + index=4, + number=5, + type=12, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"", + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="identifier_token", + full_name="spotify.login5.v3.LoginResponse.identifier_token", + index=5, + number=6, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="user_info", + full_name="spotify.login5.v3.LoginResponse.user_info", + index=6, + number=7, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + ], + extensions=[], + nested_types=[], + enum_types=[ + _LOGINRESPONSE_WARNINGS, + ], + serialized_options=None, + is_extendable=False, + syntax="proto3", + extension_ranges=[], + oneofs=[], + serialized_start=1538, + serialized_end=1914, +) + +_CHALLENGES.fields_by_name["challenges"].message_type = _CHALLENGE +_CHALLENGE.fields_by_name["hashcash"].message_type = ( + spotify_dot_login5_dot_v3_dot_challenges_dot_hashcash__pb2. + _HASHCASHCHALLENGE) +_CHALLENGE.fields_by_name[ + "code"].message_type = spotify_dot_login5_dot_v3_dot_challenges_dot_code__pb2._CODECHALLENGE +_CHALLENGESOLUTIONS.fields_by_name[ + "solutions"].message_type = _CHALLENGESOLUTION +_CHALLENGESOLUTION.fields_by_name["hashcash"].message_type = ( + spotify_dot_login5_dot_v3_dot_challenges_dot_hashcash__pb2. + _HASHCASHSOLUTION) +_CHALLENGESOLUTION.fields_by_name[ + "code"].message_type = spotify_dot_login5_dot_v3_dot_challenges_dot_code__pb2._CODESOLUTION +_LOGINREQUEST.fields_by_name[ + "client_info"].message_type = spotify_dot_login5_dot_v3_dot_client__info__pb2._CLIENTINFO +_LOGINREQUEST.fields_by_name[ + "challenge_solutions"].message_type = _CHALLENGESOLUTIONS +_LOGINREQUEST.fields_by_name["stored_credential"].message_type = ( + spotify_dot_login5_dot_v3_dot_credentials_dot_credentials__pb2. + _STOREDCREDENTIAL) +_LOGINREQUEST.fields_by_name["password"].message_type = ( + spotify_dot_login5_dot_v3_dot_credentials_dot_credentials__pb2._PASSWORD) +_LOGINREQUEST.fields_by_name["facebook_access_token"].message_type = ( + spotify_dot_login5_dot_v3_dot_credentials_dot_credentials__pb2. + _FACEBOOKACCESSTOKEN) +_LOGINREQUEST.fields_by_name["phone_number"].message_type = ( + spotify_dot_login5_dot_v3_dot_identifiers_dot_identifiers__pb2._PHONENUMBER +) +_LOGINREQUEST.fields_by_name["one_time_token"].message_type = ( + spotify_dot_login5_dot_v3_dot_credentials_dot_credentials__pb2. + _ONETIMETOKEN) +_LOGINREQUEST.fields_by_name["parent_child_credential"].message_type = ( + spotify_dot_login5_dot_v3_dot_credentials_dot_credentials__pb2. + _PARENTCHILDCREDENTIAL) +_LOGINREQUEST.fields_by_name["apple_sign_in_credential"].message_type = ( + spotify_dot_login5_dot_v3_dot_credentials_dot_credentials__pb2. + _APPLESIGNINCREDENTIAL) +_LOGINRESPONSE.fields_by_name["ok"].message_type = _LOGINOK +_LOGINRESPONSE.fields_by_name["error"].enum_type = _LOGINERROR +_LOGINRESPONSE.fields_by_name["challenges"].message_type = _CHALLENGES +_LOGINRESPONSE.fields_by_name["warnings"].enum_type = _LOGINRESPONSE_WARNINGS +_LOGINRESPONSE.fields_by_name[ + "user_info"].message_type = spotify_dot_login5_dot_v3_dot_user__info__pb2._USERINFO +_LOGINRESPONSE_WARNINGS.containing_type = _LOGINRESPONSE +DESCRIPTOR.message_types_by_name["Challenges"] = _CHALLENGES +DESCRIPTOR.message_types_by_name["Challenge"] = _CHALLENGE +DESCRIPTOR.message_types_by_name["ChallengeSolutions"] = _CHALLENGESOLUTIONS +DESCRIPTOR.message_types_by_name["ChallengeSolution"] = _CHALLENGESOLUTION +DESCRIPTOR.message_types_by_name["LoginRequest"] = _LOGINREQUEST +DESCRIPTOR.message_types_by_name["LoginOk"] = _LOGINOK +DESCRIPTOR.message_types_by_name["LoginResponse"] = _LOGINRESPONSE +DESCRIPTOR.enum_types_by_name["LoginError"] = _LOGINERROR +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +Challenges = _reflection.GeneratedProtocolMessageType( + "Challenges", + (_message.Message, ), + { + "DESCRIPTOR": _CHALLENGES, + "__module__": "spotify.login5.v3.login5_pb2" + # @@protoc_insertion_point(class_scope:spotify.login5.v3.Challenges) + }, +) +_sym_db.RegisterMessage(Challenges) + +Challenge = _reflection.GeneratedProtocolMessageType( + "Challenge", + (_message.Message, ), + { + "DESCRIPTOR": _CHALLENGE, + "__module__": "spotify.login5.v3.login5_pb2" + # @@protoc_insertion_point(class_scope:spotify.login5.v3.Challenge) + }, +) +_sym_db.RegisterMessage(Challenge) + +ChallengeSolutions = _reflection.GeneratedProtocolMessageType( + "ChallengeSolutions", + (_message.Message, ), + { + "DESCRIPTOR": _CHALLENGESOLUTIONS, + "__module__": "spotify.login5.v3.login5_pb2" + # @@protoc_insertion_point(class_scope:spotify.login5.v3.ChallengeSolutions) + }, +) +_sym_db.RegisterMessage(ChallengeSolutions) + +ChallengeSolution = _reflection.GeneratedProtocolMessageType( + "ChallengeSolution", + (_message.Message, ), + { + "DESCRIPTOR": _CHALLENGESOLUTION, + "__module__": "spotify.login5.v3.login5_pb2" + # @@protoc_insertion_point(class_scope:spotify.login5.v3.ChallengeSolution) + }, +) +_sym_db.RegisterMessage(ChallengeSolution) + +LoginRequest = _reflection.GeneratedProtocolMessageType( + "LoginRequest", + (_message.Message, ), + { + "DESCRIPTOR": _LOGINREQUEST, + "__module__": "spotify.login5.v3.login5_pb2" + # @@protoc_insertion_point(class_scope:spotify.login5.v3.LoginRequest) + }, +) +_sym_db.RegisterMessage(LoginRequest) + +LoginOk = _reflection.GeneratedProtocolMessageType( + "LoginOk", + (_message.Message, ), + { + "DESCRIPTOR": _LOGINOK, + "__module__": "spotify.login5.v3.login5_pb2" + # @@protoc_insertion_point(class_scope:spotify.login5.v3.LoginOk) + }, +) +_sym_db.RegisterMessage(LoginOk) + +LoginResponse = _reflection.GeneratedProtocolMessageType( + "LoginResponse", + (_message.Message, ), + { + "DESCRIPTOR": _LOGINRESPONSE, + "__module__": "spotify.login5.v3.login5_pb2" + # @@protoc_insertion_point(class_scope:spotify.login5.v3.LoginResponse) + }, +) +_sym_db.RegisterMessage(LoginResponse) + +DESCRIPTOR._options = None +# @@protoc_insertion_point(module_scope) diff --git a/librespot/proto/spotify/login5/v3/UserInfo_pb2.py b/librespot/proto/spotify/login5/v3/UserInfo_pb2.py new file mode 100644 index 0000000..99f9235 --- /dev/null +++ b/librespot/proto/spotify/login5/v3/UserInfo_pb2.py @@ -0,0 +1,263 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: spotify/login5/v3/user_info.proto +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database + +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + +DESCRIPTOR = _descriptor.FileDescriptor( + name="spotify/login5/v3/user_info.proto", + package="spotify.login5.v3", + syntax="proto3", + serialized_options=b"\n\024com.spotify.login5v3", + create_key=_descriptor._internal_create_key, + serialized_pb= + b'\n!spotify/login5/v3/user_info.proto\x12\x11spotify.login5.v3"\x97\x02\n\x08UserInfo\x12\x0c\n\x04name\x18\x01 \x01(\t\x12\r\n\x05\x65mail\x18\x02 \x01(\t\x12\x16\n\x0e\x65mail_verified\x18\x03 \x01(\x08\x12\x11\n\tbirthdate\x18\x04 \x01(\t\x12\x32\n\x06gender\x18\x05 \x01(\x0e\x32".spotify.login5.v3.UserInfo.Gender\x12\x14\n\x0cphone_number\x18\x06 \x01(\t\x12\x1d\n\x15phone_number_verified\x18\x07 \x01(\x08\x12 \n\x18\x65mail_already_registered\x18\x08 \x01(\x08"8\n\x06Gender\x12\x0b\n\x07UNKNOWN\x10\x00\x12\x08\n\x04MALE\x10\x01\x12\n\n\x06\x46\x45MALE\x10\x02\x12\x0b\n\x07NEUTRAL\x10\x03\x42\x16\n\x14\x63om.spotify.login5v3b\x06proto3', +) + +_USERINFO_GENDER = _descriptor.EnumDescriptor( + name="Gender", + full_name="spotify.login5.v3.UserInfo.Gender", + filename=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + values=[ + _descriptor.EnumValueDescriptor( + name="UNKNOWN", + index=0, + number=0, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key, + ), + _descriptor.EnumValueDescriptor( + name="MALE", + index=1, + number=1, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key, + ), + _descriptor.EnumValueDescriptor( + name="FEMALE", + index=2, + number=2, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key, + ), + _descriptor.EnumValueDescriptor( + name="NEUTRAL", + index=3, + number=3, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key, + ), + ], + containing_type=None, + serialized_options=None, + serialized_start=280, + serialized_end=336, +) +_sym_db.RegisterEnumDescriptor(_USERINFO_GENDER) + +_USERINFO = _descriptor.Descriptor( + name="UserInfo", + full_name="spotify.login5.v3.UserInfo", + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name="name", + full_name="spotify.login5.v3.UserInfo.name", + index=0, + number=1, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="email", + full_name="spotify.login5.v3.UserInfo.email", + index=1, + number=2, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="email_verified", + full_name="spotify.login5.v3.UserInfo.email_verified", + index=2, + number=3, + type=8, + cpp_type=7, + label=1, + has_default_value=False, + default_value=False, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="birthdate", + full_name="spotify.login5.v3.UserInfo.birthdate", + index=3, + number=4, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="gender", + full_name="spotify.login5.v3.UserInfo.gender", + index=4, + number=5, + type=14, + cpp_type=8, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="phone_number", + full_name="spotify.login5.v3.UserInfo.phone_number", + index=5, + number=6, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="phone_number_verified", + full_name="spotify.login5.v3.UserInfo.phone_number_verified", + index=6, + number=7, + type=8, + cpp_type=7, + label=1, + has_default_value=False, + default_value=False, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="email_already_registered", + full_name="spotify.login5.v3.UserInfo.email_already_registered", + index=7, + number=8, + type=8, + cpp_type=7, + label=1, + has_default_value=False, + default_value=False, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + ], + extensions=[], + nested_types=[], + enum_types=[ + _USERINFO_GENDER, + ], + serialized_options=None, + is_extendable=False, + syntax="proto3", + extension_ranges=[], + oneofs=[], + serialized_start=57, + serialized_end=336, +) + +_USERINFO.fields_by_name["gender"].enum_type = _USERINFO_GENDER +_USERINFO_GENDER.containing_type = _USERINFO +DESCRIPTOR.message_types_by_name["UserInfo"] = _USERINFO +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +UserInfo = _reflection.GeneratedProtocolMessageType( + "UserInfo", + (_message.Message, ), + { + "DESCRIPTOR": _USERINFO, + "__module__": "spotify.login5.v3.user_info_pb2" + # @@protoc_insertion_point(class_scope:spotify.login5.v3.UserInfo) + }, +) +_sym_db.RegisterMessage(UserInfo) + +DESCRIPTOR._options = None +# @@protoc_insertion_point(module_scope) diff --git a/librespot/proto/spotify/login5/v3/__init__.py b/librespot/proto/spotify/login5/v3/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/librespot/proto/spotify/login5/v3/challenges/Code_pb2.py b/librespot/proto/spotify/login5/v3/challenges/Code_pb2.py new file mode 100644 index 0000000..03dca14 --- /dev/null +++ b/librespot/proto/spotify/login5/v3/challenges/Code_pb2.py @@ -0,0 +1,224 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: spotify/login5/v3/challenges/code.proto +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database + +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + +DESCRIPTOR = _descriptor.FileDescriptor( + name="spotify/login5/v3/challenges/code.proto", + package="spotify.login5.v3.challenges", + syntax="proto3", + serialized_options=b"\n\024com.spotify.login5v3", + create_key=_descriptor._internal_create_key, + serialized_pb= + b'\n\'spotify/login5/v3/challenges/code.proto\x12\x1cspotify.login5.v3.challenges"\xbc\x01\n\rCodeChallenge\x12\x42\n\x06method\x18\x01 \x01(\x0e\x32\x32.spotify.login5.v3.challenges.CodeChallenge.Method\x12\x13\n\x0b\x63ode_length\x18\x02 \x01(\x05\x12\x12\n\nexpires_in\x18\x03 \x01(\x05\x12\x1e\n\x16\x63\x61nonical_phone_number\x18\x04 \x01(\t"\x1e\n\x06Method\x12\x0b\n\x07UNKNOWN\x10\x00\x12\x07\n\x03SMS\x10\x01"\x1c\n\x0c\x43odeSolution\x12\x0c\n\x04\x63ode\x18\x01 \x01(\tB\x16\n\x14\x63om.spotify.login5v3b\x06proto3', +) + +_CODECHALLENGE_METHOD = _descriptor.EnumDescriptor( + name="Method", + full_name="spotify.login5.v3.challenges.CodeChallenge.Method", + filename=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + values=[ + _descriptor.EnumValueDescriptor( + name="UNKNOWN", + index=0, + number=0, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key, + ), + _descriptor.EnumValueDescriptor( + name="SMS", + index=1, + number=1, + serialized_options=None, + type=None, + create_key=_descriptor._internal_create_key, + ), + ], + containing_type=None, + serialized_options=None, + serialized_start=232, + serialized_end=262, +) +_sym_db.RegisterEnumDescriptor(_CODECHALLENGE_METHOD) + +_CODECHALLENGE = _descriptor.Descriptor( + name="CodeChallenge", + full_name="spotify.login5.v3.challenges.CodeChallenge", + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name="method", + full_name="spotify.login5.v3.challenges.CodeChallenge.method", + index=0, + number=1, + type=14, + cpp_type=8, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="code_length", + full_name="spotify.login5.v3.challenges.CodeChallenge.code_length", + index=1, + number=2, + type=5, + cpp_type=1, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="expires_in", + full_name="spotify.login5.v3.challenges.CodeChallenge.expires_in", + index=2, + number=3, + type=5, + cpp_type=1, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="canonical_phone_number", + full_name= + "spotify.login5.v3.challenges.CodeChallenge.canonical_phone_number", + index=3, + number=4, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + ], + extensions=[], + nested_types=[], + enum_types=[ + _CODECHALLENGE_METHOD, + ], + serialized_options=None, + is_extendable=False, + syntax="proto3", + extension_ranges=[], + oneofs=[], + serialized_start=74, + serialized_end=262, +) + +_CODESOLUTION = _descriptor.Descriptor( + name="CodeSolution", + full_name="spotify.login5.v3.challenges.CodeSolution", + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name="code", + full_name="spotify.login5.v3.challenges.CodeSolution.code", + index=0, + number=1, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax="proto3", + extension_ranges=[], + oneofs=[], + serialized_start=264, + serialized_end=292, +) + +_CODECHALLENGE.fields_by_name["method"].enum_type = _CODECHALLENGE_METHOD +_CODECHALLENGE_METHOD.containing_type = _CODECHALLENGE +DESCRIPTOR.message_types_by_name["CodeChallenge"] = _CODECHALLENGE +DESCRIPTOR.message_types_by_name["CodeSolution"] = _CODESOLUTION +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +CodeChallenge = _reflection.GeneratedProtocolMessageType( + "CodeChallenge", + (_message.Message, ), + { + "DESCRIPTOR": _CODECHALLENGE, + "__module__": "spotify.login5.v3.challenges.code_pb2" + # @@protoc_insertion_point(class_scope:spotify.login5.v3.challenges.CodeChallenge) + }, +) +_sym_db.RegisterMessage(CodeChallenge) + +CodeSolution = _reflection.GeneratedProtocolMessageType( + "CodeSolution", + (_message.Message, ), + { + "DESCRIPTOR": _CODESOLUTION, + "__module__": "spotify.login5.v3.challenges.code_pb2" + # @@protoc_insertion_point(class_scope:spotify.login5.v3.challenges.CodeSolution) + }, +) +_sym_db.RegisterMessage(CodeSolution) + +DESCRIPTOR._options = None +# @@protoc_insertion_point(module_scope) diff --git a/librespot/proto/spotify/login5/v3/challenges/Hashcash_pb2.py b/librespot/proto/spotify/login5/v3/challenges/Hashcash_pb2.py new file mode 100644 index 0000000..d12b2a5 --- /dev/null +++ b/librespot/proto/spotify/login5/v3/challenges/Hashcash_pb2.py @@ -0,0 +1,176 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: spotify/login5/v3/challenges/hashcash.proto +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import \ + duration_pb2 as google_dot_protobuf_dot_duration__pb2 +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database + +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + +DESCRIPTOR = _descriptor.FileDescriptor( + name="spotify/login5/v3/challenges/hashcash.proto", + package="spotify.login5.v3.challenges", + syntax="proto3", + serialized_options=b"\n\024com.spotify.login5v3", + create_key=_descriptor._internal_create_key, + serialized_pb= + b'\n+spotify/login5/v3/challenges/hashcash.proto\x12\x1cspotify.login5.v3.challenges\x1a\x1egoogle/protobuf/duration.proto"3\n\x11HashcashChallenge\x12\x0e\n\x06prefix\x18\x01 \x01(\x0c\x12\x0e\n\x06length\x18\x02 \x01(\x05"O\n\x10HashcashSolution\x12\x0e\n\x06suffix\x18\x01 \x01(\x0c\x12+\n\x08\x64uration\x18\x02 \x01(\x0b\x32\x19.google.protobuf.DurationB\x16\n\x14\x63om.spotify.login5v3b\x06proto3', + dependencies=[ + google_dot_protobuf_dot_duration__pb2.DESCRIPTOR, + ], +) + +_HASHCASHCHALLENGE = _descriptor.Descriptor( + name="HashcashChallenge", + full_name="spotify.login5.v3.challenges.HashcashChallenge", + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name="prefix", + full_name="spotify.login5.v3.challenges.HashcashChallenge.prefix", + index=0, + number=1, + type=12, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"", + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="length", + full_name="spotify.login5.v3.challenges.HashcashChallenge.length", + index=1, + number=2, + type=5, + cpp_type=1, + label=1, + has_default_value=False, + default_value=0, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax="proto3", + extension_ranges=[], + oneofs=[], + serialized_start=109, + serialized_end=160, +) + +_HASHCASHSOLUTION = _descriptor.Descriptor( + name="HashcashSolution", + full_name="spotify.login5.v3.challenges.HashcashSolution", + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name="suffix", + full_name="spotify.login5.v3.challenges.HashcashSolution.suffix", + index=0, + number=1, + type=12, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"", + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="duration", + full_name="spotify.login5.v3.challenges.HashcashSolution.duration", + index=1, + number=2, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax="proto3", + extension_ranges=[], + oneofs=[], + serialized_start=162, + serialized_end=241, +) + +_HASHCASHSOLUTION.fields_by_name[ + "duration"].message_type = google_dot_protobuf_dot_duration__pb2._DURATION +DESCRIPTOR.message_types_by_name["HashcashChallenge"] = _HASHCASHCHALLENGE +DESCRIPTOR.message_types_by_name["HashcashSolution"] = _HASHCASHSOLUTION +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +HashcashChallenge = _reflection.GeneratedProtocolMessageType( + "HashcashChallenge", + (_message.Message, ), + { + "DESCRIPTOR": _HASHCASHCHALLENGE, + "__module__": "spotify.login5.v3.challenges.hashcash_pb2" + # @@protoc_insertion_point(class_scope:spotify.login5.v3.challenges.HashcashChallenge) + }, +) +_sym_db.RegisterMessage(HashcashChallenge) + +HashcashSolution = _reflection.GeneratedProtocolMessageType( + "HashcashSolution", + (_message.Message, ), + { + "DESCRIPTOR": _HASHCASHSOLUTION, + "__module__": "spotify.login5.v3.challenges.hashcash_pb2" + # @@protoc_insertion_point(class_scope:spotify.login5.v3.challenges.HashcashSolution) + }, +) +_sym_db.RegisterMessage(HashcashSolution) + +DESCRIPTOR._options = None +# @@protoc_insertion_point(module_scope) diff --git a/librespot/proto/spotify/login5/v3/challenges/__init__.py b/librespot/proto/spotify/login5/v3/challenges/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/librespot/proto/spotify/login5/v3/credentials/Credentials_pb2.py b/librespot/proto/spotify/login5/v3/credentials/Credentials_pb2.py new file mode 100644 index 0000000..f141f66 --- /dev/null +++ b/librespot/proto/spotify/login5/v3/credentials/Credentials_pb2.py @@ -0,0 +1,483 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: spotify/login5/v3/credentials/credentials.proto +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database + +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + +DESCRIPTOR = _descriptor.FileDescriptor( + name="spotify/login5/v3/credentials/credentials.proto", + package="spotify.login5.v3.credentials", + syntax="proto3", + serialized_options=b"\n\024com.spotify.login5v3", + create_key=_descriptor._internal_create_key, + serialized_pb= + b'\n/spotify/login5/v3/credentials/credentials.proto\x12\x1dspotify.login5.v3.credentials"2\n\x10StoredCredential\x12\x10\n\x08username\x18\x01 \x01(\t\x12\x0c\n\x04\x64\x61ta\x18\x02 \x01(\x0c"9\n\x08Password\x12\n\n\x02id\x18\x01 \x01(\t\x12\x10\n\x08password\x18\x02 \x01(\t\x12\x0f\n\x07padding\x18\x03 \x01(\x0c";\n\x13\x46\x61\x63\x65\x62ookAccessToken\x12\x0e\n\x06\x66\x62_uid\x18\x01 \x01(\t\x12\x14\n\x0c\x61\x63\x63\x65ss_token\x18\x02 \x01(\t"\x1d\n\x0cOneTimeToken\x12\r\n\x05token\x18\x01 \x01(\t"|\n\x15ParentChildCredential\x12\x10\n\x08\x63hild_id\x18\x01 \x01(\t\x12Q\n\x18parent_stored_credential\x18\x02 \x01(\x0b\x32/.spotify.login5.v3.credentials.StoredCredential"S\n\x15\x41ppleSignInCredential\x12\x11\n\tauth_code\x18\x01 \x01(\t\x12\x14\n\x0credirect_uri\x18\x02 \x01(\t\x12\x11\n\tbundle_id\x18\x03 \x01(\tB\x16\n\x14\x63om.spotify.login5v3b\x06proto3', +) + +_STOREDCREDENTIAL = _descriptor.Descriptor( + name="StoredCredential", + full_name="spotify.login5.v3.credentials.StoredCredential", + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name="username", + full_name="spotify.login5.v3.credentials.StoredCredential.username", + index=0, + number=1, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="data", + full_name="spotify.login5.v3.credentials.StoredCredential.data", + index=1, + number=2, + type=12, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"", + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax="proto3", + extension_ranges=[], + oneofs=[], + serialized_start=82, + serialized_end=132, +) + +_PASSWORD = _descriptor.Descriptor( + name="Password", + full_name="spotify.login5.v3.credentials.Password", + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name="id", + full_name="spotify.login5.v3.credentials.Password.id", + index=0, + number=1, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="password", + full_name="spotify.login5.v3.credentials.Password.password", + index=1, + number=2, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="padding", + full_name="spotify.login5.v3.credentials.Password.padding", + index=2, + number=3, + type=12, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"", + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax="proto3", + extension_ranges=[], + oneofs=[], + serialized_start=134, + serialized_end=191, +) + +_FACEBOOKACCESSTOKEN = _descriptor.Descriptor( + name="FacebookAccessToken", + full_name="spotify.login5.v3.credentials.FacebookAccessToken", + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name="fb_uid", + full_name= + "spotify.login5.v3.credentials.FacebookAccessToken.fb_uid", + index=0, + number=1, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="access_token", + full_name= + "spotify.login5.v3.credentials.FacebookAccessToken.access_token", + index=1, + number=2, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax="proto3", + extension_ranges=[], + oneofs=[], + serialized_start=193, + serialized_end=252, +) + +_ONETIMETOKEN = _descriptor.Descriptor( + name="OneTimeToken", + full_name="spotify.login5.v3.credentials.OneTimeToken", + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name="token", + full_name="spotify.login5.v3.credentials.OneTimeToken.token", + index=0, + number=1, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax="proto3", + extension_ranges=[], + oneofs=[], + serialized_start=254, + serialized_end=283, +) + +_PARENTCHILDCREDENTIAL = _descriptor.Descriptor( + name="ParentChildCredential", + full_name="spotify.login5.v3.credentials.ParentChildCredential", + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name="child_id", + full_name= + "spotify.login5.v3.credentials.ParentChildCredential.child_id", + index=0, + number=1, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="parent_stored_credential", + full_name= + "spotify.login5.v3.credentials.ParentChildCredential.parent_stored_credential", + index=1, + number=2, + type=11, + cpp_type=10, + label=1, + has_default_value=False, + default_value=None, + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax="proto3", + extension_ranges=[], + oneofs=[], + serialized_start=285, + serialized_end=409, +) + +_APPLESIGNINCREDENTIAL = _descriptor.Descriptor( + name="AppleSignInCredential", + full_name="spotify.login5.v3.credentials.AppleSignInCredential", + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name="auth_code", + full_name= + "spotify.login5.v3.credentials.AppleSignInCredential.auth_code", + index=0, + number=1, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="redirect_uri", + full_name= + "spotify.login5.v3.credentials.AppleSignInCredential.redirect_uri", + index=1, + number=2, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="bundle_id", + full_name= + "spotify.login5.v3.credentials.AppleSignInCredential.bundle_id", + index=2, + number=3, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax="proto3", + extension_ranges=[], + oneofs=[], + serialized_start=411, + serialized_end=494, +) + +_PARENTCHILDCREDENTIAL.fields_by_name[ + "parent_stored_credential"].message_type = _STOREDCREDENTIAL +DESCRIPTOR.message_types_by_name["StoredCredential"] = _STOREDCREDENTIAL +DESCRIPTOR.message_types_by_name["Password"] = _PASSWORD +DESCRIPTOR.message_types_by_name["FacebookAccessToken"] = _FACEBOOKACCESSTOKEN +DESCRIPTOR.message_types_by_name["OneTimeToken"] = _ONETIMETOKEN +DESCRIPTOR.message_types_by_name[ + "ParentChildCredential"] = _PARENTCHILDCREDENTIAL +DESCRIPTOR.message_types_by_name[ + "AppleSignInCredential"] = _APPLESIGNINCREDENTIAL +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +StoredCredential = _reflection.GeneratedProtocolMessageType( + "StoredCredential", + (_message.Message, ), + { + "DESCRIPTOR": _STOREDCREDENTIAL, + "__module__": "spotify.login5.v3.credentials.credentials_pb2" + # @@protoc_insertion_point(class_scope:spotify.login5.v3.credentials.StoredCredential) + }, +) +_sym_db.RegisterMessage(StoredCredential) + +Password = _reflection.GeneratedProtocolMessageType( + "Password", + (_message.Message, ), + { + "DESCRIPTOR": _PASSWORD, + "__module__": "spotify.login5.v3.credentials.credentials_pb2" + # @@protoc_insertion_point(class_scope:spotify.login5.v3.credentials.Password) + }, +) +_sym_db.RegisterMessage(Password) + +FacebookAccessToken = _reflection.GeneratedProtocolMessageType( + "FacebookAccessToken", + (_message.Message, ), + { + "DESCRIPTOR": _FACEBOOKACCESSTOKEN, + "__module__": "spotify.login5.v3.credentials.credentials_pb2" + # @@protoc_insertion_point(class_scope:spotify.login5.v3.credentials.FacebookAccessToken) + }, +) +_sym_db.RegisterMessage(FacebookAccessToken) + +OneTimeToken = _reflection.GeneratedProtocolMessageType( + "OneTimeToken", + (_message.Message, ), + { + "DESCRIPTOR": _ONETIMETOKEN, + "__module__": "spotify.login5.v3.credentials.credentials_pb2" + # @@protoc_insertion_point(class_scope:spotify.login5.v3.credentials.OneTimeToken) + }, +) +_sym_db.RegisterMessage(OneTimeToken) + +ParentChildCredential = _reflection.GeneratedProtocolMessageType( + "ParentChildCredential", + (_message.Message, ), + { + "DESCRIPTOR": _PARENTCHILDCREDENTIAL, + "__module__": "spotify.login5.v3.credentials.credentials_pb2" + # @@protoc_insertion_point(class_scope:spotify.login5.v3.credentials.ParentChildCredential) + }, +) +_sym_db.RegisterMessage(ParentChildCredential) + +AppleSignInCredential = _reflection.GeneratedProtocolMessageType( + "AppleSignInCredential", + (_message.Message, ), + { + "DESCRIPTOR": _APPLESIGNINCREDENTIAL, + "__module__": "spotify.login5.v3.credentials.credentials_pb2" + # @@protoc_insertion_point(class_scope:spotify.login5.v3.credentials.AppleSignInCredential) + }, +) +_sym_db.RegisterMessage(AppleSignInCredential) + +DESCRIPTOR._options = None +# @@protoc_insertion_point(module_scope) diff --git a/librespot/proto/spotify/login5/v3/credentials/__init__.py b/librespot/proto/spotify/login5/v3/credentials/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/librespot/proto/spotify/login5/v3/identifiers/Identifiers.py b/librespot/proto/spotify/login5/v3/identifiers/Identifiers.py new file mode 100644 index 0000000..42457c5 --- /dev/null +++ b/librespot/proto/spotify/login5/v3/identifiers/Identifiers.py @@ -0,0 +1,119 @@ +# -*- coding: utf-8 -*- +# Generated by the protocol buffer compiler. DO NOT EDIT! +# source: spotify/login5/v3/identifiers/identifiers.proto +"""Generated protocol buffer code.""" +from google.protobuf import descriptor as _descriptor +from google.protobuf import message as _message +from google.protobuf import reflection as _reflection +from google.protobuf import symbol_database as _symbol_database + +# @@protoc_insertion_point(imports) + +_sym_db = _symbol_database.Default() + +DESCRIPTOR = _descriptor.FileDescriptor( + name="spotify/login5/v3/identifiers/identifiers.proto", + package="spotify.login5.v3.identifiers", + syntax="proto3", + serialized_options=b"\n\024com.spotify.login5v3", + create_key=_descriptor._internal_create_key, + serialized_pb= + b'\n/spotify/login5/v3/identifiers/identifiers.proto\x12\x1dspotify.login5.v3.identifiers"U\n\x0bPhoneNumber\x12\x0e\n\x06number\x18\x01 \x01(\t\x12\x18\n\x10iso_country_code\x18\x02 \x01(\t\x12\x1c\n\x14\x63ountry_calling_code\x18\x03 \x01(\tB\x16\n\x14\x63om.spotify.login5v3b\x06proto3', +) + +_PHONENUMBER = _descriptor.Descriptor( + name="PhoneNumber", + full_name="spotify.login5.v3.identifiers.PhoneNumber", + filename=None, + file=DESCRIPTOR, + containing_type=None, + create_key=_descriptor._internal_create_key, + fields=[ + _descriptor.FieldDescriptor( + name="number", + full_name="spotify.login5.v3.identifiers.PhoneNumber.number", + index=0, + number=1, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="iso_country_code", + full_name= + "spotify.login5.v3.identifiers.PhoneNumber.iso_country_code", + index=1, + number=2, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + _descriptor.FieldDescriptor( + name="country_calling_code", + full_name= + "spotify.login5.v3.identifiers.PhoneNumber.country_calling_code", + index=2, + number=3, + type=9, + cpp_type=9, + label=1, + has_default_value=False, + default_value=b"".decode("utf-8"), + message_type=None, + enum_type=None, + containing_type=None, + is_extension=False, + extension_scope=None, + serialized_options=None, + file=DESCRIPTOR, + create_key=_descriptor._internal_create_key, + ), + ], + extensions=[], + nested_types=[], + enum_types=[], + serialized_options=None, + is_extendable=False, + syntax="proto3", + extension_ranges=[], + oneofs=[], + serialized_start=82, + serialized_end=167, +) + +DESCRIPTOR.message_types_by_name["PhoneNumber"] = _PHONENUMBER +_sym_db.RegisterFileDescriptor(DESCRIPTOR) + +PhoneNumber = _reflection.GeneratedProtocolMessageType( + "PhoneNumber", + (_message.Message, ), + { + "DESCRIPTOR": _PHONENUMBER, + "__module__": "spotify.login5.v3.identifiers.identifiers_pb2" + # @@protoc_insertion_point(class_scope:spotify.login5.v3.identifiers.PhoneNumber) + }, +) +_sym_db.RegisterMessage(PhoneNumber) + +DESCRIPTOR._options = None +# @@protoc_insertion_point(module_scope) diff --git a/librespot/proto/spotify/login5/v3/identifiers/__init__.py b/librespot/proto/spotify/login5/v3/identifiers/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/librespot/structure.py b/librespot/structure.py new file mode 100644 index 0000000..9171ada --- /dev/null +++ b/librespot/structure.py @@ -0,0 +1,103 @@ +from __future__ import annotations +import typing + +if typing.TYPE_CHECKING: + from librespot.audio import AbsChunkedInputStream + from librespot.audio.format import SuperAudioFormat + from librespot.core import DealerClient, Session + from librespot.crypto import Packet + from librespot.mercury import MercuryClient + from librespot.proto import Metadata_pb2 as Metadata + + +class AudioDecrypt: + def decrypt_chunk(self, chunk_index: int, buffer: bytes): + raise NotImplementedError + + def decrypt_time_ms(self): + raise NotImplementedError + + +class AudioQualityPicker: + def get_file(self, + files: typing.List[Metadata.AudioFile]) -> Metadata.AudioFile: + raise NotImplementedError + + +class Closeable: + def close(self) -> None: + raise NotImplementedError + + +class FeederException(Exception): + pass + + +class GeneralAudioStream: + def stream(self) -> AbsChunkedInputStream: + raise NotImplementedError + + def codec(self) -> SuperAudioFormat: + raise NotImplementedError + + def describe(self) -> str: + raise NotImplementedError + + def decrypt_time_ms(self) -> int: + raise NotImplementedError + + +class GeneralWritableStream: + def write_chunk(self, buffer: bytearray, chunk_index: int, cached: bool): + raise NotImplementedError + + +class HaltListener: + def stream_read_halted(self, chunk: int, _time: int) -> None: + raise NotImplementedError + + def stream_read_resumed(self, chunk: int, _time: int) -> None: + raise NotImplementedError + + +class MessageListener: + def on_message(self, uri: str, headers: typing.Dict[str, str], + payload: bytes): + raise NotImplementedError + + +class NoopAudioDecrypt(AudioDecrypt): + def decrypt_chunk(self, chunk_index: int, buffer: bytes): + return buffer + + def decrypt_time_ms(self): + return 0 + + +class PacketsReceiver: + def dispatch(self, packet: Packet): + raise NotImplementedError + + +class RequestListener: + def on_request(self, mid: str, pid: int, sender: str, + command: typing.Any) -> DealerClient.RequestResult: + raise NotImplementedError + + +class Runnable: + def run(self): + raise NotImplementedError + + +class SessionListener: + def session_closing(self, session: Session) -> None: + raise NotImplementedError + + def session_changed(self, session: Session) -> None: + raise NotImplementedError + + +class SubListener: + def event(self, resp: MercuryClient.Response) -> None: + raise NotImplementedError diff --git a/librespot/util.py b/librespot/util.py new file mode 100644 index 0000000..28d7441 --- /dev/null +++ b/librespot/util.py @@ -0,0 +1,117 @@ +from Cryptodome import Random +import binascii +import math + + +def bytes_to_hex(buffer: bytes) -> str: + """ + Convert bytes to hex + Args: + buffer: Bytes to convert + Returns: + hex + """ + return binascii.hexlify(buffer).decode() + + +def hex_to_bytes(s: str) -> bytes: + return binascii.unhexlify(s) + + +def int_to_bytes(i: int): + """ + Convert an integer to a byte(s) + Args: + i: Integer to convert + Returns: + bytes + """ + width = i.bit_length() + width += 8 - ((width % 8) or 8) + fmt = '%%0%dx' % (width // 4) + return b"\x00" if i == 0 else binascii.unhexlify(fmt % i) + + +def random_hex_string(length: int): + buffer = Random.get_random_bytes(int(length / 2)) + return bytes_to_hex(buffer) + + +class Base62: + standard_base = 256 + target_base = 62 + alphabet: bytes + lookup: bytearray + + def __init__(self, alphabet: bytes): + self.alphabet = alphabet + self.create_lookup_table() + + @staticmethod + def create_instance_with_inverted_character_set(): + return Base62(Base62.CharacterSets.inverted) + + def encode(self, message: bytes, length: int = -1): + indices = self.convert(message, self.standard_base, self.target_base, + length) + return self.translate(indices, self.alphabet) + + def decode(self, encoded: bytes, length: int = -1): + prepared = self.translate(encoded, self.lookup) + return self.convert(prepared, self.target_base, self.standard_base, + length) + + def translate(self, indices: bytes, dictionary: bytes): + translation = bytearray(len(indices)) + for i in range(len(indices)): + translation[i] = dictionary[int.from_bytes(bytes([indices[i]]), "big")] + return translation + + def convert(self, message: bytes, source_base: int, target_base: int, + length: int): + estimated_length = self.estimate_output_length( + len(message), source_base, target_base) if length == -1 else length + out = b"" + source = message + while len(source) > 0: + quotient = b"" + remainder = 0 + for b in source: + accumulator = int(b & 0xff) + remainder * source_base + digit = int( + (accumulator - (accumulator % target_base)) / target_base) + remainder = int(accumulator % target_base) + if len(quotient) > 0 or digit > 0: + quotient += bytes([digit]) + out += bytes([remainder]) + source = quotient + if len(out) < estimated_length: + size = len(out) + for _ in range(estimated_length - size): + out += bytes([0]) + return self.reverse(out) + if len(out) > estimated_length: + return self.reverse(out[:estimated_length]) + return self.reverse(out) + + def estimate_output_length(self, input_length: int, source_base: int, + target_base: int): + return int( + math.ceil((math.log(source_base) / math.log(target_base)) * + input_length)) + + def reverse(self, arr: bytes): + length = len(arr) + reversed_arr = bytearray(length) + for i in range(length): + reversed_arr[length - i - 1] = arr[i] + return bytes(reversed_arr) + + def create_lookup_table(self): + self.lookup = bytearray(256) + for i in range(len(self.alphabet)): + self.lookup[self.alphabet[i]] = i & 0xff + + class CharacterSets: + gmp = b'0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz' + inverted = b'0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ' diff --git a/librespot/zeroconf.py b/librespot/zeroconf.py new file mode 100644 index 0000000..106e274 --- /dev/null +++ b/librespot/zeroconf.py @@ -0,0 +1,417 @@ +from __future__ import annotations +from Cryptodome.Cipher import AES +from Cryptodome.Hash import HMAC, SHA1 +from Cryptodome.Util import Counter +from librespot import util, Version +from librespot.core import Session +from librespot.crypto import DiffieHellman +from librespot.proto import Connect_pb2 as Connect +from librespot.structure import Closeable, Runnable, SessionListener +import base64 +import concurrent.futures +import copy +import io +import json +import logging +import random +import socket +import threading +import typing +import urllib.parse +import zeroconf + + +class ZeroconfServer(Closeable): + logger = logging.getLogger("Librespot:ZeroconfServer") + service = "_spotify-connect._tcp.local." + __connecting_username: typing.Union[str, None] = None + __connection_lock = threading.Condition() + __default_get_info_fields = { + "status": 101, + "statusString": "OK", + "spotifyError": 0, + "version": "2.9.0", + "libraryVersion": Version.version_name, + "accountReq": "FREE", + "brandDisplayName": "Spotizerr", + "modelDisplayName": "librespot-spotizerr", + "voiceSupport": "NO", + "availability": "1", + "productID": 0, + "tokenType": "default", + "groupStatus": "NONE", + "resolverVersion": "1", + "scope": "streaming,client-authorization-universal", + "clientID": "65b708073fc0480ea92a077233ca87bd" + } + __default_successful_add_user = { + "status": 101, + "spotifyError": 0, + "statusString": "OK", + } + __eol = b"\r\n" + __max_port = 65536 + __min_port = 1024 + __runner: HttpRunner + __service_info: zeroconf.ServiceInfo + __session: typing.Union[Session, None] = None + __session_listeners: typing.List[SessionListener] = [] + __zeroconf: zeroconf.Zeroconf + + def __init__(self, inner: Inner, listen_port): + self.__inner = inner + self.__keys = DiffieHellman() + if listen_port == -1: + listen_port = random.randint(self.__min_port + 1, self.__max_port) + self.__runner = ZeroconfServer.HttpRunner(self, listen_port) + threading.Thread(target=self.__runner.run, + name="zeroconf-http-server").start() + self.__zeroconf = zeroconf.Zeroconf() + + advertised_ip_str = self._get_local_ip() + + server_hostname = socket.gethostname() + if not server_hostname or server_hostname == "localhost": + self.logger.warning( + f"Machine hostname is '{server_hostname}', which is not ideal for mDNS. " + f"Consider setting a unique hostname for this machine. " + f"Using device name '{inner.device_name}' as part of the service instance name, " + f"but relying on zeroconf library to handle server resolution for IP {advertised_ip_str}." + ) + + service_addresses = None + if advertised_ip_str != "0.0.0.0": + try: + service_addresses = [socket.inet_aton(advertised_ip_str)] + except socket.error: # Catches errors like invalid IP string format + self.logger.error(f"Failed to convert IP string '{advertised_ip_str}' to packed address. Zeroconf will attempt to determine addresses from hostname.") + + self.__service_info = zeroconf.ServiceInfo( + ZeroconfServer.service, # type, e.g., "_spotify-connect._tcp.local." + f"{inner.device_name}.{ZeroconfServer.service}", # name, e.g., "MyDevice._spotify-connect._tcp.local." + listen_port, + 0, # weight + 0, # priority + { # properties + "CPath": "/", + "VERSION": "1.0", + "STACK": "SP", + }, + server=f"{server_hostname}.local.", # server FQDN + addresses=service_addresses # Pass resolved IP, or None if 0.0.0.0 or conversion failed + ) + + self.__zeroconf.register_service(self.__service_info) + + def _get_local_ip(self) -> str: + """Tries to determine a non-loopback local IP address for network advertisement.""" + s = None + ip_address = "0.0.0.0" # Default to all interfaces if specific IP cannot be found + try: + # Attempt to connect to an external address to find the appropriate local IP + s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) + s.settimeout(0.1) # Short timeout for the connect attempt + s.connect(("8.8.8.8", 80)) # Google's public DNS server + ip_address = s.getsockname()[0] + self.logger.info(f"Determined local IP via connect trick: {ip_address}") + except OSError as e: # Catches socket errors like [Errno 101] Network is unreachable + self.logger.warning(f"Could not determine local IP via connect trick ({e}). Trying socket.gethostname().") + try: + hostname = socket.gethostname() + # gethostbyname can return 127.0.0.1 if hostname resolves to it + ip_address = socket.gethostbyname(hostname) + self.logger.info(f"IP from socket.gethostbyname('{hostname}'): {ip_address}") + except socket.gaierror: + self.logger.error( + f"socket.gaierror resolving hostname '{socket.gethostname()}'. Falling back to 0.0.0.0." + ) + ip_address = "0.0.0.0" + finally: + if s: + s.close() + + # If the IP is loopback (127.x.x.x) or still 0.0.0.0, try to find a better one from all interfaces + if ip_address.startswith("127.") or ip_address == "0.0.0.0": + self.logger.warning( + f"Current IP ('{ip_address}') is loopback or 0.0.0.0. Attempting to find a non-loopback IP from host interfaces." + ) + try: + current_hostname = socket.gethostname() + all_ips_info = socket.gethostbyname_ex(current_hostname) + # all_ips_info is a tuple: (hostname, aliaslist, ipaddrlist) + non_loopback_ips = [ip for ip in all_ips_info[2] if not ip.startswith("127.")] + + if non_loopback_ips: + ip_address = non_loopback_ips[0] # Pick the first non-loopback IP + self.logger.info(f"Found non-loopback IP from host interfaces ('{current_hostname}'): {ip_address}") + else: + self.logger.warning( + f"No non-loopback IPs found for hostname '{current_hostname}'. Retaining '{ip_address}'." + ) + # If ip_address was 0.0.0.0, it remains so. If it was 127.0.0.1, it remains so. + except socket.gaierror: + self.logger.error( + f"socket.gaierror during fallback IP search for hostname '{socket.gethostname()}'. Retaining '{ip_address}'." + ) + + if ip_address == "0.0.0.0": + self.logger.warning("Failed to determine a specific non-loopback IP. Zeroconf will attempt to use all available interfaces.") + elif ip_address.startswith("127."): + self.logger.warning(f"Final IP for advertisement is loopback ('{ip_address}'). Service discovery may not work correctly on the network.") + else: + self.logger.info(f"Using IP address for Zeroconf advertisement: {ip_address}") + + return ip_address + + def add_session_listener(self, listener: ZeroconfServer): + self.__session_listeners.append(listener) + + def close(self) -> None: + self.__zeroconf.close() + self.__runner.close() + + def close_session(self) -> None: + if self.__session is None: + return + for session_listener in self.__session_listeners: + session_listener.session_closing(self.__session) + self.__session.close() + self.__session = None + + def handle_add_user(self, __socket: socket.socket, params: dict[str, str], + http_version: str) -> None: + username = params.get("userName") + if not username: + self.logger.error("Missing userName!") + return + blob_str = params.get("blob") + if not blob_str: + self.logger.error("Missing blob!") + return + client_key_str = params.get("clientKey") + if not client_key_str: + self.logger.error("Missing clientKey!") + with self.__connection_lock: + if username == self.__connecting_username: + self.logger.info( + "{} is already trying to connect.".format(username)) + __socket.send(http_version.encode()) + __socket.send(b" 403 Forbidden") + __socket.send(self.__eol) + __socket.send(self.__eol) + return + shared_key = util.int_to_bytes( + self.__keys.compute_shared_key( + base64.b64decode(client_key_str.encode()))) + blob_bytes = base64.b64decode(blob_str) + iv = blob_bytes[:16] + encrypted = blob_bytes[16:len(blob_bytes) - 20] + checksum = blob_bytes[len(blob_bytes) - 20:] + sha1 = SHA1.new() + sha1.update(shared_key) + base_key = sha1.digest()[:16] + hmac = HMAC.new(base_key, digestmod=SHA1) + hmac.update(b"checksum") + checksum_key = hmac.digest() + hmac = HMAC.new(base_key, digestmod=SHA1) + hmac.update(b"encryption") + encryption_key = hmac.digest() + hmac = HMAC.new(checksum_key, digestmod=SHA1) + hmac.update(encrypted) + mac = hmac.digest() + if mac != checksum: + self.logger.error("Mac and checksum don't match!") + __socket.send(http_version.encode()) + __socket.send(b" 400 Bad Request") + __socket.send(self.__eol) + __socket.send(self.__eol) + return + aes = AES.new(encryption_key[:16], + AES.MODE_CTR, + counter=Counter.new(128, + initial_value=int.from_bytes( + iv, "big"))) + decrypted = aes.decrypt(encrypted) + self.close_session() + with self.__connection_lock: + self.__connecting_username = username + self.logger.info("Accepted new user from {}. [deviceId: {}]".format( + params.get("deviceName"), self.__inner.device_id)) + response = json.dumps(self.__default_successful_add_user) + __socket.send(http_version.encode()) + __socket.send(b" 200 OK") + __socket.send(self.__eol) + __socket.send(b"Content-Length: ") + __socket.send(str(len(response)).encode()) + __socket.send(self.__eol) + __socket.send(self.__eol) + __socket.send(response.encode()) + self.__session = Session.Builder(self.__inner.conf) \ + .set_device_id(self.__inner.device_id) \ + .set_device_name(self.__inner.device_name) \ + .set_device_type(self.__inner.device_type) \ + .set_preferred_locale(self.__inner.preferred_locale) \ + .blob(username, decrypted) \ + .create() + with self.__connection_lock: + self.__connecting_username = None + for session_listener in self.__session_listeners: + session_listener.session_changed(self.__session) + + def handle_get_info(self, __socket: socket.socket, + http_version: str) -> None: + info = copy.deepcopy(self.__default_get_info_fields) + info["deviceID"] = self.__inner.device_id + info["remoteName"] = self.__inner.device_name + info["publicKey"] = base64.b64encode( + self.__keys.public_key_bytes()).decode() + device_type_name = Connect.DeviceType.Name(self.__inner.device_type) + info["deviceType"] = device_type_name.title() + with self.__connection_lock: + info[ + "activeUser"] = self.__connecting_username if self.__connecting_username is not None else self.__session.username( + ) if self.has_valid_session() else "" + __socket.send(http_version.encode()) + __socket.send(b" 200 OK") + __socket.send(self.__eol) + __socket.send(b"Content-Type: application/json") + __socket.send(self.__eol) + __socket.send(self.__eol) + __socket.send(json.dumps(info).encode()) + + def has_valid_session(self) -> bool: + valid = self.__session and self.__session.is_valid() + if not valid: + self.__session = None + return valid + + def parse_path(self, path: str) -> dict[str, str]: + url = "https://host" + path + parsed = {} + params = urllib.parse.parse_qs(urllib.parse.urlparse(url).query) + for key, values in params.items(): + for value in values: + parsed[key] = value + return parsed + + def remove_session_listener(self, listener: SessionListener): + self.__session_listeners.remove(listener) + + class Builder(Session.Builder): + listen_port: int = -1 + + def set_listen_port(self, listen_port: int): + self.listen_port = listen_port + return self + + def create(self) -> ZeroconfServer: + return ZeroconfServer( + ZeroconfServer.Inner(self.device_type, self.device_name, + self.device_id, self.preferred_locale, + self.conf), self.listen_port) + + class HttpRunner(Closeable, Runnable): + __should_stop = False + __socket: socket.socket + __worker = concurrent.futures.ThreadPoolExecutor() + __zeroconf_server: ZeroconfServer + + def __init__(self, zeroconf_server: ZeroconfServer, port: int): + self.__socket = socket.socket() + self.__socket.bind((".".join(["0"] * 4), port)) + self.__socket.listen(5) + self.__zeroconf_server = zeroconf_server + self.__zeroconf_server.logger.info( + "Zeroconf HTTP server started successfully on port {}!".format( + port)) + + def close(self) -> None: + pass + + def run(self): + while not self.__should_stop: + __socket, address = self.__socket.accept() + + def anonymous(): + self.__handle(__socket) + __socket.close() + + self.__worker.submit(anonymous) + + def __handle(self, __socket: socket.socket) -> None: + request = io.BytesIO(__socket.recv(1024 * 1024)) + request_line = request.readline().strip().split(b" ") + if len(request_line) != 3: + self.__zeroconf_server.logger.warning( + "Unexpected request line: {}".format(request_line)) + method = request_line[0].decode() + path = request_line[1].decode() + http_version = request_line[2].decode() + headers = {} + while True: + header = request.readline().strip() + if not header: + break + split = header.split(b":") + headers[split[0].decode()] = split[1].strip().decode() + if not self.__zeroconf_server.has_valid_session(): + self.__zeroconf_server.logger.debug( + "Handling request: {}, {}, {}, headers: {}".format( + method, path, http_version, headers)) + params = {} + if method == "POST": + content_type = headers.get("Content-Type") + if content_type != "application/x-www-form-urlencoded": + self.__zeroconf_server.logger.error( + "Bad Content-Type: {}".format(content_type)) + return + content_length_str = headers.get("Content-Length") + if content_length_str is None: + self.__zeroconf_server.logger.error( + "Missing Content-Length header!") + return + content_length = int(content_length_str) + body = request.read(content_length).decode() + pairs = body.split("&") + for pair in pairs: + split = pair.split("=") + params[urllib.parse.unquote( + split[0])] = urllib.parse.unquote(split[1]) + else: + params = self.__zeroconf_server.parse_path(path) + action = params.get("action") + if action is None: + self.__zeroconf_server.logger.debug( + "Request is missing action.") + return + self.handle_request(__socket, http_version, action, params) + + def handle_request(self, __socket: socket.socket, http_version: str, + action: str, params: dict[str, str]) -> None: + if action == "addUser": + if params is None: + raise RuntimeError + self.__zeroconf_server.handle_add_user(__socket, params, + http_version) + elif action == "getInfo": + self.__zeroconf_server.handle_get_info(__socket, http_version) + else: + self.__zeroconf_server.logger.warning( + "Unknown action: {}".format(action)) + + class Inner: + conf: typing.Final[Session.Configuration] + device_name: typing.Final[str] + device_id: typing.Final[str] + device_type: typing.Final[Connect.DeviceType] + preferred_locale: typing.Final[str] + + def __init__(self, device_type: Connect.DeviceType, device_name: str, + device_id: str, preferred_locale: str, + conf: Session.Configuration): + self.conf = conf + self.device_name = device_name + self.device_id = util.random_hex_string( + 40).lower() if not device_id else device_id + self.device_type = device_type + self.preferred_locale = preferred_locale diff --git a/librespot_player/__init__.py b/librespot_player/__init__.py new file mode 100644 index 0000000..630986e --- /dev/null +++ b/librespot_player/__init__.py @@ -0,0 +1,205 @@ +from __future__ import annotations +from librespot import Version +from librespot.audio.decoders import AudioQuality +from librespot.core import Session +from librespot.mercury import MercuryRequests +from librespot.proto import Connect_pb2 as Connect +from librespot.structure import Closeable, MessageListener, RequestListener +import concurrent.futures +import logging +import typing +import urllib.parse + + +class DeviceStateHandler(Closeable, MessageListener, RequestListener): + logger = logging.getLogger("Librespot:DeviceStateHandler") + __closing = False + __connection_id: str = None + __device_info: Connect.DeviceInfo + __put_state: Connect.PutStateRequest + __put_state_worker = concurrent.futures.ThreadPoolExecutor() + __session: Session + + def __init__(self, session: Session, conf: PlayerConfiguration): + self.__session = session + self.__device_info = self.initialize_device_info(session, conf) + self.__put_state = Connect.PutStateRequest( + device=Connect.Device(device_info=self.__device_info, ), + member_type=Connect.MemberType.CONNECT_STATE, + ) + self.__session.dealer().add_message_listener(self, [ + "hm://pusher/v1/connections/", + "hm://connect-state/v1/connect/volume", + "hm://connect-state/v1/cluster" + ]) + self.__session.dealer().add_request_listener(self, + "hm://connect-state/v1/") + + def close(self) -> None: + self.__closing = True + self.__session.dealer().remove_message_listener(self) + self.__session.dealer().remove_request_listener(self) + self.__put_state_worker.shutdown() + + def initialize_device_info(self, session: Session, + conf: PlayerConfiguration) -> Connect.Device: + return Connect.DeviceInfo( + can_play=True, + capabilities=Connect.Capabilities( + can_be_player=True, + command_acks=True, + is_controllable=True, + is_observable=True, + gaia_eq_connect_id=True, + needs_full_player_state=False, + supported_types=["audio/episode", "audio/track"], + supports_command_request=True, + supports_gzip_pushes=True, + supports_logout=True, + supports_playlist_v2=True, + supports_rename=False, + supports_transfer_command=True, + volume_steps=conf.volume_steps, + ), + client_id=MercuryRequests.keymaster_client_id, + device_id=session.device_id(), + device_software_version=Version.version_string(), + device_type=session.device_type(), + name=session.device_name(), + spirc_version="3.2.6", + volume=conf.initial_volume, + ) + + def put_connect_state(self, request: Connect.PutStateRequest): + self.__session.api().put_connect_state(self.__connection_id, request) + self.logger.info("Put state. [ts: {}, connId: {}, reason: {}]".format( + request.client_side_timestamp, self.__connection_id, + request.put_state_reason)) + + def update_connection_id(self, newer: str) -> None: + newer = urllib.parse.unquote(newer) + if self.__connection_id is None or self.__connection_id != newer: + self.__connection_id = newer + self.logger.debug( + "Updated Spotify-Connection-Id: {}".format(newer)) + + +class Player: + volume_max = 65536 + __conf: PlayerConfiguration + __session: Session + __state: StateWrapper + + def __init__(self, conf: PlayerConfiguration, session: Session): + self.__conf = conf + self.__session = session + + def init_state(self) -> None: + self.__state = StateWrapper(self.__session, self, self.__conf) + + +class PlayerConfiguration: + # Audio + preferred_quality: AudioQuality + enable_normalisation: bool + normalisation_pregain: float + autoplay_enabled: bool + crossfade_duration: int + preload_enabled: bool + + # Volume + initial_volume: int + volume_steps: int + + def __init__( + self, + preferred_quality: AudioQuality, + enable_normalisation: bool, + normalisation_pregain: float, + autoplay_enabled: bool, + crossfade_duration: int, + preload_enabled: bool, + initial_volume: int, + volume_steps: int, + ): + self.preferred_quality = preferred_quality + self.enable_normalisation = enable_normalisation + self.normalisation_pregain = normalisation_pregain + self.autoplay_enabled = autoplay_enabled + self.crossfade_duration = crossfade_duration + self.preload_enabled = preload_enabled + self.initial_volume = initial_volume + self.volume_steps = volume_steps + + class Builder: + preferred_quality: AudioQuality = AudioQuality.NORMAL + enable_normalisation: bool = True + normalisation_pregain: float = 3.0 + autoplay_enabled: bool = True + crossfade_duration: int = 0 + preload_enabled: bool = True + + # Volume + initial_volume: int = 65536 + volume_steps: int = 64 + + def set_preferred_quality( + self, preferred_quality: AudioQuality) -> __class__: + self.preferred_quality = preferred_quality + return self + + def set_enable_normalisation(self, + enable_normalisation: bool) -> __class__: + self.enable_normalisation = enable_normalisation + return self + + def set_normalisation_pregain( + self, normalisation_pregain: float) -> __class__: + self.normalisation_pregain = normalisation_pregain + return self + + def set_autoplay_enabled(self, autoplay_enabled: bool) -> __class__: + self.autoplay_enabled = autoplay_enabled + return self + + def set_crossfade_duration(self, crossfade_duration: int) -> __class__: + self.crossfade_duration = crossfade_duration + return self + + def set_preload_enabled(self, preload_enabled: bool) -> __class__: + self.preload_enabled = preload_enabled + return self + + def build(self) -> PlayerConfiguration: + return PlayerConfiguration( + self.preferred_quality, + self.enable_normalisation, + self.normalisation_pregain, + self.autoplay_enabled, + self.crossfade_duration, + self.preload_enabled, + self.initial_volume, + self.volume_steps, + ) + + +class StateWrapper(MessageListener): + __conf: PlayerConfiguration + __device: DeviceStateHandler + __player: Player + __session: Session + + def __init__(self, session: Session, player: Player, + conf: PlayerConfiguration): + self.__session = session + self.__player = player + self.__device = DeviceStateHandler(session, conf) + self.__conf = conf + session.dealer().add_message_listener(self, [ + "spotify:user:attributes:update", "hm://playlist/", + "hm://collection/collection/" + session.username() + "/json" + ]) + + def on_message(self, uri: str, headers: typing.Dict[str, str], + payload: bytes): + pass diff --git a/proto/authentication.proto b/proto/authentication.proto new file mode 100644 index 0000000..69c4f92 --- /dev/null +++ b/proto/authentication.proto @@ -0,0 +1,168 @@ +syntax = "proto2"; + +package spotify; +option java_package = "com.spotify"; + +message ClientResponseEncrypted { + required LoginCredentials login_credentials = 0xa; + optional AccountCreation account_creation = 0x14; + optional FingerprintResponseUnion fingerprint_response = 0x1e; + optional PeerTicketUnion peer_ticket = 0x28; + required SystemInfo system_info = 0x32; + optional string platform_model = 0x3c; + optional string version_string = 0x46; + optional LibspotifyAppKey appkey = 0x50; + optional ClientInfo client_info = 0x5a; +} + +message LoginCredentials { + optional string username = 0xa; + required AuthenticationType typ = 0x14; + optional bytes auth_data = 0x1e; +} + +enum AuthenticationType { + AUTHENTICATION_USER_PASS = 0x0; + AUTHENTICATION_STORED_SPOTIFY_CREDENTIALS = 0x1; + AUTHENTICATION_STORED_FACEBOOK_CREDENTIALS = 0x2; + AUTHENTICATION_SPOTIFY_TOKEN = 0x3; + AUTHENTICATION_FACEBOOK_TOKEN = 0x4; +} + +enum AccountCreation { + ACCOUNT_CREATION_ALWAYS_PROMPT = 0x1; + ACCOUNT_CREATION_ALWAYS_CREATE = 0x3; +} + +message FingerprintResponseUnion { + optional FingerprintGrainResponse grain = 0xa; + optional FingerprintHmacRipemdResponse hmac_ripemd = 0x14; +} + +message FingerprintGrainResponse { + required bytes encrypted_key = 0xa; +} + +message FingerprintHmacRipemdResponse { + required bytes hmac = 0xa; +} + +message PeerTicketUnion { + optional PeerTicketPublicKey public_key = 0xa; + optional PeerTicketOld old_ticket = 0x14; +} + +message PeerTicketPublicKey { + required bytes public_key = 0xa; +} + +message PeerTicketOld { + required bytes peer_ticket = 0xa; + required bytes peer_ticket_signature = 0x14; +} + +message SystemInfo { + required CpuFamily cpu_family = 0xa; + optional uint32 cpu_subtype = 0x14; + optional uint32 cpu_ext = 0x1e; + optional Brand brand = 0x28; + optional uint32 brand_flags = 0x32; + required Os os = 0x3c; + optional uint32 os_version = 0x46; + optional uint32 os_ext = 0x50; + optional string system_information_string = 0x5a; + optional string device_id = 0x64; +} + +enum CpuFamily { + CPU_UNKNOWN = 0x0; + CPU_X86 = 0x1; + CPU_X86_64 = 0x2; + CPU_PPC = 0x3; + CPU_PPC_64 = 0x4; + CPU_ARM = 0x5; + CPU_IA64 = 0x6; + CPU_SH = 0x7; + CPU_MIPS = 0x8; + CPU_BLACKFIN = 0x9; +} + +enum Brand { + BRAND_UNBRANDED = 0x0; + BRAND_INQ = 0x1; + BRAND_HTC = 0x2; + BRAND_NOKIA = 0x3; +} + +enum Os { + OS_UNKNOWN = 0x0; + OS_WINDOWS = 0x1; + OS_OSX = 0x2; + OS_IPHONE = 0x3; + OS_S60 = 0x4; + OS_LINUX = 0x5; + OS_WINDOWS_CE = 0x6; + OS_ANDROID = 0x7; + OS_PALM = 0x8; + OS_FREEBSD = 0x9; + OS_BLACKBERRY = 0xa; + OS_SONOS = 0xb; + OS_LOGITECH = 0xc; + OS_WP7 = 0xd; + OS_ONKYO = 0xe; + OS_PHILIPS = 0xf; + OS_WD = 0x10; + OS_VOLVO = 0x11; + OS_TIVO = 0x12; + OS_AWOX = 0x13; + OS_MEEGO = 0x14; + OS_QNXNTO = 0x15; + OS_BCO = 0x16; +} + +message LibspotifyAppKey { + required uint32 version = 0x1; + required bytes devkey = 0x2; + required bytes signature = 0x3; + required string useragent = 0x4; + required bytes callback_hash = 0x5; +} + +message ClientInfo { + optional bool limited = 0x1; + optional ClientInfoFacebook fb = 0x2; + optional string language = 0x3; +} + +message ClientInfoFacebook { + optional string machine_id = 0x1; +} + +message APWelcome { + required string canonical_username = 0xa; + required AccountType account_type_logged_in = 0x14; + required AccountType credentials_type_logged_in = 0x19; + required AuthenticationType reusable_auth_credentials_type = 0x1e; + required bytes reusable_auth_credentials = 0x28; + optional bytes lfs_secret = 0x32; + optional AccountInfo account_info = 0x3c; + optional AccountInfoFacebook fb = 0x46; +} + +enum AccountType { + Spotify = 0x0; + Facebook = 0x1; +} + +message AccountInfo { + optional AccountInfoSpotify spotify = 0x1; + optional AccountInfoFacebook facebook = 0x2; +} + +message AccountInfoSpotify { +} + +message AccountInfoFacebook { + optional string access_token = 0x1; + optional string machine_id = 0x2; +} diff --git a/proto/canvaz-meta.proto b/proto/canvaz-meta.proto new file mode 100644 index 0000000..e946ffd --- /dev/null +++ b/proto/canvaz-meta.proto @@ -0,0 +1,14 @@ +syntax = "proto3"; + +package com.spotify.canvaz; + +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.canvaz"; + +enum Type { + IMAGE = 0; + VIDEO = 1; + VIDEO_LOOPING = 2; + VIDEO_LOOPING_RANDOM = 3; + GIF = 4; +} diff --git a/proto/canvaz.proto b/proto/canvaz.proto new file mode 100644 index 0000000..af0a49b --- /dev/null +++ b/proto/canvaz.proto @@ -0,0 +1,40 @@ +syntax = "proto3"; + +package com.spotify.canvazcache; + +import "canvaz-meta.proto"; + +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.canvaz"; + +message Artist { + string uri = 1; + string name = 2; + string avatar = 3; +} + +message EntityCanvazResponse { + repeated Canvaz canvases = 1; + message Canvaz { + string id = 1; + string url = 2; + string file_id = 3; + canvaz.Type type = 4; + string entity_uri = 5; + Artist artist = 6; + bool explicit = 7; + string uploaded_by = 8; + string etag = 9; + string canvas_uri = 11; + } + + int64 ttl_in_seconds = 2; +} + +message EntityCanvazRequest { + repeated Entity entities = 1; + message Entity { + string entity_uri = 1; + string etag = 2; + } +} diff --git a/proto/client_token.proto b/proto/client_token.proto new file mode 100644 index 0000000..049380a --- /dev/null +++ b/proto/client_token.proto @@ -0,0 +1,125 @@ +syntax = "proto3"; + +package spotify.clienttoken.http.v0; + +import "connectivity.proto"; + +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.clienttoken.http.v0"; + +message ClientTokenRequest { + ClientTokenRequestType request_type = 1; + + oneof request { + ClientDataRequest client_data = 2; + ChallengeAnswersRequest challenge_answers = 3; + } +} + +message ClientDataRequest { + string client_version = 1; + string client_id = 2; + + oneof data { + data.v0.ConnectivitySdkData connectivity_sdk_data = 3; + } +} + +message ChallengeAnswersRequest { + string state = 1; + repeated ChallengeAnswer answers = 2; +} + +message ClientTokenResponse { + ClientTokenResponseType response_type = 1; + + oneof response { + GrantedTokenResponse granted_token = 2; + ChallengesResponse challenges = 3; + } +} + +message TokenDomain { + string domain = 1; +} + +message GrantedTokenResponse { + string token = 1; + int32 expires_after_seconds = 2; + int32 refresh_after_seconds = 3; + repeated TokenDomain domains = 4; +} + +message ChallengesResponse { + string state = 1; + repeated Challenge challenges = 2; +} + +message ClientSecretParameters { + string salt = 1; +} + +message EvaluateJSParameters { + string code = 1; + repeated string libraries = 2; +} + +message HashCashParameters { + int32 length = 1; + string prefix = 2; +} + +message Challenge { + ChallengeType type = 1; + + oneof parameters { + ClientSecretParameters client_secret_parameters = 2; + EvaluateJSParameters evaluate_js_parameters = 3; + HashCashParameters evaluate_hashcash_parameters = 4; + } +} + +message ClientSecretHMACAnswer { + string hmac = 1; +} + +message EvaluateJSAnswer { + string result = 1; +} + +message HashCashAnswer { + string suffix = 1; +} + +message ChallengeAnswer { + ChallengeType ChallengeType = 1; + + oneof answer { + ClientSecretHMACAnswer client_secret = 2; + EvaluateJSAnswer evaluate_js = 3; + HashCashAnswer hash_cash = 4; + } +} + +message ClientTokenBadRequest { + string message = 1; +} + +enum ClientTokenRequestType { + REQUEST_UNKNOWN = 0; + REQUEST_CLIENT_DATA_REQUEST = 1; + REQUEST_CHALLENGE_ANSWERS_REQUEST = 2; +} + +enum ClientTokenResponseType { + RESPONSE_UNKNOWN = 0; + RESPONSE_GRANTED_TOKEN_RESPONSE = 1; + RESPONSE_CHALLENGES_RESPONSE = 2; +} + +enum ChallengeType { + CHALLENGE_UNKNOWN = 0; + CHALLENGE_CLIENT_SECRET_HMAC = 1; + CHALLENGE_EVALUATE_JS = 2; + CHALLENGE_HASH_CASH = 3; +} \ No newline at end of file diff --git a/proto/connect.proto b/proto/connect.proto new file mode 100644 index 0000000..22ba764 --- /dev/null +++ b/proto/connect.proto @@ -0,0 +1,173 @@ +syntax = "proto3"; + +package connectstate; +import "player.proto"; + + +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.connectstate"; + +message ClusterUpdate { + Cluster cluster = 1; + ClusterUpdateReason update_reason = 2; + string ack_id = 3; + repeated string devices_that_changed = 4; +} + +message Device { + DeviceInfo device_info = 1; + PlayerState player_state = 2; + PrivateDeviceInfo private_device_info = 3; +} + +message Cluster { + int64 timestamp = 1; + string active_device_id = 2; + PlayerState player_state = 3; + map device = 4; + bytes transfer_data = 5; +} + +message PutStateRequest { + string callback_url = 1; + Device device = 2; + MemberType member_type = 3; + bool is_active = 4; + PutStateReason put_state_reason = 5; + uint32 message_id = 6; + string last_command_sent_by_device_id = 7; + uint32 last_command_message_id = 8; + uint64 started_playing_at = 9; + uint64 has_been_playing_for_ms = 11; + uint64 client_side_timestamp = 12; + bool only_write_player_state = 13; +} + +message PrivateDeviceInfo { + string platform = 1; +} + +message SubscribeRequest { + string callback_url = 1; +} + +message DeviceInfo { + bool can_play = 1; + uint32 volume = 2; + string name = 3; + Capabilities capabilities = 4; + string device_software_version = 6; + DeviceType device_type = 7; + string spirc_version = 9; + string device_id = 10; + bool is_private_session = 11; + bool is_social_connect = 12; + string client_id = 13; + string brand = 14; + string model = 15; + map metadata_map = 16; +} + +message Capabilities { + bool can_be_player = 2; + bool restrict_to_local = 3; + bool gaia_eq_connect_id = 5; + bool supports_logout = 6; + bool is_observable = 7; + int32 volume_steps = 8; + repeated string supported_types = 9; + bool command_acks = 10; + bool supports_rename = 11; + bool hidden = 12; + bool disable_volume = 13; + bool connect_disabled = 14; + bool supports_playlist_v2 = 15; + bool is_controllable = 16; + bool supports_external_episodes = 17; + bool supports_set_backend_metadata = 18; + bool supports_transfer_command = 19; + bool supports_command_request = 20; + bool is_voice_enabled = 21; + bool needs_full_player_state = 22; + bool supports_gzip_pushes = 23; + // reserved 1, "supported_contexts"; +} + +message ConnectCommandOptions { + int32 message_id = 1; +} + +message LogoutCommand { + ConnectCommandOptions command_options = 1; +} + +message SetVolumeCommand { + int32 volume = 1; + ConnectCommandOptions command_options = 2; +} + +message RenameCommand { + string rename_to = 1; + ConnectCommandOptions command_options = 2; +} + +message SetBackendMetadataCommand { + map metadata = 1; +} + +enum SendCommandResult { + UNKNOWN_SEND_COMMAND_RESULT = 0; + SUCCESS = 1; + DEVICE_NOT_FOUND = 2; + CONTEXT_PLAYER_ERROR = 3; + DEVICE_DISAPPEARED = 4; + UPSTREAM_ERROR = 5; + DEVICE_DOES_NOT_SUPPORT_COMMAND = 6; + RATE_LIMITED = 7; +} + +enum PutStateReason { + UNKNOWN_PUT_STATE_REASON = 0; + SPIRC_HELLO = 1; + SPIRC_NOTIFY = 2; + NEW_DEVICE = 3; + PLAYER_STATE_CHANGED = 4; + VOLUME_CHANGED = 5; + PICKER_OPENED = 6; + BECAME_INACTIVE = 7; +} + +enum MemberType { + SPIRC_V2 = 0; + SPIRC_V3 = 1; + CONNECT_STATE = 2; +} + +enum ClusterUpdateReason { + UNKNOWN_CLUSTER_UPDATE_REASON = 0; + DEVICES_DISAPPEARED = 1; + DEVICE_STATE_CHANGED = 2; + NEW_DEVICE_APPEARED = 3; +} + +enum DeviceType { + UNKNOWN = 0; + COMPUTER = 1; + TABLET = 2; + SMARTPHONE = 3; + SPEAKER = 4; + TV = 5; + AVR = 6; + STB = 7; + AUDIO_DONGLE = 8; + GAME_CONSOLE = 9; + CAST_VIDEO = 10; + CAST_AUDIO = 11; + AUTOMOBILE = 12; + SMARTWATCH = 13; + CHROMEBOOK = 14; + UNKNOWN_SPOTIFY = 100; + CAR_THING = 101; + OBSERVER = 102; + HOME_THING = 103; +} diff --git a/proto/connectivity.proto b/proto/connectivity.proto new file mode 100644 index 0000000..e26c2e4 --- /dev/null +++ b/proto/connectivity.proto @@ -0,0 +1,51 @@ +syntax = "proto3"; + +package spotify.clienttoken.data.v0; + +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.clienttoken.data.v0"; + +message ConnectivitySdkData { + PlatformSpecificData platform_specific_data = 1; + string device_id = 2; +} + +message PlatformSpecificData { + oneof data { + NativeAndroidData android = 1; + NativeIOSData ios = 2; + NativeWindowsData windows = 4; + } +} + +message NativeAndroidData { + int32 major_sdk_version = 1; + int32 minor_sdk_version = 2; + int32 patch_sdk_version = 3; + uint32 api_version = 4; + Screen screen_dimensions = 5; +} + +message NativeIOSData { + int32 user_interface_idiom = 1; + bool target_iphone_simulator = 2; + string hw_machine = 3; + string system_version = 4; + string simulator_model_identifier = 5; +} + +message NativeWindowsData { + int32 something1 = 1; + int32 something3 = 3; + int32 something4 = 4; + int32 something6 = 6; + int32 something7 = 7; + int32 something8 = 8; + bool something10 = 10; +} + +message Screen { + int32 width = 1; + int32 height = 2; + int32 density = 3; +} \ No newline at end of file diff --git a/proto/context.proto b/proto/context.proto new file mode 100644 index 0000000..853276d --- /dev/null +++ b/proto/context.proto @@ -0,0 +1,18 @@ +syntax = "proto2"; + +package spotify.player.proto; + +import "context_page.proto"; +import "restrictions.proto"; + +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.context"; + +message Context { + optional string uri = 1; + optional string url = 2; + map metadata = 3; + optional Restrictions restrictions = 4; + repeated ContextPage pages = 5; + optional bool loading = 6; +} diff --git a/proto/context_page.proto b/proto/context_page.proto new file mode 100644 index 0000000..d31cf1a --- /dev/null +++ b/proto/context_page.proto @@ -0,0 +1,16 @@ +syntax = "proto2"; + +package spotify.player.proto; + +import "context_track.proto"; + +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.context"; + +message ContextPage { + optional string page_url = 1; + optional string next_page_url = 2; + map metadata = 3; + repeated ContextTrack tracks = 4; + optional bool loading = 5; +} diff --git a/proto/context_player_options.proto b/proto/context_player_options.proto new file mode 100644 index 0000000..46a091c --- /dev/null +++ b/proto/context_player_options.proto @@ -0,0 +1,18 @@ +syntax = "proto2"; + +package spotify.player.proto; + +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.context"; + +message ContextPlayerOptions { + optional bool shuffling_context = 1; + optional bool repeating_context = 2; + optional bool repeating_track = 3; +} + +message ContextPlayerOptionOverrides { + optional bool shuffling_context = 1; + optional bool repeating_context = 2; + optional bool repeating_track = 3; +} diff --git a/proto/context_track.proto b/proto/context_track.proto new file mode 100644 index 0000000..c69aee4 --- /dev/null +++ b/proto/context_track.proto @@ -0,0 +1,13 @@ +syntax = "proto2"; + +package spotify.player.proto; + +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.context"; + +message ContextTrack { + optional string uri = 1; + optional string uid = 2; + optional bytes gid = 3; + map metadata = 4; +} diff --git a/proto/explicit_content_pubsub.proto b/proto/explicit_content_pubsub.proto new file mode 100644 index 0000000..f18b48f --- /dev/null +++ b/proto/explicit_content_pubsub.proto @@ -0,0 +1,15 @@ +syntax = "proto2"; + +package spotify.explicit_content.proto; + +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.explicit"; + +message KeyValuePair { + required string key = 1; + required string value = 2; +} + +message UserAttributesUpdate { + repeated KeyValuePair pairs = 1; +} diff --git a/proto/keyexchange.proto b/proto/keyexchange.proto new file mode 100644 index 0000000..3534783 --- /dev/null +++ b/proto/keyexchange.proto @@ -0,0 +1,231 @@ +syntax = "proto2"; + +package spotify; +option java_package = "com.spotify"; + +message ClientHello { + required BuildInfo build_info = 0xa; + repeated Fingerprint fingerprints_supported = 0x14; + repeated Cryptosuite cryptosuites_supported = 0x1e; + repeated Powscheme powschemes_supported = 0x28; + required LoginCryptoHelloUnion login_crypto_hello = 0x32; + required bytes client_nonce = 0x3c; + optional bytes padding = 0x46; + optional FeatureSet feature_set = 0x50; +} + + +message BuildInfo { + required Product product = 0xa; + repeated ProductFlags product_flags = 0x14; + required Platform platform = 0x1e; + required uint64 version = 0x28; +} + +enum Product { + PRODUCT_CLIENT = 0x0; + PRODUCT_LIBSPOTIFY = 0x1; + PRODUCT_MOBILE = 0x2; + PRODUCT_PARTNER = 0x3; + PRODUCT_LIBSPOTIFY_EMBEDDED = 0x5; +} + +enum ProductFlags { + PRODUCT_FLAG_NONE = 0x0; + PRODUCT_FLAG_DEV_BUILD = 0x1; +} + +enum Platform { + PLATFORM_WIN32_X86 = 0x0; + PLATFORM_OSX_X86 = 0x1; + PLATFORM_LINUX_X86 = 0x2; + PLATFORM_IPHONE_ARM = 0x3; + PLATFORM_S60_ARM = 0x4; + PLATFORM_OSX_PPC = 0x5; + PLATFORM_ANDROID_ARM = 0x6; + PLATFORM_WINDOWS_CE_ARM = 0x7; + PLATFORM_LINUX_X86_64 = 0x8; + PLATFORM_OSX_X86_64 = 0x9; + PLATFORM_PALM_ARM = 0xa; + PLATFORM_LINUX_SH = 0xb; + PLATFORM_FREEBSD_X86 = 0xc; + PLATFORM_FREEBSD_X86_64 = 0xd; + PLATFORM_BLACKBERRY_ARM = 0xe; + PLATFORM_SONOS = 0xf; + PLATFORM_LINUX_MIPS = 0x10; + PLATFORM_LINUX_ARM = 0x11; + PLATFORM_LOGITECH_ARM = 0x12; + PLATFORM_LINUX_BLACKFIN = 0x13; + PLATFORM_WP7_ARM = 0x14; + PLATFORM_ONKYO_ARM = 0x15; + PLATFORM_QNXNTO_ARM = 0x16; + PLATFORM_BCO_ARM = 0x17; +} + +enum Fingerprint { + FINGERPRINT_GRAIN = 0x0; + FINGERPRINT_HMAC_RIPEMD = 0x1; +} + +enum Cryptosuite { + CRYPTO_SUITE_SHANNON = 0x0; + CRYPTO_SUITE_RC4_SHA1_HMAC = 0x1; +} + +enum Powscheme { + POW_HASH_CASH = 0x0; +} + + +message LoginCryptoHelloUnion { + optional LoginCryptoDiffieHellmanHello diffie_hellman = 0xa; +} + + +message LoginCryptoDiffieHellmanHello { + required bytes gc = 0xa; + required uint32 server_keys_known = 0x14; +} + + +message FeatureSet { + optional bool autoupdate2 = 0x1; + optional bool current_location = 0x2; +} + + +message APResponseMessage { + optional APChallenge challenge = 0xa; + optional UpgradeRequiredMessage upgrade = 0x14; + optional APLoginFailed login_failed = 0x1e; +} + +message APChallenge { + required LoginCryptoChallengeUnion login_crypto_challenge = 0xa; + required FingerprintChallengeUnion fingerprint_challenge = 0x14; + required PoWChallengeUnion pow_challenge = 0x1e; + required CryptoChallengeUnion crypto_challenge = 0x28; + required bytes server_nonce = 0x32; + optional bytes padding = 0x3c; +} + +message LoginCryptoChallengeUnion { + optional LoginCryptoDiffieHellmanChallenge diffie_hellman = 0xa; +} + +message LoginCryptoDiffieHellmanChallenge { + required bytes gs = 0xa; + required int32 server_signature_key = 0x14; + required bytes gs_signature = 0x1e; +} + +message FingerprintChallengeUnion { + optional FingerprintGrainChallenge grain = 0xa; + optional FingerprintHmacRipemdChallenge hmac_ripemd = 0x14; +} + + +message FingerprintGrainChallenge { + required bytes kek = 0xa; +} + + +message FingerprintHmacRipemdChallenge { + required bytes challenge = 0xa; +} + + +message PoWChallengeUnion { + optional PoWHashCashChallenge hash_cash = 0xa; +} + +message PoWHashCashChallenge { + optional bytes prefix = 0xa; + optional int32 length = 0x14; + optional int32 target = 0x1e; +} + + +message CryptoChallengeUnion { + optional CryptoShannonChallenge shannon = 0xa; + optional CryptoRc4Sha1HmacChallenge rc4_sha1_hmac = 0x14; +} + + +message CryptoShannonChallenge { +} + + +message CryptoRc4Sha1HmacChallenge { +} + + +message UpgradeRequiredMessage { + required bytes upgrade_signed_part = 0xa; + required bytes signature = 0x14; + optional string http_suffix = 0x1e; +} + +message APLoginFailed { + required ErrorCode error_code = 0xa; + optional int32 retry_delay = 0x14; + optional int32 expiry = 0x1e; + optional string error_description = 0x28; +} + +enum ErrorCode { + ProtocolError = 0x0; + TryAnotherAP = 0x2; + BadConnectionId = 0x5; + TravelRestriction = 0x9; + PremiumAccountRequired = 0xb; + BadCredentials = 0xc; + CouldNotValidateCredentials = 0xd; + AccountExists = 0xe; + ExtraVerificationRequired = 0xf; + InvalidAppKey = 0x10; + ApplicationBanned = 0x11; +} + +message ClientResponsePlaintext { + required LoginCryptoResponseUnion login_crypto_response = 0xa; + required PoWResponseUnion pow_response = 0x14; + required CryptoResponseUnion crypto_response = 0x1e; +} + + +message LoginCryptoResponseUnion { + optional LoginCryptoDiffieHellmanResponse diffie_hellman = 0xa; +} + + +message LoginCryptoDiffieHellmanResponse { + required bytes hmac = 0xa; +} + + +message PoWResponseUnion { + optional PoWHashCashResponse hash_cash = 0xa; +} + + +message PoWHashCashResponse { + required bytes hash_suffix = 0xa; +} + + +message CryptoResponseUnion { + optional CryptoShannonResponse shannon = 0xa; + optional CryptoRc4Sha1HmacResponse rc4_sha1_hmac = 0x14; +} + + +message CryptoShannonResponse { + optional int32 dummy = 0x1; +} + + +message CryptoRc4Sha1HmacResponse { + optional int32 dummy = 0x1; +} + diff --git a/proto/mercury.proto b/proto/mercury.proto new file mode 100644 index 0000000..2b8688f --- /dev/null +++ b/proto/mercury.proto @@ -0,0 +1,49 @@ +syntax = "proto2"; + +package spotify; +option java_package = "com.spotify"; + +message MercuryMultiGetRequest { + repeated MercuryRequest request = 0x1; +} + +message MercuryMultiGetReply { + repeated MercuryReply reply = 0x1; +} + +message MercuryRequest { + optional string uri = 0x1; + optional string content_type = 0x2; + optional bytes body = 0x3; + optional bytes etag = 0x4; +} + +message MercuryReply { + optional sint32 status_code = 0x1; + optional string status_message = 0x2; + optional CachePolicy cache_policy = 0x3; + enum CachePolicy { + CACHE_NO = 0x1; + CACHE_PRIVATE = 0x2; + CACHE_PUBLIC = 0x3; + } + optional sint32 ttl = 0x4; + optional bytes etag = 0x5; + optional string content_type = 0x6; + optional bytes body = 0x7; +} + + +message Header { + optional string uri = 0x01; + optional string content_type = 0x02; + optional string method = 0x03; + optional sint32 status_code = 0x04; + repeated UserField user_fields = 0x06; +} + +message UserField { + optional string key = 0x01; + optional bytes value = 0x02; +} + diff --git a/proto/metadata.proto b/proto/metadata.proto new file mode 100644 index 0000000..5fa39c1 --- /dev/null +++ b/proto/metadata.proto @@ -0,0 +1,279 @@ +syntax = "proto2"; + +package spotify.metadata.proto; + +option optimize_for = CODE_SIZE; +option java_outer_classname = "Metadata"; +option java_package = "com.spotify.metadata"; + +message Artist { + optional bytes gid = 1; + optional string name = 2; + optional sint32 popularity = 3; + repeated TopTracks top_track = 4; + repeated AlbumGroup album_group = 5; + repeated AlbumGroup single_group = 6; + repeated AlbumGroup compilation_group = 7; + repeated AlbumGroup appears_on_group = 8; + repeated string genre = 9; + repeated ExternalId external_id = 10; + repeated Image portrait = 11; + repeated Biography biography = 12; + repeated ActivityPeriod activity_period = 13; + repeated Restriction restriction = 14; + repeated Artist related = 15; + optional bool is_portrait_album_cover = 16; + optional ImageGroup portrait_group = 17; + repeated SalePeriod sale_period = 18; + repeated Availability availability = 20; +} + +message Album { + optional bytes gid = 1; + optional string name = 2; + repeated Artist artist = 3; + + optional Type type = 4; + enum Type { + ALBUM = 1; + SINGLE = 2; + COMPILATION = 3; + EP = 4; + AUDIOBOOK = 5; + PODCAST = 6; + } + + optional string label = 5; + optional Date date = 6; + optional sint32 popularity = 7; + repeated string genre = 8; + repeated Image cover = 9; + repeated ExternalId external_id = 10; + repeated Disc disc = 11; + repeated string review = 12; + repeated Copyright copyright = 13; + repeated Restriction restriction = 14; + repeated Album related = 15; + repeated SalePeriod sale_period = 16; + optional ImageGroup cover_group = 17; + optional string original_title = 18; + optional string version_title = 19; + optional string type_str = 20; + repeated Availability availability = 23; +} + +message Track { + optional bytes gid = 1; + optional string name = 2; + optional Album album = 3; + repeated Artist artist = 4; + optional sint32 number = 5; + optional sint32 disc_number = 6; + optional sint32 duration = 7; + optional sint32 popularity = 8; + optional bool explicit = 9; + repeated ExternalId external_id = 10; + repeated Restriction restriction = 11; + repeated AudioFile file = 12; + repeated Track alternative = 13; + repeated SalePeriod sale_period = 14; + repeated AudioFile preview = 15; + repeated string tags = 16; + optional int64 earliest_live_timestamp = 17; + optional bool has_lyrics = 18; + repeated Availability availability = 19; + optional Licensor licensor = 21; +} + +message Show { + optional bytes gid = 1; + optional string name = 2; + optional string description = 64; + optional sint32 deprecated_popularity = 65 [deprecated = true]; + optional string publisher = 66; + optional string language = 67; + optional bool explicit = 68; + optional ImageGroup cover_image = 69; + repeated Episode episode = 70; + repeated Copyright copyright = 71; + repeated Restriction restriction = 72; + repeated string keyword = 73; + + optional MediaType media_type = 74; + enum MediaType { + MIXED = 0; + AUDIO = 1; + VIDEO = 2; + } + + optional ConsumptionOrder consumption_order = 75; + enum ConsumptionOrder { + SEQUENTIAL = 1; + EPISODIC = 2; + RECENT = 3; + } + + repeated Availability availability = 78; + optional string trailer_uri = 83; +} + +message Episode { + optional bytes gid = 1; + optional string name = 2; + optional sint32 duration = 7; + repeated AudioFile audio = 12; + optional string description = 64; + optional sint32 number = 65; + optional Date publish_time = 66; + optional sint32 deprecated_popularity = 67 [deprecated = true]; + optional ImageGroup cover_image = 68; + optional string language = 69; + optional bool explicit = 70; + optional Show show = 71; + repeated VideoFile video = 72; + repeated VideoFile video_preview = 73; + repeated AudioFile audio_preview = 74; + repeated Restriction restriction = 75; + optional ImageGroup freeze_frame = 76; + repeated string keyword = 77; + optional bool allow_background_playback = 81; + repeated Availability availability = 82; + optional string external_url = 83; + + optional .spotify.metadata.proto.Episode.EpisodeType type = 87; + enum EpisodeType { + FULL = 0; + TRAILER = 1; + BONUS = 2; + } +} + +message Licensor { + optional bytes uuid = 1; +} + +message TopTracks { + optional string country = 1; + repeated Track track = 2; +} + +message ActivityPeriod { + optional sint32 start_year = 1; + optional sint32 end_year = 2; + optional sint32 decade = 3; +} + +message AlbumGroup { + repeated Album album = 1; +} + +message Date { + optional sint32 year = 1; + optional sint32 month = 2; + optional sint32 day = 3; + optional sint32 hour = 4; + optional sint32 minute = 5; +} + +message Image { + optional bytes file_id = 1; + + optional Size size = 2; + enum Size { + DEFAULT = 0; + SMALL = 1; + LARGE = 2; + XLARGE = 3; + } + + optional sint32 width = 3; + optional sint32 height = 4; +} + +message ImageGroup { + repeated Image image = 1; +} + +message Biography { + optional string text = 1; + repeated Image portrait = 2; + repeated ImageGroup portrait_group = 3; +} + +message Disc { + optional sint32 number = 1; + optional string name = 2; + repeated Track track = 3; +} + +message Copyright { + optional Type type = 1; + enum Type { + P = 0; + C = 1; + } + + optional string text = 2; +} + +message Restriction { + repeated Catalogue catalogue = 1; + enum Catalogue { + AD = 0; + SUBSCRIPTION = 1; + CATALOGUE_ALL = 2; + SHUFFLE = 3; + COMMERCIAL = 4; + } + + optional Type type = 4; + enum Type { + STREAMING = 0; + } + + repeated string catalogue_str = 5; + + oneof country_restriction { + string countries_allowed = 2; + string countries_forbidden = 3; + } +} + +message Availability { + repeated string catalogue_str = 1; + optional Date start = 2; +} + +message SalePeriod { + repeated Restriction restriction = 1; + optional Date start = 2; + optional Date end = 3; +} + +message ExternalId { + optional string type = 1; + optional string id = 2; +} + +message AudioFile { + optional bytes file_id = 1; + + optional Format format = 2; + enum Format { + OGG_VORBIS_96 = 0; + OGG_VORBIS_160 = 1; + OGG_VORBIS_320 = 2; + MP3_256 = 3; + MP3_320 = 4; + MP3_160 = 5; + MP3_96 = 6; + MP3_160_ENC = 7; + AAC_24 = 8; + AAC_48 = 9; + AAC_24_NORM = 16; + } +} + +message VideoFile { + optional bytes file_id = 1; +} diff --git a/proto/play_origin.proto b/proto/play_origin.proto new file mode 100644 index 0000000..9cba9aa --- /dev/null +++ b/proto/play_origin.proto @@ -0,0 +1,16 @@ +syntax = "proto2"; + +package spotify.player.proto; + +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.context"; + +message PlayOrigin { + optional string feature_identifier = 1; + optional string feature_version = 2; + optional string view_uri = 3; + optional string external_referrer = 4; + optional string referrer_identifier = 5; + optional string device_identifier = 6; + repeated string feature_classes = 7; +} diff --git a/proto/playback.proto b/proto/playback.proto new file mode 100644 index 0000000..5273aaa --- /dev/null +++ b/proto/playback.proto @@ -0,0 +1,16 @@ +syntax = "proto2"; + +package spotify.player.proto.transfer; + +import "context_track.proto"; + +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.transfer"; + +message Playback { + optional int64 timestamp = 1; + optional int32 position_as_of_timestamp = 2; + optional double playback_speed = 3; + optional bool is_paused = 4; + optional ContextTrack current_track = 5; +} diff --git a/proto/player.proto b/proto/player.proto new file mode 100644 index 0000000..44f21d4 --- /dev/null +++ b/proto/player.proto @@ -0,0 +1,102 @@ +syntax = "proto3"; + +package connectstate; + +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.connectstate"; + +message PlayerState { + int64 timestamp = 1; + string context_uri = 2; + string context_url = 3; + Restrictions context_restrictions = 4; + PlayOrigin play_origin = 5; + ContextIndex index = 6; + ProvidedTrack track = 7; + string playback_id = 8; + double playback_speed = 9; + int64 position_as_of_timestamp = 10; + int64 duration = 11; + bool is_playing = 12; + bool is_paused = 13; + bool is_buffering = 14; + bool is_system_initiated = 15; + ContextPlayerOptions options = 16; + Restrictions restrictions = 17; + Suppressions suppressions = 18; + repeated ProvidedTrack prev_tracks = 19; + repeated ProvidedTrack next_tracks = 20; + map context_metadata = 21; + map page_metadata = 22; + string session_id = 23; + string queue_revision = 24; + int64 position = 25; + string entity_uri = 26; + repeated ProvidedTrack reverse = 27; + repeated ProvidedTrack future = 28; +} + +message ProvidedTrack { + string uri = 1; + string uid = 2; + map metadata = 3; + repeated string removed = 4; + repeated string blocked = 5; + string provider = 6; + Restrictions restrictions = 7; + string album_uri = 8; + repeated string disallow_reasons = 9; + string artist_uri = 10; + repeated string disallow_undecided = 11; +} + +message ContextIndex { + uint32 page = 1; + uint32 track = 2; +} + +message Restrictions { + repeated string disallow_pausing_reasons = 1; + repeated string disallow_resuming_reasons = 2; + repeated string disallow_seeking_reasons = 3; + repeated string disallow_peeking_prev_reasons = 4; + repeated string disallow_peeking_next_reasons = 5; + repeated string disallow_skipping_prev_reasons = 6; + repeated string disallow_skipping_next_reasons = 7; + repeated string disallow_toggling_repeat_context_reasons = 8; + repeated string disallow_toggling_repeat_track_reasons = 9; + repeated string disallow_toggling_shuffle_reasons = 10; + repeated string disallow_set_queue_reasons = 11; + repeated string disallow_interrupting_playback_reasons = 12; + repeated string disallow_transferring_playback_reasons = 13; + repeated string disallow_remote_control_reasons = 14; + repeated string disallow_inserting_into_next_tracks_reasons = 15; + repeated string disallow_inserting_into_context_tracks_reasons = 16; + repeated string disallow_reordering_in_next_tracks_reasons = 17; + repeated string disallow_reordering_in_context_tracks_reasons = 18; + repeated string disallow_removing_from_next_tracks_reasons = 19; + repeated string disallow_removing_from_context_tracks_reasons = 20; + repeated string disallow_updating_context_reasons = 21; + repeated string disallow_playing_reasons = 22; + repeated string disallow_stopping_reasons = 23; +} + +message PlayOrigin { + string feature_identifier = 1; + string feature_version = 2; + string view_uri = 3; + string external_referrer = 4; + string referrer_identifier = 5; + string device_identifier = 6; + repeated string feature_classes = 7; +} + +message ContextPlayerOptions { + bool shuffling_context = 1; + bool repeating_context = 2; + bool repeating_track = 3; +} + +message Suppressions { + repeated string providers = 1; +} diff --git a/proto/playlist4_external.proto b/proto/playlist4_external.proto new file mode 100644 index 0000000..3cae12b --- /dev/null +++ b/proto/playlist4_external.proto @@ -0,0 +1,229 @@ +syntax = "proto2"; + +package spotify.playlist4.proto; + +option optimize_for = CODE_SIZE; +option java_outer_classname = "Playlist4ApiProto"; +option java_package = "com.spotify.playlist4"; + +message Item { + required string uri = 1; + optional ItemAttributes attributes = 2; +} + +message MetaItem { + optional bytes revision = 1; + optional ListAttributes attributes = 2; + optional int32 length = 3; + optional int64 timestamp = 4; + optional string owner_username = 5; +} + +message ListItems { + required int32 pos = 1; + required bool truncated = 2; + repeated Item items = 3; + repeated MetaItem meta_items = 4; +} + +message FormatListAttribute { + optional string key = 1; + optional string value = 2; +} + +message ListAttributes { + optional string name = 1; + optional string description = 2; + optional bytes picture = 3; + optional bool collaborative = 4; + optional string pl3_version = 5; + optional bool deleted_by_owner = 6; + optional string client_id = 10; + optional string format = 11; + repeated FormatListAttribute format_attributes = 12; +} + +message ItemAttributes { + optional string added_by = 1; + optional int64 timestamp = 2; + optional int64 seen_at = 9; + optional bool public = 10; + repeated FormatListAttribute format_attributes = 11; + optional bytes item_id = 12; +} + +message Add { + optional int32 from_index = 1; + repeated Item items = 2; + optional bool add_last = 4; + optional bool add_first = 5; +} + +message Rem { + optional int32 from_index = 1; + optional int32 length = 2; + repeated Item items = 3; + optional bool items_as_key = 7; +} + +message Mov { + required int32 from_index = 1; + required int32 length = 2; + required int32 to_index = 3; +} + +message ItemAttributesPartialState { + required ItemAttributes values = 1; + repeated ItemAttributeKind no_value = 2; +} + +message ListAttributesPartialState { + required ListAttributes values = 1; + repeated ListAttributeKind no_value = 2; +} + +message UpdateItemAttributes { + required int32 index = 1; + required ItemAttributesPartialState new_attributes = 2; + optional ItemAttributesPartialState old_attributes = 3; +} + +message UpdateListAttributes { + required ListAttributesPartialState new_attributes = 1; + optional ListAttributesPartialState old_attributes = 2; +} + +message Op { + required Kind kind = 1; + enum Kind { + KIND_UNKNOWN = 0; + ADD = 2; + REM = 3; + MOV = 4; + UPDATE_ITEM_ATTRIBUTES = 5; + UPDATE_LIST_ATTRIBUTES = 6; + } + + optional Add add = 2; + optional Rem rem = 3; + optional Mov mov = 4; + optional UpdateItemAttributes update_item_attributes = 5; + optional UpdateListAttributes update_list_attributes = 6; +} + +message OpList { + repeated Op ops = 1; +} + +message ChangeInfo { + optional string user = 1; + optional int64 timestamp = 2; + optional bool admin = 3; + optional bool undo = 4; + optional bool redo = 5; + optional bool merge = 6; + optional bool compressed = 7; + optional bool migration = 8; + optional int32 split_id = 9; + optional SourceInfo source = 10; +} + +message SourceInfo { + optional Client client = 1; + enum Client { + CLIENT_UNKNOWN = 0; + NATIVE_HERMES = 1; + CLIENT = 2; + PYTHON = 3; + JAVA = 4; + WEBPLAYER = 5; + LIBSPOTIFY = 6; + } + + optional string app = 3; + optional string source = 4; + optional string version = 5; +} + +message Delta { + optional bytes base_version = 1; + repeated Op ops = 2; + optional ChangeInfo info = 4; +} + +message Diff { + required bytes from_revision = 1; + repeated Op ops = 2; + required bytes to_revision = 3; +} + +message ListChanges { + optional bytes base_revision = 1; + repeated Delta deltas = 2; + optional bool want_resulting_revisions = 3; + optional bool want_sync_result = 4; + repeated int64 nonces = 6; +} + +message SelectedListContent { + optional bytes revision = 1; + optional int32 length = 2; + optional ListAttributes attributes = 3; + optional ListItems contents = 5; + optional Diff diff = 6; + optional Diff sync_result = 7; + repeated bytes resulting_revisions = 8; + optional bool multiple_heads = 9; + optional bool up_to_date = 10; + repeated int64 nonces = 14; + optional int64 timestamp = 15; + optional string owner_username = 16; +} + +message CreateListReply { + required bytes uri = 1; + optional bytes revision = 2; +} + +message ModifyReply { + required bytes uri = 1; + optional bytes revision = 2; +} + +message SubscribeRequest { + repeated bytes uris = 1; +} + +message UnsubscribeRequest { + repeated bytes uris = 1; +} + +message PlaylistModificationInfo { + optional bytes uri = 1; + optional bytes new_revision = 2; + optional bytes parent_revision = 3; + repeated Op ops = 4; +} + +enum ListAttributeKind { + LIST_UNKNOWN = 0; + LIST_NAME = 1; + LIST_DESCRIPTION = 2; + LIST_PICTURE = 3; + LIST_COLLABORATIVE = 4; + LIST_PL3_VERSION = 5; + LIST_DELETED_BY_OWNER = 6; + LIST_CLIENT_ID = 10; + LIST_FORMAT = 11; + LIST_FORMAT_ATTRIBUTES = 12; +} + +enum ItemAttributeKind { + ITEM_UNKNOWN = 0; + ITEM_ADDED_BY = 1; + ITEM_TIMESTAMP = 2; + ITEM_SEEN_AT = 9; + ITEM_PUBLIC = 10; + ITEM_FORMAT_ATTRIBUTES = 11; + ITEM_ID = 12; +} diff --git a/proto/playlist_annotate3.proto b/proto/playlist_annotate3.proto new file mode 100644 index 0000000..05f57d6 --- /dev/null +++ b/proto/playlist_annotate3.proto @@ -0,0 +1,39 @@ +syntax = "proto2"; + +package spotify_playlist_annotate3.proto; + +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.playlist_annotate3"; + +message TakedownRequest { + optional AbuseReportState abuse_report_state = 1; +} + +message AnnotateRequest { + optional string description = 1; + optional string image_uri = 2; +} + +message TranscodedPicture { + optional string target_name = 1; + optional string uri = 2; +} + +message PlaylistAnnotation { + optional string description = 1; + optional string picture = 2; + optional RenderFeatures deprecated_render_features = 3 [default = NORMAL_FEATURES, deprecated = true]; + repeated TranscodedPicture transcoded_picture = 4; + optional bool is_abuse_reporting_enabled = 6 [default = true]; + optional AbuseReportState abuse_report_state = 7 [default = OK]; +} + +enum RenderFeatures { + NORMAL_FEATURES = 1; + EXTENDED_FEATURES = 2; +} + +enum AbuseReportState { + OK = 0; + TAKEN_DOWN = 1; +} diff --git a/proto/pubsub.proto b/proto/pubsub.proto new file mode 100644 index 0000000..ef7a9da --- /dev/null +++ b/proto/pubsub.proto @@ -0,0 +1,11 @@ +syntax = "proto2"; + +package spotify; +option java_package = "com.spotify"; + +message Subscription { + optional string uri = 0x1; + optional int32 expiry = 0x2; + optional int32 status_code = 0x3; +} + diff --git a/proto/queue.proto b/proto/queue.proto new file mode 100644 index 0000000..20fd54d --- /dev/null +++ b/proto/queue.proto @@ -0,0 +1,13 @@ +syntax = "proto2"; + +package spotify.player.proto.transfer; + +import "context_track.proto"; + +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.transfer"; + +message Queue { + repeated ContextTrack tracks = 1; + optional bool is_playing_queue = 2; +} diff --git a/proto/restrictions.proto b/proto/restrictions.proto new file mode 100644 index 0000000..8718941 --- /dev/null +++ b/proto/restrictions.proto @@ -0,0 +1,30 @@ +syntax = "proto2"; + +package spotify.player.proto; + +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.context"; + +message Restrictions { + repeated string disallow_pausing_reasons = 1; + repeated string disallow_resuming_reasons = 2; + repeated string disallow_seeking_reasons = 3; + repeated string disallow_peeking_prev_reasons = 4; + repeated string disallow_peeking_next_reasons = 5; + repeated string disallow_skipping_prev_reasons = 6; + repeated string disallow_skipping_next_reasons = 7; + repeated string disallow_toggling_repeat_context_reasons = 8; + repeated string disallow_toggling_repeat_track_reasons = 9; + repeated string disallow_toggling_shuffle_reasons = 10; + repeated string disallow_set_queue_reasons = 11; + repeated string disallow_interrupting_playback_reasons = 12; + repeated string disallow_transferring_playback_reasons = 13; + repeated string disallow_remote_control_reasons = 14; + repeated string disallow_inserting_into_next_tracks_reasons = 15; + repeated string disallow_inserting_into_context_tracks_reasons = 16; + repeated string disallow_reordering_in_next_tracks_reasons = 17; + repeated string disallow_reordering_in_context_tracks_reasons = 18; + repeated string disallow_removing_from_next_tracks_reasons = 19; + repeated string disallow_removing_from_context_tracks_reasons = 20; + repeated string disallow_updating_context_reasons = 21; +} diff --git a/proto/session.proto b/proto/session.proto new file mode 100644 index 0000000..d4f202c --- /dev/null +++ b/proto/session.proto @@ -0,0 +1,17 @@ +syntax = "proto2"; + +package spotify.player.proto.transfer; + +import "context.proto"; +import "context_player_options.proto"; +import "play_origin.proto"; + +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.transfer"; + +message Session { + optional PlayOrigin play_origin = 1; + optional Context context = 2; + optional string current_uid = 3; + optional ContextPlayerOptionOverrides option_overrides = 4; +} diff --git a/proto/spotify/login5/v3/challenges/code.proto b/proto/spotify/login5/v3/challenges/code.proto new file mode 100644 index 0000000..46e6881 --- /dev/null +++ b/proto/spotify/login5/v3/challenges/code.proto @@ -0,0 +1,19 @@ +syntax = "proto3"; + +package spotify.login5.v3.challenges; +option java_package = "com.spotify.login5v3"; + +message CodeChallenge { + enum Method { + UNKNOWN = 0; + SMS = 1; + } + .spotify.login5.v3.challenges.CodeChallenge.Method method = 1; + int32 code_length = 2; + int32 expires_in = 3; + string canonical_phone_number = 4; +} + +message CodeSolution { + string code = 1; +} diff --git a/proto/spotify/login5/v3/challenges/hashcash.proto b/proto/spotify/login5/v3/challenges/hashcash.proto new file mode 100644 index 0000000..4b47a06 --- /dev/null +++ b/proto/spotify/login5/v3/challenges/hashcash.proto @@ -0,0 +1,16 @@ +syntax = "proto3"; + +package spotify.login5.v3.challenges; +option java_package = "com.spotify.login5v3"; + +import "google/protobuf/duration.proto"; + +message HashcashChallenge { + bytes prefix = 1; + int32 length = 2; +} + +message HashcashSolution { + bytes suffix = 1; + .google.protobuf.Duration duration = 2; +} diff --git a/proto/spotify/login5/v3/client_info.proto b/proto/spotify/login5/v3/client_info.proto new file mode 100644 index 0000000..cec0f68 --- /dev/null +++ b/proto/spotify/login5/v3/client_info.proto @@ -0,0 +1,9 @@ +syntax = "proto3"; + +package spotify.login5.v3; +option java_package = "com.spotify.login5v3"; + +message ClientInfo { + string client_id = 1; + string device_id = 2; +} diff --git a/proto/spotify/login5/v3/credentials/credentials.proto b/proto/spotify/login5/v3/credentials/credentials.proto new file mode 100644 index 0000000..9273e90 --- /dev/null +++ b/proto/spotify/login5/v3/credentials/credentials.proto @@ -0,0 +1,35 @@ +syntax = "proto3"; + +package spotify.login5.v3.credentials; +option java_package = "com.spotify.login5v3"; + +message StoredCredential { + string username = 1; + bytes data = 2; +} + +message Password { + string id = 1; + string password = 2; + bytes padding = 3; +} + +message FacebookAccessToken { + string fb_uid = 1; + string access_token = 2; +} + +message OneTimeToken { + string token = 1; +} + +message ParentChildCredential { + string child_id = 1; + .spotify.login5.v3.credentials.StoredCredential parent_stored_credential = 2; +} + +message AppleSignInCredential { + string auth_code = 1; + string redirect_uri = 2; + string bundle_id = 3; +} diff --git a/proto/spotify/login5/v3/identifiers/identifiers.proto b/proto/spotify/login5/v3/identifiers/identifiers.proto new file mode 100644 index 0000000..250c076 --- /dev/null +++ b/proto/spotify/login5/v3/identifiers/identifiers.proto @@ -0,0 +1,10 @@ +syntax = "proto3"; + +package spotify.login5.v3.identifiers; +option java_package = "com.spotify.login5v3"; + +message PhoneNumber { + string number = 1; + string iso_country_code = 2; + string country_calling_code = 3; +} diff --git a/proto/spotify/login5/v3/login5.proto b/proto/spotify/login5/v3/login5.proto new file mode 100644 index 0000000..f959b71 --- /dev/null +++ b/proto/spotify/login5/v3/login5.proto @@ -0,0 +1,75 @@ +syntax = "proto3"; + +package spotify.login5.v3; +option java_package = "com.spotify.login5v3"; + +import "spotify/login5/v3/client_info.proto"; +import "spotify/login5/v3/user_info.proto"; +import "spotify/login5/v3/challenges/code.proto"; +import "spotify/login5/v3/challenges/hashcash.proto"; +import "spotify/login5/v3/credentials/credentials.proto"; +import "spotify/login5/v3/identifiers/identifiers.proto"; + +enum LoginError { + UNKNOWN_ERROR = 0; + INVALID_CREDENTIALS = 1; + BAD_REQUEST = 2; + UNSUPPORTED_LOGIN_PROTOCOL = 3; + TIMEOUT = 4; + UNKNOWN_IDENTIFIER = 5; + TOO_MANY_ATTEMPTS = 6; + INVALID_PHONENUMBER = 7; + TRY_AGAIN_LATER = 8; +} + +message Challenges { + repeated .spotify.login5.v3.Challenge challenges = 1; +} + +message Challenge { + .spotify.login5.v3.challenges.HashcashChallenge hashcash = 1; + .spotify.login5.v3.challenges.CodeChallenge code = 2; +} + +message ChallengeSolutions { + repeated .spotify.login5.v3.ChallengeSolution solutions = 1; +} + +message ChallengeSolution { + .spotify.login5.v3.challenges.HashcashSolution hashcash = 1; + .spotify.login5.v3.challenges.CodeSolution code = 2; +} + +message LoginRequest { + .spotify.login5.v3.ClientInfo client_info = 1; + bytes login_context = 2; + .spotify.login5.v3.ChallengeSolutions challenge_solutions = 3; + .spotify.login5.v3.credentials.StoredCredential stored_credential = 100; + .spotify.login5.v3.credentials.Password password = 101; + .spotify.login5.v3.credentials.FacebookAccessToken facebook_access_token = 102; + .spotify.login5.v3.identifiers.PhoneNumber phone_number = 103; + .spotify.login5.v3.credentials.OneTimeToken one_time_token = 104; + .spotify.login5.v3.credentials.ParentChildCredential parent_child_credential = 105; + .spotify.login5.v3.credentials.AppleSignInCredential apple_sign_in_credential = 106; +} + +message LoginOk { + string username = 1; + string access_token = 2; + bytes stored_credential = 3; + int32 access_token_expires_in = 4; +} + +message LoginResponse { + enum Warnings { + UNKNOWN_WARNING = 0; + DEPRECATED_PROTOCOL_VERSION = 1; + } + .spotify.login5.v3.LoginOk ok = 1; + .spotify.login5.v3.LoginError error = 2; + .spotify.login5.v3.Challenges challenges = 3; + repeated .spotify.login5.v3.LoginResponse.Warnings warnings = 4; + bytes login_context = 5; + string identifier_token = 6; + .spotify.login5.v3.UserInfo user_info = 7; +} diff --git a/proto/spotify/login5/v3/user_info.proto b/proto/spotify/login5/v3/user_info.proto new file mode 100644 index 0000000..f213e4c --- /dev/null +++ b/proto/spotify/login5/v3/user_info.proto @@ -0,0 +1,21 @@ +syntax = "proto3"; + +package spotify.login5.v3; +option java_package = "com.spotify.login5v3"; + +message UserInfo { + enum Gender { + UNKNOWN = 0; + MALE = 1; + FEMALE = 2; + NEUTRAL = 3; + } + string name = 1; + string email = 2; + bool email_verified = 3; + string birthdate = 4; + .spotify.login5.v3.UserInfo.Gender gender = 5; + string phone_number = 6; + bool phone_number_verified = 7; + bool email_already_registered = 8; +} diff --git a/proto/storage-resolve.proto b/proto/storage-resolve.proto new file mode 100644 index 0000000..3fb63e4 --- /dev/null +++ b/proto/storage-resolve.proto @@ -0,0 +1,18 @@ +syntax = "proto3"; + +package spotify.download.proto; + +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.storage"; + +message StorageResolveResponse { + Result result = 1; + enum Result { + CDN = 0; + STORAGE = 1; + RESTRICTED = 3; + } + + repeated string cdnurl = 2; + bytes fileid = 4; +} diff --git a/proto/transfer_state.proto b/proto/transfer_state.proto new file mode 100644 index 0000000..ddad42f --- /dev/null +++ b/proto/transfer_state.proto @@ -0,0 +1,19 @@ +syntax = "proto2"; + +package spotify.player.proto.transfer; + +import "context_player_options.proto"; +import "playback.proto"; +import "session.proto"; +import "queue.proto"; + +option optimize_for = CODE_SIZE; +option java_package = "com.spotify.transfer"; + +message TransferState { + optional ContextPlayerOptions options = 1; + optional Playback playback = 2; + optional Session current_session = 3; + optional Queue queue = 4; + optional int64 creation_timestamp = 5; +} diff --git a/requirements.txt b/requirements.txt new file mode 100644 index 0000000..8c3f3d5 --- /dev/null +++ b/requirements.txt @@ -0,0 +1,7 @@ +defusedxml==0.7.1 +protobuf==3.20.1 +pycryptodomex==3.21.0 +pyogg==0.6.14a.1 +requests==2.32.3 +websocket-client==1.8.0 +zeroconf==0.139.0 \ No newline at end of file diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..986ef9a --- /dev/null +++ b/setup.py @@ -0,0 +1,17 @@ +import setuptools + +setuptools.setup(name="librespot", + version="0.1.0", + description="Spotizerr's python librespot implementation", + long_description=open("README.md").read(), + long_description_content_type="text/markdown", + author="Xoconoch", + url="https://github.com/Xoconoch/librespot-spotizerr", + license="Apache-2.0", + packages=setuptools.find_packages("."), + install_requires=open("requirements.txt").read().splitlines(), + classifiers=[ + "Development Status :: 1 - Planning", + "License :: OSI Approved :: Apache Software License", + "Topic :: Multimedia :: Sound/Audio" + ])