mirror of
https://github.com/advplyr/audiobookshelf.git
synced 2026-05-30 23:40:40 +02:00
[Bug]: The device table seems to be getting endlessly populated by the iOS app Plappa #2710
Closed
opened 2026-04-25 00:09:47 +02:00 by adam
·
9 comments
No Branch/Tag Specified
master
book_tags_genres_dedupe
episode_download_fallback
Issue-4540-SortBy-StartedDate-and-FinishedDate
episode_meta_tagging
fix_authorize_race_condition
redirect_transcode_requests
progress_updated_sort
fix_ereader_socket_event
fix_change_empty_root_password
fix_podcast_session_track_index
fix_set_token
session_modal_user
localize_durations
fix_oidc_create_user
jwt_auth_refactor
fix_scanner_deleting_single_file_books
fix_mediaprogress_updatedat_2
experimental_next_client
podcast_episode_duration
episode-timestamps-clickable
book_author_secondary_sort_title
podcast_useragents
pathexists_user_access
fix_pathexists_join
book_author_secondary_sort
clean_duplicate_mediaprogress
sanitize_html_description
trix_prevent_attachments
check_path_api_fix
fix_mediaprogress_updatedat
increase_express_json_limit
fix_dockerfile_nunicode
search_episodes
audiobook_tools_update
episode_secondary_sorts
hls_stream_url_update
new_session_track_endpoint
audiobook_tools_enhancements
watcher_rescans_update
player_track_tooltip
fix_exclude_prefixes_crash
socket_item_events
fix_podcast_episode_scanner_promise
new_stats_controller
count_cache_for_userpermissions
parsing-opf-v3
validate_migration_files
fix-quick-match-all-crash
fix-chapter-end-sleep-timer
stringify_sequelize_query
remove-col-ambiguity
fix_next_prev_edit_description
details_trim_whitespace
fix_content_url_basepath
fix_logger_fatal
progress_bar_visibility
batch-edit-populate-map-details
feed_generator_updates
bookmark-modal-updates
migrate-library-item-in-scanner
migrate-new-library-items
migrate-podcasts-new-library-item-2
migrate-podcasts-new-library-item
fix-remove-episode-from-playlist
playback-session-use-new-library-item
refactor-library-item
fix-heatmap-caption
feed-episodes-upsert
share-media-player-media-session-api
remove-old-playlist
remove_old_collection_object
plugin-implementation-demo
feed_migration
refactor-feeds-from-item
fix_remove_authors_no_books
v2.17.3-fk-constraints-migration
migrations-first-upgrade
sqlite_2
feature/nuxt-target-server
waveform
sqlite
playlists
video
v2.35.1
v2.35.0
v2.34.0
v2.33.2
v2.33.1
v2.33.0
v2.32.1
v2.32.0
v2.31.0
v2.30.0
v2.29.0
v2.28.0
v2.27.0
v2.26.3
v2.26.2
v2.26.1
v2.26.0
v2.25.1
v2.25.0
v2.24.0
v2.23.0
v2.22.0
v2.21.0
v2.20.0
v2.19.5
v2.19.4
v2.19.3
v2.19.2
v2.19.1
v2.19.0
v2.18.1
v2.18.0
v2.17.7
v2.17.6
v2.17.5
v2.17.4
v2.17.3
v2.17.2
v2.17.1
v2.17.0
v2.16.2
v2.16.1
v2.16.0
v2.15.1
v2.15.0
v2.14.0
v2.13.4
v2.13.3
v2.13.2
v2.13.1
v2.13.0
v2.12.3
v2.12.2
v2.12.1
v2.12.0
v2.11.0
v2.10.1
v2.10.0
v2.9.0
v2.8.1
v2.8.0
v2.7.2
v2.7.1
v2.7.0
v2.6.0
v2.5.0
v2.4.4
v2.4.3
v2.4.2
v2.4.1
v2.4.0
v2.3.5
v2.3.4
v2.3.3
v2.3.2
v2.3.1
v2.3.0
v2.2.23
v2.2.22
v2.2.21
v2.2.20
v2.2.19
v2.2.18
v2.2.17
v2.2.16
v2.2.15
v2.2.14
v2.2.13
v2.2.12
v2.2.11
v2.2.10
v2.2.9
v2.2.8
v2.2.7
v2.2.6
v2.2.5
v2.2.4
v2.2.3
v2.2.2
v2.2.1
v2.2.0
v2.1.5
v2.1.4
v2.1.3
v2.1.2
v2.1.1
v2.1.0
v2.0.24
v2.0.23
v2.0.22
v2.0.21
v2.0.20
v2.0.19
v2.0.18
v2.0.17
v2.0.16
v2.0.15
v2.0.14
v2.0.13
v2.0.12
v2.0.11
v2.0.10
v2.0.9
v2.0.8
v2.0.7
v2.0.6
v2.0.5
v2.0.4
v2.0.3
v2.0.2
v2.0.1
v1.7.2
v1.7.1
v1.7.0
v1.6.0
v1.5.5
v1.5.0
v1.4.11
v1.4.9
v1.4.7
v1.4.6
v1.4.4
v1.4.2
v1.4.0
v1.4.1
v1.3.4
v1.3.3
v1.3.1
v1.2.8
v1.2.6
v1.2.5
v1.2.4
v1.2.1
v1.1.15
v1.1.14
v1.1.13
v1.1.12
v1.1.11
v1.1.10
v1.1.9
v1.1.8
v1.0.0
0.9.61-beta.0
0.9.61-beta
Labels
Clear labels
authentication
backlog
bug
chapter editor
config-issue
ebooks
encoding/embedding
enhancement
help wanted
listening sessions & progress
planned
possible plugin
progress sync
pull-request
sorting/filtering/searching
unable to reproduce
upload
users & permissions
waiting
Mirrored from GitHub Pull Request
No Label
bug
Milestone
No items
No Milestone
Projects
Clear projects
No project
Assignees
adam (Adam Melkus)
Clear assignees
No Assignees
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: starred/audiobookshelf#2710
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Originally created by @purple-emily on GitHub (Apr 11, 2025).
What happened?
There are 52,743 entries in my database.
There are a few "Unknown" entries listed:
What did you expect to happen?
A single entry for my phone?
Steps to reproduce the issue
Audiobookshelf version
v2.20.0
How are you running audiobookshelf?
Docker
What OS is your Audiobookshelf server hosted from?
Linux
If the issue is being seen in the UI, what browsers are you seeing the problem on?
None
Logs
Additional Notes
No response
@Vito0912 commented on GitHub (Apr 11, 2025):
Plappa is a third-party app. This problem is likely due to their approach. So this issue should be reported to plappa instead
As an app developer, if you send a session, you can pass a device ID. The device ID does not appear to be constant for Plappa, which results in additional devices being added.
@LeoKlaus commented on GitHub (Apr 11, 2025):
Plappa doesn't provide a device ID at all, so I'm assuming the random ID is generated server side.
Should the device ID be considered mandatory?
@Vito0912 commented on GitHub (Apr 11, 2025):
The ID is not mandatory. It's probably good to provide one, but there shouldn't be any direct consequences if you don't (as you see. Nobody noticed xD). Every session will create a new device, and aside from potential "performance" issues (bc growing table), there should be no problem since the device is not used for anything else (afaik).
https://github.com/advplyr/audiobookshelf/blob/26309019e74e18b53e7029560ae4c927af9c8465/server/objects/DeviceInfo.js#L93
The device ID will simply be the autogenerated ID.
TLDR: No, but it does not hurt to provide one.
@purple-emily commented on GitHub (Apr 11, 2025):
So essentially that’s what’s happening. Plappa seems to be initiating a new session every few seconds and this creates a new entry making the device table grow rapidly. @LeoKlaus
@Vito0912 commented on GitHub (Apr 11, 2025):
Thanks for pointing that out. That does look odd indeed. I haven't been paying attention to the timestamp
As far as I know, (everything from now on is speculation without actually trying), one just creates the session (with deviceId which should create a new device) and then uses the generated sessionId to update that session.
It currently looks like a new session is created every 10 seconds, which seems very odd. @purple-emily, can you look in the setting under "Recent Sessions" to see what's displayed there?
@LeoKlaus commented on GitHub (Apr 11, 2025):
Just to clarify, plappa does not create a new session every ten seconds. The session and its ID stay the same until the app is restarted or playback is stopped.
@Vito0912 commented on GitHub (Apr 11, 2025):
@LeoKlaus I installed the app in the meantime and can reproduce the same behavior.
I am not sure which API endpoints you use, but they are used somewhat differentlyI found the "issue." You use:
/api/session/local/api/me/progress/batch/update/api/authorizeThe first two are an untraditional way of doing it, but there is nothing "wrong" with this (in theory).
(Nothing to do with the actual problem, just something I defintily want to point out bc of data usage)
However, you also call
/api/authorizeevery 10 seconds. If I may ask, why is that?The authorize endpoint returns the whole user. The user contains every progress ever listened to and bookmarks.
For my user (who has been using ABS for about a year), this amounts to 284KB being sent every 10 seconds, which seems very excessive.
Regarding the first two endpoints:
Is there a reason why you used these instead of
/sync? I cannot see the payload you send as I currently do not have the right software on hand, but I assume that you are just overwriting the session (not actually updating it, if you see it that way) and thus a new device gets generated (because you probably—again, just speculation—send the session with the ID but no device, which overwrites the session and therefore a new device gets generated).Also iirc
/api/session/localupdates the progress of the items anyways. So you don't need the second api callIf you want to chat about the API, I am open to help
@LeoKlaus commented on GitHub (Apr 11, 2025):
Thank you for taking the time to look into this.
The ABS integration for plappa was kinda rushed as plappa was originally intended to only support Jellyfin and Emby. Originally, plappa only supported progress syncing and when moving towards sessions, I left in the progress sync as some parts of the app still use progress instead of sessions for progress tracking. AFAIK, the authorize endpoint is the only one that returns progress for all items at once, though loading with every sync is excessive.
Simply put, I'm looking at a lot of tech debt that would require an entire rewrite of at least the API handling, but I haven't found the time for that so far.
The sessions are posted to the
/api/session/local-allin this format:My understanding is that this should update the existing session, not create a new one. If all that's needed to fix this for now is a static device id, I could add that fairly quickly (depending on how long Apple takes to approve the update).
I'll make sure to reach out once I find the time to rewrite the API handling in plappa, there are certainly parts of the ABS api I don't quite understand.
@Vito0912 commented on GitHub (Apr 11, 2025):
It's doing both, in a way. Some code, like checking if the device exists or creating a new device, runs again, and not all attributes are updated (that's why I call it overwritten). But the way you are doing it is the intended method.
As far as I know, you just have to add "deviceId" to the "deviceInfo" object to fix the creation of devices. I imagine some users definitely have millions of devices now ^^ xD. Also, I don't think you have to be quick. As far as I understand, this has been the case since the beginning of the abs part of the app, so yeah. I am not sure how a static id would interact with different users (but having the same deviceId). Probably no problem, but who knows.
Indeed, there is sadly no nice way. This is also a big bummer for my client that I am programming. Not even all progress for one library is possible (or not even all progress without the user and bookmarks).
/api/mealso returns that data (It only returns the server and not the server details).If it's just about retrieving the new progress from the server for the listening item, there is
/api/me/progress/<LibraryItemID>to get only the progress for that item.