~minus/stewdio-api

63393fa80a7705a02649ddefe90b25d86d534ea0 — minus 4 years ago cc42146
Update API with song context

Makes the previous commit work from the API
3 files changed, 22 insertions(+), 5 deletions(-)

M stewdio/app.py
M stewdio/search/__init__.py
M stewdio/search/parse_test.py
M stewdio/app.py => stewdio/app.py +19 -4
@@ 21,7 21,7 @@ from . import pubsub
from . import tagging
from . import types
from .misc import json_api, with_pg_cursor, with_db_session, db_session
from .search import search as search_internal, get_random
from .search import search as search_internal, get_random, Context as SearchContext
from .user import api as user_api, find_user_by_api_key

L = logging.getLogger("stewdio.app")


@@ 58,14 58,20 @@ def requires_api_key_if_user_has_password(fn):
@with_pg_cursor
@json_api
def search(q, cur):
	return search_internal(cur, q, limit=int(flask.request.args.get("limit", 0)) or None)
	limit = int(flask.request.args.get("limit", 0)) or None
	with db_session() as session:
		context = get_np_context(session)
	return search_internal(cur, context, q, limit=limit)

@app.route("/api/search")
@with_pg_cursor
@json_api
def search2(cur):
	q = flask.request.args['q']
	return search_internal(cur, q, limit=int(flask.request.args.get("limit", 0)) or None)
	limit = int(flask.request.args.get("limit", 0)) or None
	with db_session() as session:
		context = get_np_context(session)
	return search_internal(cur, context, q, limit=limit)

@app.route("/api/random")
@with_pg_cursor


@@ 108,7 114,9 @@ def request_favorite(session, username, num=1):
@with_pg_cursor
@json_api
def request_random(terms, cur):
	songs = search_internal(cur, terms)
	with db_session() as session:
		context = get_np_context(session)
	songs = search_internal(cur, context, terms)
	if not songs:
		return flask.Response(status=404)
	song = random.choice(songs)


@@ 335,6 343,13 @@ def get_np_json(session):
	np['started'] = hist.play_time.timestamp()
	return np

def get_np_context(session):
	song = get_np_song(session)
	return SearchContext(
		artist=song.artist.name,
		album=song.album.name,
	)

@app.route("/admin/library/update", methods=["POST"])
@with_db_session
@json_api

M stewdio/search/__init__.py => stewdio/search/__init__.py +1 -0
@@ 1,3 1,4 @@
#!/usr/bin/env python3

from .query import search, search_favorites, get_random
from .ast import Context

M stewdio/search/parse_test.py => stewdio/search/parse_test.py +2 -1
@@ 25,7 25,8 @@ cases = (
    ('''#op @minus''', And(Qualified('tag', String('op')), Qualified('fav', String('minus'))), None, None),
    ('''@minus''', Qualified('fav', String('minus')), Composed([SQL('EXISTS('), SQL('SELECT 1 FROM users JOIN favorites ON (favorites.user_id = users.id) WHERE favorites.song = songs.id AND users.name = '), Composed([SQL('lower('), Literal('minus'), SQL(')')]), SQL(')')]), None),
    ('''duration>10 AND duration<500''', And(Qualified('duration', String('10'), op=Ops.GREATER_THAN), Qualified('duration', String('500'), op=Ops.LESS_THAN)), None, None),
    ('''$album''', Variable('album'), Composed([SQL('albums.name'), SQL(' ILIKE '), Literal('test album')]), Context(album='test album'))
    ('''$album''', Variable('album'), Composed([SQL('albums.name'), SQL(' ILIKE '), Literal('test album')]), Context(album='test album')),
    ('''title=test $album''', And(Qualified('title', String('test'), op=Ops.EQUALS), Variable('album')), Composed([SQL('('), SQL('songs.title'), SQL(' ILIKE '), Literal('test'), SQL(' AND '), SQL('albums.name'), SQL(' ILIKE '), Literal('test album'), SQL(')')]), Context(album='test album')),
)

@pytest.mark.parametrize('input,expected_ast,expected_sql,context', cases)