@@ 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
@@ 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)