[docs]@staticmethoddefget(identifier:str)->Query:"""Get a query object"""returnQuery(id=identifier)
[docs]asyncdeffetch_query(self,query:QueryObj)->Query|None:ifquery.is_custom_playlistorquery.is_http:# Do not cache local playlists or http source entriesreturnNonecached=self.get(query.query_identifier)returncached
[docs]@staticmethodasyncdefadd_query(query:QueryObj,result:rest_api.LoadTrackResponses)->bool:ifquery.is_custom_playlistorquery.is_http:# Do not cache local queries and single track urls or http source entriesreturnFalseifnotresultorresult.loadTypein["empty","error","apiError",None]:returnFalsematchresult.loadType:case"track":tracks=[result.data]plugin_info=result.data.pluginInfo.to_dict()ifresult.data.pluginInfoelseNonename=Noneplaylist_info=Nonecase"search":tracks=result.dataname=Noneplugin_info=Noneplaylist_info=Nonecase__:tracks=result.data.tracksplaylist_info=result.data.infoifresult.data.infoelseNonename=playlist_info.nameifplaylist_infoelseNoneplugin_info=result.data.pluginInfo.to_dict()ifresult.data.pluginInfoelseNoneifnottracks:returnFalsedefaults={QueryRow.name:name,QueryRow.pluginInfo:plugin_info,QueryRow.info:playlist_info,}query_row=awaitQueryRow.objects().get_or_create(QueryRow.identifier==query.query_identifier,defaults)# noinspection PyProtectedMemberifnotquery_row._was_created:awaitQueryRow.update(defaults).where(QueryRow.identifier==query.query_identifier)new_tracks=[]# TODO: Optimize this, after https://github.com/piccolo-orm/piccolo/discussions/683 is answered or fixedfortrackintracks:new_tracks.append(awaitTrackRow.get_or_create(track))ifnew_tracks:awaitquery_row.add_m2m(*new_tracks,m2m=QueryRow.tracks)returnTrueawaitQueryRow.delete().where(QueryRow.identifier==query.query_identifier)returnFalse
[docs]asyncdefdelete_old(self)->None:withcontextlib.suppress(asyncio.exceptions.CancelledError,asyncpg.exceptions.CannotConnectNowError):LOGGER.trace("Deleting old queries")frompylav.players.query.local_filesimportLocalFileawaitQueryRow.delete().where((QueryRow.last_updated<=(get_now_utc()-datetime.timedelta(days=30)))&(QueryRow.identifier.not_like(f"{LocalFile.root_folder}%")))LOGGER.trace("Deleted old queries")