main.py 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. from jellyfin_api_client.models import *
  2. from jellyfin_api_client.api.items import get_items
  3. from jellyfin_api_client.api.user import get_users
  4. from jellyfin_api_client.api.playlists import create_playlist, update_playlist
  5. from jellyfin_api_client.types import Response
  6. from jellyfin_api_client import AuthenticatedClient
  7. import os
  8. from dotenv import load_dotenv
  9. from pprint import pp
  10. load_dotenv()
  11. def log_response(response):
  12. request = response.request
  13. print(f"Response event hook: {request.method} {request.url} - Status {response.status_code}")
  14. if response.status_code >= 400:
  15. raise Exception(response.read())
  16. server_url = os.getenv('SERVER_URL')
  17. api_token = os.getenv('API_TOKEN')
  18. device = os.getenv('HOSTNAME')
  19. user_names = os.getenv('USER_NAMES').split()
  20. playlist_name = os.getenv('PLAYLIST')
  21. client = AuthenticatedClient(
  22. base_url=server_url,
  23. prefix="",
  24. token=f"MediaBrowser Client=\"jellyfin-client\", Device=\"{device}\", DeviceId=\"1234\", Version=\"1.0.0\", Token=\"{api_token}\"",
  25. httpx_args={"event_hooks": {"response": [log_response]}})
  26. with client as client:
  27. users = get_users.sync(client=client)
  28. user_ids = [user.id for user in users if user.name in user_names]
  29. playlists = get_items.sync(
  30. client=client,
  31. recursive=True,
  32. include_item_types=[BaseItemKind.PLAYLIST],
  33. search_term=playlist_name
  34. )
  35. songs: list[BaseItemDto] = []
  36. for user_id in user_ids:
  37. result = get_items.sync(
  38. client=client,
  39. user_id=user_ids,
  40. recursive=True,
  41. include_item_types=[BaseItemKind.AUDIO],
  42. limit=420,
  43. sort_by=[ItemSortBy.PLAYCOUNT, ItemSortBy.RANDOM])
  44. songs.extend([item for item in result.items if not any(s.id == item.id for s in songs)])
  45. try:
  46. playlist_id = next(p.id for p in playlists.items if p.name == playlist_name)
  47. body = UpdatePlaylistDto(
  48. name=playlist_name,
  49. users=[PlaylistUserPermissions(user_id=id, can_edit=True) for id in user_ids],
  50. ids=[item.id for item in songs],
  51. is_public=True
  52. )
  53. update_playlist.sync(
  54. playlist_id=playlist_id,
  55. client=client,
  56. body=body
  57. )
  58. except StopIteration:
  59. create_playlist.sync(
  60. client=client,
  61. body=CreatePlaylistDto(
  62. name=playlist_name,
  63. user_id=user_ids[0],
  64. users=[PlaylistUserPermissions(user_id=id, can_edit=True) for id in user_ids],
  65. ids=[item.id for item in songs],
  66. is_public=True,
  67. media_type=CreatePlaylistDtoMediaType.AUDIO
  68. )
  69. )
  70. print()
  71. print(f"Successfully updated playlist '{playlist_name}' with {len(songs)} songs")