"""Add album to local db and return the database item."""
# grab additional metadata
await self.mass.metadata.get_album_metadata(item)
- db_item = await self.add_db_item(item)
+ existing = await self.get_db_item_by_prov_id(item.item_id, item.provider)
+ if existing:
+ db_item = await self.update_db_item(existing.item_id, item)
+ else:
+ db_item = await self.add_db_item(item)
# also fetch same album on all providers
await self._match(db_item)
+ # return final db_item after all match/metadata actions
db_item = await self.get_db_item(db_item.item_id)
- # add the album's tracks to the db
- for prov in item.provider_ids:
- for track in await self._get_provider_album_tracks(
- prov.item_id, prov.prov_type, prov.prov_id
- ):
- await self.mass.music.tracks.add_db_item(track)
+ self.mass.signal_event(
+ MassEvent(
+ EventType.MEDIA_ITEM_UPDATED
+ if existing
+ else EventType.MEDIA_ITEM_ADDED,
+ db_item.uri,
+ db_item,
+ )
+ )
return db_item
async def _get_provider_album_tracks(
item_id = new_item["item_id"]
self.logger.debug("added %s to database", item.name)
# return created object
- db_item = await self.get_db_item(item_id)
- self.mass.signal_event(
- MassEvent(EventType.MEDIA_ITEM_ADDED, db_item.uri, db_item)
- )
- return db_item
+ return await self.get_db_item(item_id)
async def update_db_item(
self,
"""Add artist to local db and return the database item."""
# grab musicbrainz id and additional metadata
await self.mass.metadata.get_artist_metadata(item)
- db_item = await self.add_db_item(item)
+ existing = await self.get_db_item_by_prov_id(item.item_id, item.provider)
+ if existing:
+ db_item = await self.update_db_item(existing.item_id, item)
+ else:
+ db_item = await self.add_db_item(item)
# also fetch same artist on all providers
await self.match_artist(db_item)
+ # return final db_item after all match/metadata actions
db_item = await self.get_db_item(db_item.item_id)
+ self.mass.signal_event(
+ MassEvent(
+ EventType.MEDIA_ITEM_UPDATED
+ if existing
+ else EventType.MEDIA_ITEM_ADDED,
+ db_item.uri,
+ db_item,
+ )
+ )
return db_item
async def match_artist(self, db_artist: Artist):
item_id = new_item["item_id"]
self.logger.debug("added %s to database", item.name)
# return created object
- db_item = await self.get_db_item(item_id)
- self.mass.signal_event(
- MassEvent(EventType.MEDIA_ITEM_ADDED, db_item.uri, db_item)
- )
- return db_item
+ return await self.get_db_item(item_id)
async def update_db_item(
self,
"""Add playlist to local db and return the new database item."""
item.metadata.last_refresh = int(time())
await self.mass.metadata.get_playlist_metadata(item)
- return await self.add_db_item(item)
+ existing = await self.get_db_item_by_prov_id(item.item_id, item.provider)
+ if existing:
+ db_item = await self.update_db_item(existing.item_id, item)
+ else:
+ db_item = await self.add_db_item(item)
+ self.mass.signal_event(
+ MassEvent(
+ EventType.MEDIA_ITEM_UPDATED
+ if existing
+ else EventType.MEDIA_ITEM_ADDED,
+ db_item.uri,
+ db_item,
+ )
+ )
+ return db_item
async def create(
self, name: str, prov_id: Union[ProviderType, str, None] = None
item_id = new_item["item_id"]
self.logger.debug("added %s to database", item.name)
# return created object
- db_item = await self.get_db_item(item_id)
- self.mass.signal_event(
- MassEvent(EventType.MEDIA_ITEM_ADDED, db_item.uri, db_item)
- )
- return db_item
+ return await self.get_db_item(item_id)
async def update_db_item(
self,
"""Add radio to local db and return the new database item."""
item.metadata.last_refresh = int(time())
await self.mass.metadata.get_radio_metadata(item)
- return await self.add_db_item(item)
+ existing = await self.get_db_item_by_prov_id(item.item_id, item.provider)
+ if existing:
+ db_item = await self.update_db_item(existing.item_id, item)
+ else:
+ db_item = await self.add_db_item(item)
+ self.mass.signal_event(
+ MassEvent(
+ EventType.MEDIA_ITEM_UPDATED
+ if existing
+ else EventType.MEDIA_ITEM_ADDED,
+ db_item.uri,
+ db_item,
+ )
+ )
+ return db_item
async def add_db_item(self, item: Radio, overwrite_existing: bool = False) -> Radio:
"""Add a new item record to the database."""
item_id = new_item["item_id"]
self.logger.debug("added %s to database", item.name)
# return created object
- db_item = await self.get_db_item(item_id)
- self.mass.signal_event(
- MassEvent(EventType.MEDIA_ITEM_ADDED, db_item.uri, db_item)
- )
- return db_item
+ return await self.get_db_item(item_id)
async def update_db_item(
self,
assert item.artists
# grab additional metadata
await self.mass.metadata.get_track_metadata(item)
- db_item = await self.add_db_item(item)
+ existing = await self.get_db_item_by_prov_id(item.item_id, item.provider)
+ if existing:
+ db_item = await self.update_db_item(existing.item_id, item)
+ else:
+ db_item = await self.add_db_item(item)
# also fetch same track on all providers (will also get other quality versions)
await self._match(db_item)
- return await self.get_db_item(db_item.item_id)
+ # return final db_item after all match/metadata actions
+ db_item = await self.get_db_item(db_item.item_id)
+ self.mass.signal_event(
+ MassEvent(
+ EventType.MEDIA_ITEM_UPDATED
+ if existing
+ else EventType.MEDIA_ITEM_ADDED,
+ db_item.uri,
+ db_item,
+ )
+ )
+ return db_item
async def versions(
self,
item_id = new_item["item_id"]
# return created object
self.logger.debug("added %s to database: %s", item.name, item_id)
- db_item = await self.get_db_item(item_id)
- self.mass.signal_event(
- MassEvent(EventType.MEDIA_ITEM_ADDED, db_item.uri, db_item)
- )
- return db_item
+ return await self.get_db_item(item_id)
async def update_db_item(
self,
"""Signal event to subscribers."""
if self.closed:
return
+ if self.logger.isEnabledFor(logging.DEBUG):
+ self.logger.getChild("event").debug(
+ "%s %s", event.type.value, event.object_id or ""
+ )
for cb_func, event_filter, id_filter in self._listeners:
if not (event_filter is None or event.type in event_filter):
continue