{"database": "media", "private": false, "path": "/media", "size": 7946240, "tables": [{"name": "actress_aliases", "columns": ["a_uid", "aliasKey", "alias"], "primary_keys": ["aliasKey", "a_uid"], "count": 2473, "hidden": false, "fts_table": null, "foreign_keys": {"incoming": [], "outgoing": [{"other_table": "actresses", "column": "a_uid", "other_column": "uid"}]}, "private": false}, {"name": "actresses", "columns": ["uid", "name", "nameJa", "nameKey", "alias", "image", "createdAt", "updatedAt"], "primary_keys": ["uid"], "count": 860, "hidden": false, "fts_table": null, "foreign_keys": {"incoming": [{"other_table": "actress_aliases", "column": "uid", "other_column": "a_uid"}, {"other_table": "video_star", "column": "uid", "other_column": "a_uid"}, {"other_table": "actresses_top", "column": "uid", "other_column": "a_uid"}], "outgoing": []}, "private": false}, {"name": "actresses_top", "columns": ["a_uid", "rank"], "primary_keys": ["rank"], "count": 0, "hidden": false, "fts_table": null, "foreign_keys": {"incoming": [], "outgoing": [{"other_table": "actresses", "column": "a_uid", "other_column": "uid"}]}, "private": false}, {"name": "categories", "columns": ["uid", "name", "nameJa", "nameKey", "createdAt", "updatedAt"], "primary_keys": ["uid"], "count": 215, "hidden": false, "fts_table": null, "foreign_keys": {"incoming": [{"other_table": "video_category", "column": "uid", "other_column": "c_uid"}], "outgoing": []}, "private": false}, {"name": "directors", "columns": ["uid", "name", "nameJa", "nameKey", "createdAt", "updatedAt"], "primary_keys": ["uid"], "count": 148, "hidden": false, "fts_table": null, "foreign_keys": {"incoming": [{"other_table": "video_director", "column": "uid", "other_column": "d_uid"}], "outgoing": []}, "private": false}, {"name": "labels", "columns": ["uid", "name", "nameJa", "nameKey", "createdAt", "updatedAt"], "primary_keys": ["uid"], "count": 161, "hidden": false, "fts_table": null, "foreign_keys": {"incoming": [{"other_table": "video_label", "column": "uid", "other_column": "l_uid"}], "outgoing": []}, "private": false}, {"name": "makers", "columns": ["uid", "name", "nameJa", "nameKey", "createdAt", "updatedAt"], "primary_keys": ["uid"], "count": 144, "hidden": false, "fts_table": null, "foreign_keys": {"incoming": [{"other_table": "video_maker", "column": "uid", "other_column": "m_uid"}], "outgoing": []}, "private": false}, {"name": "series", "columns": ["uid", "name", "nameJa", "nameKey", "createdAt", "updatedAt"], "primary_keys": ["uid"], "count": 208, "hidden": false, "fts_table": null, "foreign_keys": {"incoming": [{"other_table": "videos", "column": "uid", "other_column": "s_uid"}], "outgoing": []}, "private": false}, {"name": "streams", "columns": ["id", "v_uid", "source", "sourceUrl", "embedUrl", "proxyUrl", "directLink", "kind", "addedAt", "updatedAt", "dedupe"], "primary_keys": ["id"], "count": 10538, "hidden": false, "fts_table": null, "foreign_keys": {"incoming": [], "outgoing": [{"other_table": "videos", "column": "v_uid", "other_column": "uid"}]}, "private": false}, {"name": "video_category", "columns": ["v_uid", "c_uid"], "primary_keys": ["v_uid", "c_uid"], "count": 3260, "hidden": false, "fts_table": null, "foreign_keys": {"incoming": [], "outgoing": [{"other_table": "categories", "column": "c_uid", "other_column": "uid"}, {"other_table": "videos", "column": "v_uid", "other_column": "uid"}]}, "private": false}, {"name": "video_director", "columns": ["v_uid", "d_uid"], "primary_keys": ["v_uid", "d_uid"], "count": 264, "hidden": false, "fts_table": null, "foreign_keys": {"incoming": [], "outgoing": [{"other_table": "directors", "column": "d_uid", "other_column": "uid"}, {"other_table": "videos", "column": "v_uid", "other_column": "uid"}]}, "private": false}, {"name": "video_gallery", "columns": ["v_uid", "position", "fullUrl", "thumbUrl"], "primary_keys": ["v_uid", "position"], "count": 7626, "hidden": false, "fts_table": null, "foreign_keys": {"incoming": [], "outgoing": [{"other_table": "videos", "column": "v_uid", "other_column": "uid"}]}, "private": false}, {"name": "video_label", "columns": ["v_uid", "l_uid"], "primary_keys": ["v_uid", "l_uid"], "count": 488, "hidden": false, "fts_table": null, "foreign_keys": {"incoming": [], "outgoing": [{"other_table": "labels", "column": "l_uid", "other_column": "uid"}, {"other_table": "videos", "column": "v_uid", "other_column": "uid"}]}, "private": false}, {"name": "video_maker", "columns": ["v_uid", "m_uid"], "primary_keys": ["v_uid", "m_uid"], "count": 519, "hidden": false, "fts_table": null, "foreign_keys": {"incoming": [], "outgoing": [{"other_table": "makers", "column": "m_uid", "other_column": "uid"}, {"other_table": "videos", "column": "v_uid", "other_column": "uid"}]}, "private": false}, {"name": "video_star", "columns": ["v_uid", "a_uid"], "primary_keys": ["v_uid", "a_uid"], "count": 1122, "hidden": false, "fts_table": null, "foreign_keys": {"incoming": [], "outgoing": [{"other_table": "actresses", "column": "a_uid", "other_column": "uid"}, {"other_table": "videos", "column": "v_uid", "other_column": "uid"}]}, "private": false}, {"name": "videos", "columns": ["uid", "code", "titleEn", "titleJa", "descriptionEn", "descriptionJa", "jacketFullUrl", "jacketThumbUrl", "sampleUrl", "runtimeMins", "releaseDate", "s_uid", "createdAt", "updatedAt"], "primary_keys": ["uid"], "count": 1860, "hidden": false, "fts_table": null, "foreign_keys": {"incoming": [{"other_table": "video_star", "column": "uid", "other_column": "v_uid"}, {"other_table": "video_category", "column": "uid", "other_column": "v_uid"}, {"other_table": "video_maker", "column": "uid", "other_column": "v_uid"}, {"other_table": "video_label", "column": "uid", "other_column": "v_uid"}, {"other_table": "video_director", "column": "uid", "other_column": "v_uid"}, {"other_table": "video_gallery", "column": "uid", "other_column": "v_uid"}, {"other_table": "streams", "column": "uid", "other_column": "v_uid"}, {"other_table": "videos_top", "column": "uid", "other_column": "v_uid"}], "outgoing": [{"other_table": "series", "column": "s_uid", "other_column": "uid"}]}, "private": false}, {"name": "videos_top", "columns": ["v_uid", "period", "rank"], "primary_keys": ["period", "rank"], "count": 0, "hidden": false, "fts_table": null, "foreign_keys": {"incoming": [], "outgoing": [{"other_table": "videos", "column": "v_uid", "other_column": "uid"}]}, "private": false}], "hidden_count": 0, "views": [], "queries": [{"sql": "SELECT\n  v.uid,\n  v.code,\n  v.titleEn,\n  v.titleJa,\n  v.descriptionEn,\n  v.descriptionJa,\n  v.jacketFullUrl,\n  v.jacketThumbUrl,\n  v.sampleUrl,\n  v.runtimeMins,\n  v.releaseDate,\n  v.createdAt,\n  v.updatedAt,\n\n  se.uid  AS seriesUid,\n  se.name AS series,\n\n  json((\n    SELECT json_group_array(\n      json_object('uid', a.uid, 'name', a.name, 'image', a.image)\n    )\n    FROM video_star vs\n    JOIN actresses a ON a.uid = vs.a_uid\n    WHERE vs.v_uid = v.uid\n  )) AS actresses,\n\n  json((\n    SELECT json_group_array(json_object('uid', m.uid, 'name', m.name))\n    FROM video_maker vm\n    JOIN makers m ON m.uid = vm.m_uid\n    WHERE vm.v_uid = v.uid\n  )) AS makers,\n\n  json((\n    SELECT json_group_array(json_object('uid', l.uid, 'name', l.name))\n    FROM video_label vl\n    JOIN labels l ON l.uid = vl.l_uid\n    WHERE vl.v_uid = v.uid\n  )) AS labels,\n\n  json((\n    SELECT json_group_array(json_object('uid', d.uid, 'name', d.name))\n    FROM video_director vd\n    JOIN directors d ON d.uid = vd.d_uid\n    WHERE vd.v_uid = v.uid\n  )) AS directors,\n\n  json((\n    SELECT json_group_array(json_object('uid', c.uid, 'name', c.name))\n    FROM video_category vc\n    JOIN categories c ON c.uid = vc.c_uid\n    WHERE vc.v_uid = v.uid\n  )) AS categories,\n\n  -- The ORDER BY has to be INSIDE the subquery. A trailing one would\n  -- order the aggregate's single output row rather than the stills\n  -- being aggregated, and the gallery would come back shuffled.\n  json((\n    SELECT json_group_array(u) FROM (\n      SELECT g.fullUrl AS u FROM video_gallery g\n      WHERE g.v_uid = v.uid AND g.fullUrl IS NOT NULL\n      ORDER BY g.position\n    )\n  )) AS galleryFull,\n\n  json((\n    SELECT json_group_array(u) FROM (\n      SELECT g.thumbUrl AS u FROM video_gallery g\n      WHERE g.v_uid = v.uid AND g.thumbUrl IS NOT NULL\n      ORDER BY g.position\n    )\n  )) AS galleryThumb,\n\n  json((\n    SELECT json_group_array(\n      json_object(\n        'id', s.id,\n        'source', s.source,\n        'sourceUrl', s.sourceUrl,\n        'embedUrl', s.embedUrl,\n        'proxyUrl', s.proxyUrl,\n        'directLink', s.directLink,\n        'kind', s.kind\n      )\n    )\n    FROM streams s WHERE s.v_uid = v.uid\n  )) AS streams,\n\n  (SELECT count(*) FROM streams s WHERE s.v_uid = v.uid) AS streamCount\n\nFROM videos v\nLEFT JOIN series se ON se.uid = v.s_uid\nWHERE (:uid  != '' AND v.uid  = :uid)\n   OR (:code != '' AND v.code = upper(:code))", "parameters": [{"name": "uid", "default": ""}, {"name": "code", "default": ""}], "allow": {"unauthenticated": true}, "name": "get_video", "private": false}, {"sql": "SELECT\n  v.uid,\n  v.code,\n  v.titleEn,\n  v.titleJa,\n  v.jacketFullUrl,\n  v.jacketThumbUrl,\n  v.runtimeMins,\n  v.releaseDate,\n  v.createdAt,\n\n  se.uid  AS seriesUid,\n  se.name AS series,\n\n  json((\n    SELECT json_group_array(\n      json_object('uid', a.uid, 'name', a.name, 'image', a.image)\n    )\n    FROM video_star vs\n    JOIN actresses a ON a.uid = vs.a_uid\n    WHERE vs.v_uid = v.uid\n  )) AS actresses,\n\n  json((\n    SELECT json_group_array(json_object('uid', m.uid, 'name', m.name))\n    FROM video_maker vm\n    JOIN makers m ON m.uid = vm.m_uid\n    WHERE vm.v_uid = v.uid\n  )) AS makers,\n\n  json((\n    SELECT json_group_array(json_object('uid', c.uid, 'name', c.name))\n    FROM video_category vc\n    JOIN categories c ON c.uid = vc.c_uid\n    WHERE vc.v_uid = v.uid\n  )) AS categories,\n\n  (SELECT count(*) FROM streams s WHERE s.v_uid = v.uid) AS streamCount\n\nFROM videos v\nLEFT JOIN series se ON se.uid = v.s_uid\n\nWHERE\n  (\n    :q = ''\n    OR lower(v.code)    LIKE '%' || lower(:q) || '%'\n    OR lower(v.titleEn) LIKE '%' || lower(:q) || '%'\n    OR lower(v.titleJa) LIKE '%' || lower(:q) || '%'\n  )\n\n  AND (:series = '' OR v.s_uid = :series)\n\n  -- Only videos that can actually be watched. Off by default: a\n  -- catalogue entry with no link yet is still a real record, and\n  -- hiding it by default would make every count disagree with the\n  -- table it came from.\n  AND (\n    :has_stream = ''\n    OR EXISTS (SELECT 1 FROM streams s WHERE s.v_uid = v.uid)\n  )\n\n  AND (\n    :actress = ''\n    OR EXISTS (\n      SELECT 1 FROM video_star vs\n      WHERE vs.v_uid = v.uid\n        AND ',' || :actress || ',' LIKE '%,' || vs.a_uid || ',%'\n    )\n  )\n\n  AND (\n    :maker = ''\n    OR EXISTS (\n      SELECT 1 FROM video_maker vm\n      WHERE vm.v_uid = v.uid\n        AND ',' || :maker || ',' LIKE '%,' || vm.m_uid || ',%'\n    )\n  )\n\n  AND (\n    :label = ''\n    OR EXISTS (\n      SELECT 1 FROM video_label vl\n      WHERE vl.v_uid = v.uid\n        AND ',' || :label || ',' LIKE '%,' || vl.l_uid || ',%'\n    )\n  )\n\n  AND (\n    :director = ''\n    OR EXISTS (\n      SELECT 1 FROM video_director vd\n      WHERE vd.v_uid = v.uid\n        AND ',' || :director || ',' LIKE '%,' || vd.d_uid || ',%'\n    )\n  )\n\n  AND (\n    :category = ''\n    OR EXISTS (\n      SELECT 1 FROM video_category vc\n      WHERE vc.v_uid = v.uid\n        AND ',' || :category || ',' LIKE '%,' || vc.c_uid || ',%'\n    )\n  )\n\nORDER BY\n  -- An exact code match comes first, then a prefix match. Somebody\n  -- typing \"MUM-135\" wants that video, not the newest release that\n  -- happens to mention it.\n  CASE\n    WHEN :q != '' AND lower(v.code) = lower(:q) THEN 0\n    WHEN :q != '' AND lower(v.code) LIKE lower(:q) || '%' THEN 1\n    ELSE 2\n  END,\n\n  -- NULLs last, always. A video with no release date must not sort\n  -- above every dated one, which is what a bare DESC would do.\n  CASE WHEN :sort = 'releaseDate' THEN (v.releaseDate IS NULL) END,\n  CASE WHEN :sort = 'releaseDate' AND :order = 'asc'  THEN v.releaseDate END ASC,\n  CASE WHEN :sort = 'releaseDate' AND :order = 'desc' THEN v.releaseDate END DESC,\n\n  CASE WHEN :sort = 'code' AND :order = 'asc'  THEN v.code END ASC,\n  CASE WHEN :sort = 'code' AND :order = 'desc' THEN v.code END DESC,\n\n  CASE WHEN :sort = 'titleEn' AND :order = 'asc'  THEN v.titleEn END ASC,\n  CASE WHEN :sort = 'titleEn' AND :order = 'desc' THEN v.titleEn END DESC,\n\n  CASE WHEN :sort = 'runtimeMins' THEN (v.runtimeMins IS NULL) END,\n  CASE WHEN :sort = 'runtimeMins' AND :order = 'asc'  THEN v.runtimeMins END ASC,\n  CASE WHEN :sort = 'runtimeMins' AND :order = 'desc' THEN v.runtimeMins END DESC,\n\n  CASE WHEN :sort = 'createdAt' AND :order = 'asc'  THEN v.createdAt END ASC,\n  CASE WHEN :sort = 'createdAt' AND :order = 'desc' THEN v.createdAt END DESC,\n\n  CASE WHEN :sort = 'streams' AND :order = 'asc'\n    THEN (SELECT count(*) FROM streams s WHERE s.v_uid = v.uid) END ASC,\n  CASE WHEN :sort = 'streams' AND :order = 'desc'\n    THEN (SELECT count(*) FROM streams s WHERE s.v_uid = v.uid) END DESC,\n\n  (v.releaseDate IS NULL), v.releaseDate DESC, v.uid\n\nLIMIT  CAST(COALESCE(NULLIF(:limit,  ''), 60) AS INTEGER)\nOFFSET CAST(COALESCE(NULLIF(:offset, ''), 0)  AS INTEGER)", "parameters": [{"name": "q", "default": ""}, {"name": "actress", "default": ""}, {"name": "maker", "default": ""}, {"name": "label", "default": ""}, {"name": "director", "default": ""}, {"name": "category", "default": ""}, {"name": "series", "default": ""}, {"name": "has_stream", "default": ""}, {"name": "limit", "default": 60}, {"name": "offset", "default": 0}, {"name": "sort", "default": "releaseDate"}, {"name": "order", "default": "desc"}], "allow": {"unauthenticated": true}, "name": "get_videos", "private": false}, {"sql": "SELECT count(*) AS total\nFROM videos v\nWHERE\n  (\n    :q = ''\n    OR lower(v.code)    LIKE '%' || lower(:q) || '%'\n    OR lower(v.titleEn) LIKE '%' || lower(:q) || '%'\n    OR lower(v.titleJa) LIKE '%' || lower(:q) || '%'\n  )\n  AND (:series = '' OR v.s_uid = :series)\n  AND (\n    :has_stream = ''\n    OR EXISTS (SELECT 1 FROM streams s WHERE s.v_uid = v.uid)\n  )\n  AND (\n    :actress = ''\n    OR EXISTS (\n      SELECT 1 FROM video_star vs\n      WHERE vs.v_uid = v.uid\n        AND ',' || :actress || ',' LIKE '%,' || vs.a_uid || ',%'\n    )\n  )\n  AND (\n    :maker = ''\n    OR EXISTS (\n      SELECT 1 FROM video_maker vm\n      WHERE vm.v_uid = v.uid\n        AND ',' || :maker || ',' LIKE '%,' || vm.m_uid || ',%'\n    )\n  )\n  AND (\n    :label = ''\n    OR EXISTS (\n      SELECT 1 FROM video_label vl\n      WHERE vl.v_uid = v.uid\n        AND ',' || :label || ',' LIKE '%,' || vl.l_uid || ',%'\n    )\n  )\n  AND (\n    :director = ''\n    OR EXISTS (\n      SELECT 1 FROM video_director vd\n      WHERE vd.v_uid = v.uid\n        AND ',' || :director || ',' LIKE '%,' || vd.d_uid || ',%'\n    )\n  )\n  AND (\n    :category = ''\n    OR EXISTS (\n      SELECT 1 FROM video_category vc\n      WHERE vc.v_uid = v.uid\n        AND ',' || :category || ',' LIKE '%,' || vc.c_uid || ',%'\n    )\n  )", "parameters": [{"name": "q", "default": ""}, {"name": "actress", "default": ""}, {"name": "maker", "default": ""}, {"name": "label", "default": ""}, {"name": "director", "default": ""}, {"name": "category", "default": ""}, {"name": "series", "default": ""}, {"name": "has_stream", "default": ""}], "allow": {"unauthenticated": true}, "name": "count_videos", "private": false}, {"sql": "SELECT\n  a.uid,\n  a.name,\n  a.nameJa,\n  a.image,\n  json(a.alias) AS alias,\n  (SELECT count(*) FROM video_star vs WHERE vs.a_uid = a.uid) AS videoCount\nFROM actresses a\nWHERE a.uid = :uid", "parameters": [{"name": "uid"}], "allow": {"unauthenticated": true}, "name": "get_actress", "private": false}, {"sql": "SELECT\n  a.uid,\n  a.name,\n  a.nameJa,\n  a.image,\n  json(a.alias) AS alias,\n  (SELECT count(*) FROM video_star vs WHERE vs.a_uid = a.uid) AS videoCount\nFROM actresses a\nWHERE :q = '' OR lower(a.name) LIKE '%' || lower(:q) || '%'\n   OR lower(coalesce(a.nameJa, '')) LIKE '%' || lower(:q) || '%'\n   OR lower(a.alias) LIKE '%' || lower(:q) || '%'\nORDER BY\n  CASE WHEN :sort = 'name'   AND :order = 'asc'  THEN a.name END ASC,\n  CASE WHEN :sort = 'name'   AND :order = 'desc' THEN a.name END DESC,\n  CASE WHEN :sort = 'videos' AND :order = 'asc'\n    THEN (SELECT count(*) FROM video_star vs WHERE vs.a_uid = a.uid) END ASC,\n  CASE WHEN :sort = 'videos' AND :order = 'desc'\n    THEN (SELECT count(*) FROM video_star vs WHERE vs.a_uid = a.uid) END DESC,\n  CASE WHEN :sort = 'createdAt' AND :order = 'asc'  THEN a.createdAt END ASC,\n  CASE WHEN :sort = 'createdAt' AND :order = 'desc' THEN a.createdAt END DESC,\n  a.name\nLIMIT  CAST(COALESCE(NULLIF(:limit,  ''), 60) AS INTEGER)\nOFFSET CAST(COALESCE(NULLIF(:offset, ''), 0)  AS INTEGER)", "parameters": [{"name": "q", "default": ""}, {"name": "limit", "default": 60}, {"name": "offset", "default": 0}, {"name": "sort", "default": "videos"}, {"name": "order", "default": "desc"}], "allow": {"unauthenticated": true}, "name": "get_actresses", "private": false}, {"sql": "SELECT count(*) AS total FROM actresses a\nWHERE :q = '' OR lower(a.name) LIKE '%' || lower(:q) || '%'\n   OR lower(coalesce(a.nameJa, '')) LIKE '%' || lower(:q) || '%'\n   OR lower(a.alias) LIKE '%' || lower(:q) || '%'", "parameters": [{"name": "q", "default": ""}], "allow": {"unauthenticated": true}, "name": "count_actresses", "private": false}, {"sql": "SELECT m.uid, m.name, m.nameJa,\n       (SELECT count(*) FROM video_maker vm WHERE vm.m_uid = m.uid) AS videoCount\nFROM makers m WHERE m.uid = :uid", "parameters": [{"name": "uid"}], "allow": {"unauthenticated": true}, "name": "get_maker", "private": false}, {"sql": "SELECT m.uid, m.name, m.nameJa,\n       (SELECT count(*) FROM video_maker vm WHERE vm.m_uid = m.uid) AS videoCount\nFROM makers m\nWHERE :q = '' OR lower(m.name) LIKE '%' || lower(:q) || '%'\nORDER BY\n  CASE WHEN :sort = 'name'   AND :order = 'asc'  THEN m.name END ASC,\n  CASE WHEN :sort = 'name'   AND :order = 'desc' THEN m.name END DESC,\n  CASE WHEN :sort = 'videos' AND :order = 'asc'\n    THEN (SELECT count(*) FROM video_maker vm WHERE vm.m_uid = m.uid) END ASC,\n  CASE WHEN :sort = 'videos' AND :order = 'desc'\n    THEN (SELECT count(*) FROM video_maker vm WHERE vm.m_uid = m.uid) END DESC,\n  m.name\nLIMIT  CAST(COALESCE(NULLIF(:limit,  ''), 60) AS INTEGER)\nOFFSET CAST(COALESCE(NULLIF(:offset, ''), 0)  AS INTEGER)", "parameters": [{"name": "q", "default": ""}, {"name": "limit", "default": 60}, {"name": "offset", "default": 0}, {"name": "sort", "default": "videos"}, {"name": "order", "default": "desc"}], "allow": {"unauthenticated": true}, "name": "get_makers", "private": false}, {"sql": "SELECT count(*) AS total FROM makers m\nWHERE :q = '' OR lower(m.name) LIKE '%' || lower(:q) || '%'", "parameters": [{"name": "q", "default": ""}], "allow": {"unauthenticated": true}, "name": "count_makers", "private": false}, {"sql": "SELECT l.uid, l.name, l.nameJa,\n       (SELECT count(*) FROM video_label vl WHERE vl.l_uid = l.uid) AS videoCount\nFROM labels l WHERE l.uid = :uid", "parameters": [{"name": "uid"}], "allow": {"unauthenticated": true}, "name": "get_label", "private": false}, {"sql": "SELECT l.uid, l.name, l.nameJa,\n       (SELECT count(*) FROM video_label vl WHERE vl.l_uid = l.uid) AS videoCount\nFROM labels l\nWHERE :q = '' OR lower(l.name) LIKE '%' || lower(:q) || '%'\nORDER BY\n  CASE WHEN :sort = 'name'   AND :order = 'asc'  THEN l.name END ASC,\n  CASE WHEN :sort = 'name'   AND :order = 'desc' THEN l.name END DESC,\n  CASE WHEN :sort = 'videos' AND :order = 'asc'\n    THEN (SELECT count(*) FROM video_label vl WHERE vl.l_uid = l.uid) END ASC,\n  CASE WHEN :sort = 'videos' AND :order = 'desc'\n    THEN (SELECT count(*) FROM video_label vl WHERE vl.l_uid = l.uid) END DESC,\n  l.name\nLIMIT  CAST(COALESCE(NULLIF(:limit,  ''), 60) AS INTEGER)\nOFFSET CAST(COALESCE(NULLIF(:offset, ''), 0)  AS INTEGER)", "parameters": [{"name": "q", "default": ""}, {"name": "limit", "default": 60}, {"name": "offset", "default": 0}, {"name": "sort", "default": "videos"}, {"name": "order", "default": "desc"}], "allow": {"unauthenticated": true}, "name": "get_labels", "private": false}, {"sql": "SELECT count(*) AS total FROM labels l\nWHERE :q = '' OR lower(l.name) LIKE '%' || lower(:q) || '%'", "parameters": [{"name": "q", "default": ""}], "allow": {"unauthenticated": true}, "name": "count_labels", "private": false}, {"sql": "SELECT d.uid, d.name, d.nameJa,\n       (SELECT count(*) FROM video_director vd WHERE vd.d_uid = d.uid) AS videoCount\nFROM directors d WHERE d.uid = :uid", "parameters": [{"name": "uid"}], "allow": {"unauthenticated": true}, "name": "get_director", "private": false}, {"sql": "SELECT d.uid, d.name, d.nameJa,\n       (SELECT count(*) FROM video_director vd WHERE vd.d_uid = d.uid) AS videoCount\nFROM directors d\nWHERE :q = '' OR lower(d.name) LIKE '%' || lower(:q) || '%'\nORDER BY\n  CASE WHEN :sort = 'name'   AND :order = 'asc'  THEN d.name END ASC,\n  CASE WHEN :sort = 'name'   AND :order = 'desc' THEN d.name END DESC,\n  CASE WHEN :sort = 'videos' AND :order = 'asc'\n    THEN (SELECT count(*) FROM video_director vd WHERE vd.d_uid = d.uid) END ASC,\n  CASE WHEN :sort = 'videos' AND :order = 'desc'\n    THEN (SELECT count(*) FROM video_director vd WHERE vd.d_uid = d.uid) END DESC,\n  d.name\nLIMIT  CAST(COALESCE(NULLIF(:limit,  ''), 60) AS INTEGER)\nOFFSET CAST(COALESCE(NULLIF(:offset, ''), 0)  AS INTEGER)", "parameters": [{"name": "q", "default": ""}, {"name": "limit", "default": 60}, {"name": "offset", "default": 0}, {"name": "sort", "default": "videos"}, {"name": "order", "default": "desc"}], "allow": {"unauthenticated": true}, "name": "get_directors", "private": false}, {"sql": "SELECT count(*) AS total FROM directors d\nWHERE :q = '' OR lower(d.name) LIKE '%' || lower(:q) || '%'", "parameters": [{"name": "q", "default": ""}], "allow": {"unauthenticated": true}, "name": "count_directors", "private": false}, {"sql": "SELECT c.uid, c.name, c.nameJa,\n       (SELECT count(*) FROM video_category vc WHERE vc.c_uid = c.uid) AS videoCount\nFROM categories c WHERE c.uid = :uid", "parameters": [{"name": "uid"}], "allow": {"unauthenticated": true}, "name": "get_category", "private": false}, {"sql": "SELECT c.uid, c.name, c.nameJa,\n       (SELECT count(*) FROM video_category vc WHERE vc.c_uid = c.uid) AS videoCount\nFROM categories c\nWHERE :q = '' OR lower(c.name) LIKE '%' || lower(:q) || '%'\nORDER BY\n  CASE WHEN :sort = 'name'   AND :order = 'asc'  THEN c.name END ASC,\n  CASE WHEN :sort = 'name'   AND :order = 'desc' THEN c.name END DESC,\n  CASE WHEN :sort = 'videos' AND :order = 'asc'\n    THEN (SELECT count(*) FROM video_category vc WHERE vc.c_uid = c.uid) END ASC,\n  CASE WHEN :sort = 'videos' AND :order = 'desc'\n    THEN (SELECT count(*) FROM video_category vc WHERE vc.c_uid = c.uid) END DESC,\n  c.name\nLIMIT  CAST(COALESCE(NULLIF(:limit,  ''), 60) AS INTEGER)\nOFFSET CAST(COALESCE(NULLIF(:offset, ''), 0)  AS INTEGER)", "parameters": [{"name": "q", "default": ""}, {"name": "limit", "default": 60}, {"name": "offset", "default": 0}, {"name": "sort", "default": "videos"}, {"name": "order", "default": "desc"}], "allow": {"unauthenticated": true}, "name": "get_categories", "private": false}, {"sql": "SELECT count(*) AS total FROM categories c\nWHERE :q = '' OR lower(c.name) LIKE '%' || lower(:q) || '%'", "parameters": [{"name": "q", "default": ""}], "allow": {"unauthenticated": true}, "name": "count_categories", "private": false}, {"sql": "SELECT s.uid, s.name, s.nameJa,\n       (SELECT count(*) FROM videos v WHERE v.s_uid = s.uid) AS videoCount\nFROM series s\nWHERE :q = '' OR lower(s.name) LIKE '%' || lower(:q) || '%'\nORDER BY\n  CASE WHEN :sort = 'name' AND :order = 'asc'  THEN s.name END ASC,\n  CASE WHEN :sort = 'name' AND :order = 'desc' THEN s.name END DESC,\n  CASE WHEN :sort = 'videos' AND :order = 'asc'\n    THEN (SELECT count(*) FROM videos v WHERE v.s_uid = s.uid) END ASC,\n  CASE WHEN :sort = 'videos' AND :order = 'desc'\n    THEN (SELECT count(*) FROM videos v WHERE v.s_uid = s.uid) END DESC,\n  s.name\nLIMIT  CAST(COALESCE(NULLIF(:limit,  ''), 60) AS INTEGER)\nOFFSET CAST(COALESCE(NULLIF(:offset, ''), 0)  AS INTEGER)", "parameters": [{"name": "q", "default": ""}, {"name": "limit", "default": 60}, {"name": "offset", "default": 0}, {"name": "sort", "default": "videos"}, {"name": "order", "default": "desc"}], "allow": {"unauthenticated": true}, "name": "get_series", "private": false}, {"sql": "SELECT\n  s.id,\n  s.v_uid,\n  s.source,\n  s.sourceUrl,\n  s.embedUrl,\n  s.proxyUrl,\n  s.directLink,\n  s.kind,\n  s.addedAt\nFROM streams s\nWHERE s.v_uid = :v_uid\nORDER BY\n  -- A direct media URL first: it plays without a third-party page, so\n  -- a client walking the list in order tries the best option first.\n  (s.directLink IS NULL), s.source, s.id", "parameters": [{"name": "v_uid"}], "allow": {"unauthenticated": true}, "name": "get_video_streams", "private": false}, {"sql": "SELECT\n  s.id, s.v_uid, s.source, s.sourceUrl, s.embedUrl, s.proxyUrl,\n  s.directLink, s.kind, s.addedAt,\n  v.code, v.titleEn, v.jacketThumbUrl\nFROM streams s\nJOIN videos v ON v.uid = s.v_uid\nWHERE (:source = '' OR s.source = :source)\n  AND (:kind   = '' OR s.kind   = :kind)\nORDER BY s.id DESC\nLIMIT  CAST(COALESCE(NULLIF(:limit,  ''), 60) AS INTEGER)\nOFFSET CAST(COALESCE(NULLIF(:offset, ''), 0)  AS INTEGER)", "parameters": [{"name": "source", "default": ""}, {"name": "kind", "default": ""}, {"name": "limit", "default": 60}, {"name": "offset", "default": 0}], "allow": {"unauthenticated": true}, "name": "get_streams", "private": false}, {"sql": "SELECT count(*) AS total FROM streams s\nWHERE (:source = '' OR s.source = :source)\n  AND (:kind   = '' OR s.kind   = :kind)", "parameters": [{"name": "source", "default": ""}, {"name": "kind", "default": ""}], "allow": {"unauthenticated": true}, "name": "count_streams", "private": false}, {"sql": "SELECT\n  t.rank,\n  v.uid, v.code, v.titleEn, v.titleJa,\n  v.jacketFullUrl, v.jacketThumbUrl, v.releaseDate, v.runtimeMins,\n  json((\n    SELECT json_group_array(\n      json_object('uid', a.uid, 'name', a.name, 'image', a.image)\n    )\n    FROM video_star vs\n    JOIN actresses a ON a.uid = vs.a_uid\n    WHERE vs.v_uid = v.uid\n  )) AS actresses,\n  (SELECT count(*) FROM streams s WHERE s.v_uid = v.uid) AS streamCount\nFROM videos_top t\nJOIN videos v ON v.uid = t.v_uid\nWHERE t.period = :period\nORDER BY t.rank\nLIMIT CAST(COALESCE(NULLIF(:limit, ''), 100) AS INTEGER)", "parameters": [{"name": "period", "default": "today"}, {"name": "limit", "default": 100}], "allow": {"unauthenticated": true}, "name": "get_top_videos", "private": false}, {"sql": "SELECT\n  t.rank,\n  a.uid, a.name, a.nameJa, a.image,\n  (SELECT count(*) FROM video_star vs WHERE vs.a_uid = a.uid) AS videoCount\nFROM actresses_top t\nJOIN actresses a ON a.uid = t.a_uid\nORDER BY t.rank\nLIMIT CAST(COALESCE(NULLIF(:limit, ''), 100) AS INTEGER)", "parameters": [{"name": "limit", "default": 100}], "allow": {"unauthenticated": true}, "name": "get_top_actresses", "private": false}, {"sql": "SELECT\n  (SELECT count(*) FROM videos)     AS videos,\n  (SELECT count(*) FROM actresses)  AS actresses,\n  (SELECT count(*) FROM makers)     AS makers,\n  (SELECT count(*) FROM labels)     AS labels,\n  (SELECT count(*) FROM directors)  AS directors,\n  (SELECT count(*) FROM categories) AS categories,\n  (SELECT count(*) FROM series)     AS series,\n  (SELECT count(*) FROM streams)    AS streams,\n  (SELECT count(DISTINCT v_uid) FROM streams) AS videosWithStreams,\n  (SELECT count(*) FROM videos v\n    WHERE NOT EXISTS (SELECT 1 FROM streams s WHERE s.v_uid = v.uid)\n  ) AS videosWithoutStreams", "allow": {"unauthenticated": true}, "name": "get_stats", "private": false}], "allow_execute_sql": false, "query_ms": 30.310961417853832}