123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081 |
- from jellyfin_api_client.models import *
- from jellyfin_api_client.api.items import get_items
- from jellyfin_api_client.api.user import get_users
- from jellyfin_api_client.api.playlists import create_playlist, update_playlist
- from jellyfin_api_client.types import Response
- from jellyfin_api_client import AuthenticatedClient
- import os
- from dotenv import load_dotenv
- from pprint import pp
- load_dotenv()
- def log_response(response):
- request = response.request
- print(f"Response event hook: {request.method} {request.url} - Status {response.status_code}")
- if response.status_code >= 400:
- raise Exception(response.read())
- server_url = os.getenv('SERVER_URL')
- api_token = os.getenv('API_TOKEN')
- device = os.getenv('HOSTNAME')
- user_names = os.getenv('USER_NAMES').split()
- playlist_name = os.getenv('PLAYLIST')
- client = AuthenticatedClient(
- base_url=server_url,
- prefix="",
- token=f"MediaBrowser Client=\"jellyfin-client\", Device=\"{device}\", DeviceId=\"1234\", Version=\"1.0.0\", Token=\"{api_token}\"",
- httpx_args={"event_hooks": {"response": [log_response]}})
- with client as client:
- users = get_users.sync(client=client)
- user_ids = [user.id for user in users if user.name in user_names]
- playlists = get_items.sync(
- client=client,
- recursive=True,
- include_item_types=[BaseItemKind.PLAYLIST],
- search_term=playlist_name
- )
- songs: list[BaseItemDto] = []
- for user_id in user_ids:
- result = get_items.sync(
- client=client,
- user_id=user_ids,
- recursive=True,
- include_item_types=[BaseItemKind.AUDIO],
- limit=420,
- sort_by=[ItemSortBy.PLAYCOUNT, ItemSortBy.RANDOM])
- songs.extend([item for item in result.items if not any(s.id == item.id for s in songs)])
- try:
- playlist_id = next(p.id for p in playlists.items if p.name == playlist_name)
- body = UpdatePlaylistDto(
- name=playlist_name,
- users=[PlaylistUserPermissions(user_id=id, can_edit=True) for id in user_ids],
- ids=[item.id for item in songs],
- is_public=True
- )
- update_playlist.sync(
- playlist_id=playlist_id,
- client=client,
- body=body
- )
- except StopIteration:
- create_playlist.sync(
- client=client,
- body=CreatePlaylistDto(
- name=playlist_name,
- user_id=user_ids[0],
- users=[PlaylistUserPermissions(user_id=id, can_edit=True) for id in user_ids],
- ids=[item.id for item in songs],
- is_public=True,
- media_type=CreatePlaylistDtoMediaType.AUDIO
- )
- )
- print()
- print(f"Successfully updated playlist '{playlist_name}' with {len(songs)} songs")
|