72 lines
2.1 KiB
Python
Executable File
72 lines
2.1 KiB
Python
Executable File
# -*- coding: utf-8 -*-
|
||
# Calibre-Web Automated – fork of Calibre-Web
|
||
# Copyright (C) 2018-2025 Calibre-Web contributors
|
||
# Copyright (C) 2024-2025 Calibre-Web Automated contributors
|
||
# SPDX-License-Identifier: GPL-3.0-or-later
|
||
# See CONTRIBUTORS for full list of authors.
|
||
|
||
from lxml import etree
|
||
|
||
from .constants import BookMeta
|
||
|
||
|
||
def get_fb2_info(tmp_file_path, original_file_extension):
|
||
|
||
ns = {
|
||
'fb': 'http://www.gribuser.ru/xml/fictionbook/2.0',
|
||
'l': 'http://www.w3.org/1999/xlink',
|
||
}
|
||
|
||
fb2_file = open(tmp_file_path, encoding="utf-8")
|
||
tree = etree.fromstring(fb2_file.read().encode())
|
||
|
||
authors = tree.xpath('/fb:FictionBook/fb:description/fb:title-info/fb:author', namespaces=ns)
|
||
|
||
def get_author(element):
|
||
last_name = element.xpath('fb:last-name/text()', namespaces=ns)
|
||
if len(last_name):
|
||
last_name = last_name[0]
|
||
else:
|
||
last_name = ''
|
||
middle_name = element.xpath('fb:middle-name/text()', namespaces=ns)
|
||
if len(middle_name):
|
||
middle_name = middle_name[0]
|
||
else:
|
||
middle_name = ''
|
||
first_name = element.xpath('fb:first-name/text()', namespaces=ns)
|
||
if len(first_name):
|
||
first_name = first_name[0]
|
||
else:
|
||
first_name = ''
|
||
return (first_name + ' '
|
||
+ middle_name + ' '
|
||
+ last_name)
|
||
|
||
author = str(", ".join(map(get_author, authors)))
|
||
|
||
title = tree.xpath('/fb:FictionBook/fb:description/fb:title-info/fb:book-title/text()', namespaces=ns)
|
||
if len(title):
|
||
title = str(title[0])
|
||
else:
|
||
title = ''
|
||
description = tree.xpath('/fb:FictionBook/fb:description/fb:publish-info/fb:book-name/text()', namespaces=ns)
|
||
if len(description):
|
||
description = str(description[0])
|
||
else:
|
||
description = ''
|
||
|
||
return BookMeta(
|
||
file_path=tmp_file_path,
|
||
extension=original_file_extension,
|
||
title=title,
|
||
author=author,
|
||
cover=None,
|
||
description=description,
|
||
tags="",
|
||
series="",
|
||
series_id="",
|
||
languages="",
|
||
publisher="",
|
||
pubdate="",
|
||
identifiers=[])
|