Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[ISSUE] Large playlists cause invalid response from alexa skill #38

Open
iCanHazSkillz opened this issue Apr 10, 2024 · 3 comments
Open
Labels
enhancement New feature or request

Comments

@iCanHazSkillz
Copy link

Describe the issue
Attempting to play playlist with a large number of songs (>110 from my test) causes alexa to respond with "The requested skill did not provide a valid response.". Decreasing the amount of songs to less than 110 tracks seems to resolve the issue.

Operating System
Ubuntu x64

To Reproduce
Add over 110 tracks to a playlist in navidrome. Attempt to play the playlist using asknavidrome

Logs
2024-04-10 21:08:46,132 - root - DEBUG - Request received: {'dialog_state': None,
'intent': {'confirmation_status': 'NONE',
'name': 'NaviSonicPlayPlaylist',
'slots': {'playlist': {'confirmation_status': 'NONE',
'name': 'playlist',
'resolutions': {'resolutions_per_authority': [{'authority': 'amzn1.er-authority.echo-sdk.amzn1.ask.skill.8e07a780-22a1-4959-8591-61548821b8ea.playlist_names',
'status': {'code': 'ER_SUCCESS_MATCH'},
'values': [{'value': {'id': '4733a44073c81970cccbca6e1ede188b',
'name': 'Sara'}}]}]},
'slot_value': {'object_type': 'Simple',
'resolutions': {'resolutions_per_authority': [{'authority': 'amzn1.er-authority.echo-sdk.amzn1.ask.skill.8e07a780-22a1-4959-8591-61548821b8ea.playlist_names',
'status': {'code': 'ER_SUCCESS_MATCH'},
'values': [{'value': {'id': '4733a44073c81970cccbca6e1ede188b',
'name': 'Sara'}}]}]},
'value': 'Sara'},
'value': 'Sara'}}},
'locale': 'en-CA',
'object_type': 'IntentRequest',
'request_id': 'amzn1.echo-api.request.4eb5df70-97c2-4feb-98fc-2715d90cecc0',
'timestamp': datetime.datetime(2024, 4, 10, 21, 8, 45, tzinfo=tzlocal())}
2024-04-10 21:08:46,132 - root - DEBUG - In NaviSonicPlayPlaylist
2024-04-10 21:08:46,132 - asknavidrome.subsonic_api - DEBUG - In function search_playlist()
2024-04-10 21:08:46,191 - asknavidrome.subsonic_api - DEBUG - Found playlist 8bd66b50-fb72-4451-965e-6245196f6f51
2024-04-10 21:08:46,191 - asknavidrome.subsonic_api - DEBUG - In function build_song_list_from_playlist()
2024-04-10 21:08:46,257 - asknavidrome.media_queue - DEBUG - In clear()
2024-04-10 21:08:46,257 - asknavidrome.subsonic_api - DEBUG - In function get_song_details()
2024-04-10 21:08:46,309 - asknavidrome.subsonic_api - DEBUG - In function get_song_uri()
2024-04-10 21:08:46,309 - asknavidrome.media_queue - DEBUG - In add_track()
2024-04-10 21:08:46,309 - asknavidrome.media_queue - DEBUG - In add_track() - there are 1 tracks in the queue
2024-04-10 21:08:46,309 - asknavidrome.subsonic_api - DEBUG - In function get_song_details()
2024-04-10 21:08:46,362 - asknavidrome.subsonic_api - DEBUG - In function get_song_uri()
2024-04-10 21:08:46,362 - asknavidrome.media_queue - DEBUG - In add_track()
2024-04-10 21:08:46,362 - asknavidrome.media_queue - DEBUG - In add_track() - there are 2 tracks in the queue
2024-04-10 21:08:46,362 - asknavidrome.subsonic_api - DEBUG - In function get_song_details()
2024-04-10 21:08:46,417 - asknavidrome.subsonic_api - DEBUG - In function get_song_uri()
2024-04-10 21:08:46,417 - asknavidrome.media_queue - DEBUG - In add_track()
2024-04-10 21:08:46,417 - asknavidrome.media_queue - DEBUG - In add_track() - there are 3 tracks in the queue
2024-04-10 21:08:46,417 - asknavidrome.subsonic_api - DEBUG - In function get_song_details()
2024-04-10 21:08:46,472 - asknavidrome.subsonic_api - DEBUG - In function get_song_uri()
2024-04-10 21:08:46,472 - asknavidrome.media_queue - DEBUG - In add_track()
2024-04-10 21:08:46,472 - asknavidrome.media_queue - DEBUG - In add_track() - there are 4 tracks in the queue
2024-04-10 21:08:46,472 - asknavidrome.subsonic_api - DEBUG - In function get_song_details()
2024-04-10 21:08:46,532 - asknavidrome.subsonic_api - DEBUG - In function get_song_uri()
2024-04-10 21:08:46,532 - asknavidrome.media_queue - DEBUG - In add_track()
2024-04-10 21:08:46,532 - asknavidrome.media_queue - DEBUG - In add_track() - there are 5 tracks in the queue
...
2024-04-10 21:08:56,912 - asknavidrome.media_queue - DEBUG - In add_track() - there are 162 tracks in the queue
2024-04-10 21:08:56,912 - asknavidrome.media_queue - DEBUG - In shuffle()
2024-04-10 21:08:56,919 - root - INFO - Playing playlist Sara on home mix.
2024-04-10 21:08:56,919 - asknavidrome.media_queue - DEBUG - In get_next_track()
2024-04-10 21:08:56,927 - asknavidrome.controller - DEBUG - In start_playback() - play mode
2024-04-10 21:08:56,927 - asknavidrome.controller - DEBUG - In add_screen_background()
2024-04-10 21:08:56,927 - asknavidrome.controller - DEBUG - Track ID: 53f615c638f2f8a794d6d220c5da5bf3
2024-04-10 21:08:56,927 - asknavidrome.controller - DEBUG - Track Previous ID: bb027c320bff8ed94d24f0e284fb9998
2024-04-10 21:08:56,927 - asknavidrome.controller - INFO - Playing track: Walla Walla by: The Offspring
2024-04-10 21:08:56,929 - root - DEBUG - Response sent: {'api_response': None,
'can_fulfill_intent': None,
'card': {'image': None,
'object_type': 'Standard',
'text': 'Playing playlist Sara on home mix.',
'title': 'AskNavidrome'},
'directives': [{'audio_item': {'metadata': {'art': {'content_description': 'AskNavidrome',
'sources': [{'height_pixels': None,
'size': None,
'url': 'https://github.com/navidrome/navidrome/raw/master/resources/logo-192x192.png',
'width_pixels': None}]},
'background_image': {'content_description': 'AskNavidrome',
'sources': [{'height_pixels': None,
'size': None,
'url': 'https://github.com/navidrome/navidrome/raw/master/resources/logo-192x192.png',
'width_pixels': None}]},
'subtitle': 'Playing playlist '
'Sara on home mix.',
'title': 'AskNavidrome'},
'stream': {'caption_data': None,
'expected_previous_token': None,
'offset_in_milliseconds': 0,
'token': '53f615c638f2f8a794d6d220c5da5bf3',
'url': 'https://homemix.duckdns.org:443/rest/stream.view?f=json&v=1.16.1&c=AskNavidrome&u=michel&s=93782897be156e6555b9e9de36281a44&t=f78a6a83206c9015f3298a5394f84b1c&id=53f615c638f2f8a794d6d220c5da5bf3'}},
'object_type': 'AudioPlayer.Play',
'play_behavior': 'REPLACE_ALL'}],
'experimentation': None,
'output_speech': {'object_type': 'SSML',
'play_behavior': None,
'ssml': 'Playing playlist Sara on home mix.'},
'reprompt': None,
'should_end_session': True}
2024-04-10 21:08:56,930 - werkzeug - INFO - 192.168.0.163 - - [10/Apr/2024 21:08:56] "POST / HTTP/1.0" 200 -
2024-04-10 21:08:57,100 - root - DEBUG - Request received: {'error': {'message': 'An exception occurred while dispatching the request to '
'the skill.',
'object_type': 'INVALID_RESPONSE'},
'locale': 'en-CA',
'object_type': 'SessionEndedRequest',
'reason': 'ERROR',
'request_id': 'amzn1.echo-api.request.ec86dfc8-89a5-43e1-8f77-dfe4c5bc0cfe',
'timestamp': datetime.datetime(2024, 4, 10, 21, 8, 56, tzinfo=tzlocal())}
2024-04-10 21:08:57,100 - root - DEBUG - In SkillEventHandler
2024-04-10 21:08:57,100 - root - DEBUG - Response sent: {'api_response': None,
'can_fulfill_intent': None,
'card': None,
'directives': None,
'experimentation': None,
'output_speech': None,
'reprompt': None,
'should_end_session': None}
2024-04-10 21:08:57,101 - werkzeug - INFO - 192.168.0.163 - - [10/Apr/2024 21:08:57] "POST / HTTP/1.0" 200 -
michel@homeflix:$ ^C
michel@homeflix:
$

Comments
I've attempted to play around with a small (50) and large (200) NAVI_SONG_COUNT variable but this did not change the behavior. I would honestly be happy if only a limited number of random songs were queue'd from the playlist and not the full playlist if this is a limitation from amazon, but being limited to a small playlist is a major inconvenience.

@iCanHazSkillz
Copy link
Author

iCanHazSkillz commented Apr 12, 2024

If anyone runs into this issue, I fixed it by modifying the build_song_list_from_playlist() method from subsonic_api.py

def build_song_list_from_playlist(self, id: str) -> list:
    """Build a list of songs from a given playlist

    :param str id: The playlist ID
    :return: A list of song IDs
    :rtype: list
    """

    self.logger.debug('In function build_song_list_from_playlist()')

    song_id_list = []
    playlist_details = self.conn.getPlaylist(id)

    song_id_list = [song_detail.get('id') for song_detail in playlist_details.get('playlist').get('entry')]

    if len(song_id_list) > 80:
        song_id_list = random.sample(song_id_list, k=80)

    return song_id_list

The modification lies within this specific if statement:

    if len(song_id_list) > 80:
        song_id_list = random.sample(song_id_list, k=80)

What does it do:
If the playlist is larger than a predetermined amount (80 in my case to be safe) then a random sample of 80 songs is selected from the whole playlist - the rest is dropped. Using this modified method, asknavidrome can now process very large playlists and the random sample ensures you're given a different sample of songs each time it's invoked. Works for me - yay!

I'll leave this issue open in case the author wants to incorporate my changes - otherwise feel free to implement them yourselves. =)

@rosskouk
Copy link
Owner

Thanks for posting your solution, I'll see how this can be integrated into the skill at the next release

@rosskouk rosskouk added the enhancement New feature or request label Apr 12, 2024
@Raul824
Copy link

Raul824 commented Apr 13, 2024

I faced this issue but found a workaround. So basically it is able to build the queue but not able to play it even though the queue is huge.
Then in second voice command you ask alexa to launch the ask navidrome and when it's ready you say resume.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

No branches or pull requests

3 participants