<reponame>StrangeArcturus/QtAndRequestParser-Project<gh_stars>0
# -*- coding: utf-8 -*-
# только парсер и его бек-энд
import requests  # для выполнения запросов к сайту
from lxml import html  #, etry  # необходимо для "расшифровки html"
from typing import Any, Optional, NoReturn
# дабы придерживаться стиля,
# указывая типы переменных (а-ля TypeScript) (жаль тут типы проверяются только ide)


def parse(title: str, author: str, pretty_flag: bool = False) -> Optional[int]:
    """
    обязательные аргументы-строки "название" и "автор",
    так же необязательный аргумент о "красивом" тексте песен
    если Истина -> будет только текст, иначе так же и объявления о переходах, припевах и т.д.
    """
    if not isinstance(author, str):
        raise TypeError(f"bad operand type for parse(): '{type(author)}'; expected: 'str'")
    if not isinstance(title, str):
        raise TypeError(f"bad operand type for parse(): '{type(title)}'; expected: 'str'")
    if not isinstance(pretty_flag, bool):
        raise TypeError(f"bad operand type for parse(): '{type(pretty_flag)}'; expected: 'bool'")
    # проверки на тип: если тип не подходит -> бросить исключение
    author: str = author.strip().lower()
    title: str = title.strip().lower()
    url: str = f"https://www.amalgama-lab.com/songs/{author[0]}/{author.replace(' ', '_')}/{title.replace(' ', '_')}.html"
    api: requests.Response = requests.get(url=url)
    tree: Any = html.document_fromstring(api.text)
    text_original: Any = tree.xpath('//*[@id="click_area"]/div//*[@class="original"]/text()')
    text_translate: Any = tree.xpath('//*[@id="click_area"]/div//*[@class="translate"]/text()')
    if len(text_original) == len(text_translate):
        with open('cache_origin.txt', 'w', encoding='utf-8') as cache_origin:
            with open('cache_trans.txt', 'w', encoding='utf-8') as cache_trans:
                for i in range(len(text_original)):
                    orig = text_original[i]
                    trans = text_translate[i]
                    if pretty_flag:
                        if ('[' in orig and '[' in trans) and (']' in orig and ']' in trans):
                            continue
                    print(
                        text_original[i],
                        file=cache_origin
                    )  # запись в файл для дальнейшего использования
                    print(
                        text_translate[i],file=cache_trans
                    )
        if len(text_original) == 0:
            return 1
    print('[parser] Парсер успешно получил текст и записал его в файлы кеша с заданными параметрами:\n{}={}\n{}={}\n{}={}'.format(
        'title',
        title,
        'author',
        author,
        'pretty_flag',
        pretty_flag
    ))           


def main() -> NoReturn:
    parse('Immortals', 'fall out boy')  # пример для теста


if __name__ == "__main__":
    main()

# -*- coding: utf-8 -*-
# только парсер и его бек-энд
import requests  # для выполнения запросов к сайту
from lxml import html  #, etry  # необходимо для "расшифровки html"
from typing import Any, Optional, NoReturn
# дабы придерживаться стиля,
# указывая типы переменных (а-ля TypeScript) (жаль тут типы проверяются только ide)


def parse(title: str, author: str, pretty_flag: bool = False) -> Optional[int]:
    """
    обязательные аргументы-строки "название" и "автор",
    так же необязательный аргумент о "красивом" тексте песен
    если Истина -> будет только текст, иначе так же и объявления о переходах, припевах и т.д.
    """
    if not isinstance(author, str):
        raise TypeError(f"bad operand type for parse(): '{type(author)}'; expected: 'str'")
    if not isinstance(title, str):
        raise TypeError(f"bad operand type for parse(): '{type(title)}'; expected: 'str'")
    if not isinstance(pretty_flag, bool):
        raise TypeError(f"bad operand type for parse(): '{type(pretty_flag)}'; expected: 'bool'")
    # проверки на тип: если тип не подходит -> бросить исключение
    author: str = author.strip().lower()
    title: str = title.strip().lower()
    url: str = f"https://www.amalgama-lab.com/songs/{author[0]}/{author.replace(' ', '_')}/{title.replace(' ', '_')}.html"
    api: requests.Response = requests.get(url=url)
    tree: Any = html.document_fromstring(api.text)
    text_original: Any = tree.xpath('//*[@id="click_area"]/div//*[@class="original"]/text()')
    text_translate: Any = tree.xpath('//*[@id="click_area"]/div//*[@class="translate"]/text()')
    if len(text_original) == len(text_translate):
        with open('cache_origin.txt', 'w', encoding='utf-8') as cache_origin:
            with open('cache_trans.txt', 'w', encoding='utf-8') as cache_trans:
                for i in range(len(text_original)):
                    orig = text_original[i]
                    trans = text_translate[i]
                    if pretty_flag:
                        if ('[' in orig and '[' in trans) and (']' in orig and ']' in trans):
                            continue
                    print(
                        text_original[i],
                        file=cache_origin
                    )  # запись в файл для дальнейшего использования
                    print(
                        text_translate[i],file=cache_trans
                    )
        if len(text_original) == 0:
            return 1
    print('[parser] Парсер успешно получил текст и записал его в файлы кеша с заданными параметрами:\n{}={}\n{}={}\n{}={}'.format(
        'title',
        title,
        'author',
        author,
        'pretty_flag',
        pretty_flag
    ))           


def main() -> NoReturn:
    parse('Immortals', 'fall out boy')  # пример для теста


if __name__ == "__main__":
    main()
# -*- coding: utf-8 -*- # только парсер и его бек-энд # для выполнения запросов к сайту #, etry  # необходимо для "расшифровки html" # дабы придерживаться стиля, # указывая типы переменных (а-ля TypeScript) (жаль тут типы проверяются только ide) обязательные аргументы-строки "название" и "автор",
     так же необязательный аргумент о "красивом" тексте песен
     если Истина -> будет только текст, иначе так же и объявления о переходах, припевах и т.д. # проверки на тип: если тип не подходит -> бросить исключение # запись в файл для дальнейшего использования # пример для теста