def remove(playlist_id: int) -> bool:
    """
    removes Playlist by given playlist_id
    :param playlist_id: unique int of Playlist to remove
    :return: succeed?
    """
    playlist = db_session.query(Playlist).filter(Playlist.id == playlist_id)
    if playlist is None:
        return False
    else:
        with persistance():
            db_session.query(Playlist).filter(
                Playlist.id == playlist_id).delete()
        return True
def get(p_id: int):
    """

    :param p_id: Unique Id of Playlist to get.
    :return: Playlist
    """
    return db_session.query(Playlist).get(p_id)
def all(offset: int = 0,
        limit: int = 0,
        sorted_by: str = "id",
        sort_order: str = "asc") -> List[Playlist]:
    """
    Returns all non hidden tracks in the database
    :param sort_order: Whether to sort "asc"ending or "desc"ending
    :param sorted_by: By which attribute to sort (id, playlist_name, user_name, username)
    :param offset: The e.g. id of the track to start from
    :param limit: The number of tracks to return
    :return: All non hidden tracks in the database
    """
    q = db_session.query(Playlist)

    if sorted_by == "id":
        col_order = Playlist.id
    elif sorted_by == "playlist_name":
        col_order = Playlist.name
    elif sorted_by == "username":
        col_order = Playlist.user
    else:
        col_order = Playlist.username

    if sort_order == "desc":
        q = q.order_by(desc(col_order))
    else:
        q = q.order_by(asc(col_order))

    if offset > 0:
        q = q.offset(offset)

    if limit > 0:
        q = q.limit(limit)

    return q.all()
def remove_track(playlist_id: int, track_id: int) -> bool:
    """
    removes Track by id in Playlist by id
    :param playlist_id: unique int of Playlist to remove
    :param track_id: unique int of track to remove
    :return: succeed?
    """
    playlist_track = db_session.query(PlaylistTrack). \
        filter(PlaylistTrack.playlist_id == playlist_id). \
        filter(PlaylistTrack.track_id == track_id).first()
    if playlist_track is None:
        return False

    with persistance():
        db_session.query(PlaylistTrack).filter(PlaylistTrack.id == playlist_track.id).\
                filter(PlaylistTrack.track_id == track_id).delete()
    return True
def from_user(username: str) -> List[Playlist]:
    """

    :param username: name of User to get List of Playlist from.
    :return: List of Playlist
    """
    playlist = db_session.query(Playlist).filter(
        Playlist.username == username).all()

    if playlist is None:
        return []

    return [p for p in playlist]