Files
opds-library/app/genre_utils.py
T

82 lines
2.4 KiB
Python

#!/usr/bin/env python3
"""Модуль для работы с жанрами"""
from db_utils import get_cursor
def get_root_genres():
"""Возвращает корневые жанры с количеством книг"""
conn, cur = get_cursor()
cur.execute("""
SELECT g.id, g.code, g.title_ru, g.title_en,
COUNT(DISTINCT bg.book_id) as books_count
FROM genres g
LEFT JOIN book_genres bg ON bg.genre_id = g.id
WHERE g.is_root = TRUE
GROUP BY g.id, g.code, g.title_ru, g.title_en
ORDER BY books_count DESC
""")
genres = cur.fetchall()
conn.close()
return genres
def get_subgenres(root_code):
"""Возвращает поджанры для корневого жанра"""
conn, cur = get_cursor()
cur.execute("""
SELECT g.id, g.code, g.title_ru, g.title_en,
COUNT(DISTINCT bg.book_id) as books_count
FROM genres g
LEFT JOIN book_genres bg ON bg.genre_id = g.id
WHERE g.root_code = %s AND g.is_root = FALSE
GROUP BY g.id, g.code, g.title_ru, g.title_en
ORDER BY books_count DESC
""", (root_code,))
genres = cur.fetchall()
conn.close()
return genres
def get_genre_books(genre_id, limit=100, offset=0):
"""Возвращает книги жанра"""
conn, cur = get_cursor()
cur.execute("""
SELECT b.id, b.title, b.language, b.added_date,
string_agg(DISTINCT a.full_name, ', ' ORDER BY ba.position) as authors
FROM books b
JOIN book_genres bg ON bg.book_id = b.id
JOIN book_authors ba ON ba.book_id = b.id
JOIN authors a ON a.id = ba.author_id
WHERE bg.genre_id = %s
GROUP BY b.id, b.title, b.language, b.added_date
ORDER BY b.added_date DESC NULLS LAST
LIMIT %s OFFSET %s
""", (genre_id, limit, offset))
books = cur.fetchall()
conn.close()
return books
def get_custom_genres():
"""Возвращает кастомные жанры (не из genres.xml)"""
conn, cur = get_cursor()
cur.execute("""
SELECT g.code, g.parent_code, g.root_code,
COUNT(DISTINCT bg.book_id) as books_count
FROM genres g
LEFT JOIN book_genres bg ON bg.genre_id = g.id
WHERE g.is_custom = TRUE
GROUP BY g.code, g.parent_code, g.root_code
ORDER BY books_count DESC
""")
genres = cur.fetchall()
conn.close()
return genres