diff --git a/.flake8 b/.flake8 new file mode 100644 index 0000000..2b21f65 --- /dev/null +++ b/.flake8 @@ -0,0 +1,2 @@ +[flake8] +max-line-length = 140 \ No newline at end of file diff --git a/.gitignore b/.gitignore index 550e6bd..eeee0de 100644 --- a/.gitignore +++ b/.gitignore @@ -124,4 +124,11 @@ dmypy.json # Local settings settings.json -downloaded.json \ No newline at end of file +downloaded.json + +# Editor files +.idea/ +.vscode/ + +# Local +Anime/ \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..ec3b1f2 --- /dev/null +++ b/README.md @@ -0,0 +1,35 @@ +# nyaa-cli + +A CLI for downloading Anime from https://nyaa.si making use of their RSS Feed and [python-libtorrent](https://github.com/arvidn/libtorrent/blob/RC_1_2/docs/python_binding.rst) + +--- + +![image](https://user-images.githubusercontent.com/37747572/69002323-bb2ea100-08cb-11ea-9b47-20bd9870c8c0.png) + +![image](https://user-images.githubusercontent.com/37747572/69002293-33e12d80-08cb-11ea-842e-02947726185d.png) + +![image](https://user-images.githubusercontent.com/37747572/69002363-ad2d5000-08cc-11ea-9360-76bf1598512d.png) + +--- + +## Installing + +- Will be available on PyPi to be installed with Pip soon + - For now dependencies can be installed with [poetry](https://github.com/sdispater/poetry) using `poetry install` and run with `poetry run nyaa.py --help` + - *Note:* python-libtorrent will still need to be downloaded separately as shown below + +- This Program depends on python3-libtorrent, which can be installed using Apt with `sudo apt install python3-libtorrent` or can be built from source here: [python-libtorrent](https://github.com/arvidn/libtorrent/blob/RC_1_2/docs/python_binding.rst) + +--- + +## Usage + +- **Help:** `nyaa-cli --help` + +- `nyaa-cli "Anime Name" -o ` + - **Example:** + ```bash + # Downloading Episode 14 of 'Steins;gate' to '~/Anime/Steins;Gate' folder + nyaa-cli "Steins;Gate" 14 -o ~/Anime/Steins\;Gate + ``` + - Then select the entry you want to Download diff --git a/anilist.py b/anilist.py deleted file mode 100644 index 80c5178..0000000 --- a/anilist.py +++ /dev/null @@ -1,73 +0,0 @@ -import requests -import logging - -logger = logging.getLogger('anime_downloader') - - -def fetch_user_list(username: str, token: str) -> list: - query = ''' - query ($username: String) { - MediaListCollection(userName: $username, type: ANIME) { - lists { - name - status - isCustomList - entries { - id - progress - status - repeat - media{ - id - type - format - status - source - season - episodes - startDate { - year - month - day - } - endDate { - year - month - day - } - title { - romaji - english - native - } - } - } - } - } - } - ''' - - variables = {'username': username} - - url = 'https://graphql.anilist.co' - - headers = { - 'Authorization': f'Bearer {token}', - 'Accept': 'application/json', - 'Content-Type': 'application/json' - } - - response = requests.post(url, headers=headers, json={ - 'query': query, 'variables': variables}) - if response: - return response.json().get('data').get('MediaListCollection').get('lists') - return [] - - -def fetch_watching(user_list: list) -> list: - watching = [] - for item in user_list: - if item['status'] == 'CURRENT': - for entry in item['entries']: - watching.append(entry) - return watching diff --git a/anime_feed.py b/anime_feed.py deleted file mode 100644 index 2e608a4..0000000 --- a/anime_feed.py +++ /dev/null @@ -1,45 +0,0 @@ -from guessit import guessit -from fuzzywuzzy import fuzz - -import logging - -logger = logging.getLogger('anime_downloader') - - -def search_title(feed, search: dict, size: int = 720, episode: int = None): - for entry in feed['entries']: - title = guessit(entry['title']) - name = title.get('title') - if title.get('screen_size') == f'{size}p': - for lang in ['english', 'romaji']: - if search.get(lang): - search_guess = guessit(search.get(lang)) - lookup = search_guess.get('title') - ratio = fuzz.token_set_ratio(name, lookup) - if ratio > 75: - logger.info( - f"[PARSER] Found {ratio * 100:2f}% RSS match for Anime: '{name}' ({lang} title) " - f"E{title.get('episode')}" - ) - if not episode: - return entry['link'], name - if title.get('episode'): - if title.get('season'): - if search_guess.get('season'): - if title.get('season') != search_guess.get('season'): - logger.info( - f"[PARSER] Not returning entry: '{name}' " - f"({lang} title). ({ratio * 100:2f}% match)" - f"Season doesn't match (Wanted: {search_guess.get('season')}, " - f"Found: {title.get('season')})" - ) - continue - if int(title.get('episode')) == episode: - return entry['link'], name - logger.info( - f"[PARSER] Not returning entry: '{name}' ({lang} title). ({ratio * 100:2f}% match)" - f"Episode doesn't match (Wanted: {episode}, Found: {title.get('episode')})" - ) - for lang in ['english', 'romaji']: - if search.get(lang): - return None, search.get(lang) diff --git a/main.py b/main.py deleted file mode 100644 index 258fc96..0000000 --- a/main.py +++ /dev/null @@ -1,74 +0,0 @@ -import json -import logging -from urllib import request - -import feedparser - -from anilist import fetch_user_list, fetch_watching -from anime_feed import search_title - -logger = logging.getLogger('anime_downloader') -fh = logging.FileHandler('anime_downloader.log') -formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s') -fh.setLevel(logging.INFO) -fh.setFormatter(formatter) -logger.setLevel(logging.INFO) -logger.addHandler(fh) -logger.addHandler(logging.StreamHandler()) - -with open('settings.json') as f: - settings = json.load(f) - -if __name__ == '__main__': - feed = feedparser.parse('https://nyaa.si/rss?c=1_2') - # Arguments: - # c=1_0 -> Category 1_0 (Anime - English-translated) - # magnets -> Magnets for links - # p -> page - - user_list = fetch_user_list(settings['Anilist']['username'], settings['Anilist']['token']) - for item in fetch_watching(user_list): - episode = item['progress'] + 1 - romaji_title = item['media']['title']['romaji'] - - name_episode = f"{item['media']['title']['romaji']}-E{episode}" - - try: - with open('downloaded.json'): - pass - except FileNotFoundError: - with open('downloaded.json', 'w+'): - pass - - with open('downloaded.json', 'r+') as f: - try: - downloaded = json.load(f) - except json.decoder.JSONDecodeError: - downloaded = {} - - downloaded_item = downloaded.get(romaji_title) - - if downloaded_item: - if episode in downloaded_item.get('episodes'): - logger.info(f"[MAIN] Not downloading '{romaji_title}' E{episode}. Already marked as downloaded.") - continue - - link, name = search_title(feed, item['media']['title'], episode=episode) - if link and name: - path = f'/home/john/Downloads/{romaji_title} E{episode}.torrent' - request.urlretrieve(link, path) - logger.info(f"[MAIN] Downloading torrent file to {path}") - if downloaded_item: - downloaded[romaji_title]['episodes'].append(episode) - logger.info(f"[MAIN] Added E{episode} to '{romaji_title}'s download entry.") - json.dump(downloaded, f) - else: - logger.info(f"[MAIN] Created download Entry for anime '{romaji_title}' starting with E{episode}.") - downloaded[romaji_title] = {'episodes': [episode]} - json.dump(downloaded, f) - else: - logger.info(f"[MAIN] No match found for anime '{name}' E{episode}.") - - with open('downloaded.json', 'w') as f: - json.dump(downloaded, f) - logger.info('\n') diff --git a/nyaa.py b/nyaa.py new file mode 100644 index 0000000..eaa649a --- /dev/null +++ b/nyaa.py @@ -0,0 +1,47 @@ +#!/usr/bin/env python + +import sys + +import click + +from nyaacli.nyaa_search import search_torrent +from nyaacli.colors import red, green + + +@click.command() +@click.argument('anime') +@click.argument('episode', type=int, default=None, required=False) +@click.option('--output', '-o', default='~/Videos/Anime', help=green('Output Folder'), type=click.Path(), show_default=True) +def main(anime: str, episode: int, output: str): + """ + Search for an Anime on https://nyaa.si and downloads it + + \b + Usage: + \33[92mnyaa-cli \33[36m"Anime Name" \33[33m \33[34m-o \033[0m + + \b + Example: + \33[92mnyaa-cli \33[36m"Kimetsu no Yaiba" \33[33m19 \33[34m-o "My/Animes/Folder/Kimetsu_No_Yaiba/\033[0m + """ + torrent_search = search_torrent(anime, episode) + + if torrent_search: + torrent_path, result_name = torrent_search + + download_torrent(torrent_path, result_name, base_path=output) + + +# if __name__ == '__main__': +try: + from nyaacli.torrenting import download_torrent +except ModuleNotFoundError: + print(red("You need to have the 'python3-libtorrent' library installed to run this.\n")) + print("If you use the apt package manager, you can install with:", green("sudo apt install python3-libtorrent")) + + libtorrent_url = "https://github.com/arvidn/libtorrent/blob/RC_1_2/docs/python_binding.rst" + + print(f"Otherwise, look into how you can build it here: {libtorrent_url}") + sys.exit(1) + +main() diff --git a/poetry.lock b/poetry.lock index c1a52ed..a485b0a 100644 --- a/poetry.lock +++ b/poetry.lock @@ -19,19 +19,38 @@ version = "0.5.5" [[package]] category = "main" -description = "Python package for providing Mozilla's CA Bundle." -name = "certifi" +description = "A thin, practical wrapper around terminal coloring, styling, and positioning" +name = "blessings" optional = false -python-versions = "*" -version = "2019.3.9" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +version = "1.7" + +[package.dependencies] +six = "*" [[package]] category = "main" -description = "Universal encoding detector for Python 2 and 3" -name = "chardet" +description = "Composable command line interface toolkit" +name = "click" optional = false -python-versions = "*" -version = "3.0.4" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +version = "7.0" + +[[package]] +category = "main" +description = "Cross-platform colored terminal text." +name = "colorama" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +version = "0.4.1" + +[[package]] +category = "dev" +description = "Discover and load entry points from installed packages." +name = "entrypoints" +optional = false +python-versions = ">=2.7" +version = "0.3" [[package]] category = "main" @@ -42,15 +61,18 @@ python-versions = "*" version = "5.2.1" [[package]] -category = "main" -description = "Fuzzy string matching in python" -name = "fuzzywuzzy" +category = "dev" +description = "the modular source code checker: pep8, pyflakes and co" +name = "flake8" optional = false -python-versions = "*" -version = "0.17.0" +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +version = "3.7.9" [package.dependencies] -python-levenshtein = ">=0.12" +entrypoints = ">=0.3.0,<0.4.0" +mccabe = ">=0.6.0,<0.7.0" +pycodestyle = ">=2.5.0,<2.6.0" +pyflakes = ">=2.1.0,<2.2.0" [[package]] category = "main" @@ -67,11 +89,45 @@ rebulk = "*" [[package]] category = "main" -description = "Internationalized Domain Names in Applications (IDNA)" -name = "idna" +description = "Collection of common interactive command line user interfaces, based on Inquirer.js" +name = "inquirer" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" -version = "2.8" +python-versions = "*" +version = "2.6.3" + +[package.dependencies] +blessings = "1.7" +python-editor = "1.0.4" +readchar = "2.0.1" + +[[package]] +category = "dev" +description = "McCabe checker, plugin for flake8" +name = "mccabe" +optional = false +python-versions = "*" +version = "0.6.1" + +[[package]] +category = "dev" +description = "Optional static typing for Python" +name = "mypy" +optional = false +python-versions = ">=3.5" +version = "0.740" + +[package.dependencies] +mypy-extensions = ">=0.4.0,<0.5.0" +typed-ast = ">=1.4.0,<1.5.0" +typing-extensions = ">=3.7.4" + +[[package]] +category = "dev" +description = "Experimental type system extensions for programs checked with the mypy typechecker." +name = "mypy-extensions" +optional = false +python-versions = "*" +version = "0.4.3" [[package]] category = "dev" @@ -81,6 +137,14 @@ optional = false python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" version = "2.5.0" +[[package]] +category = "dev" +description = "passive checker of Python programs" +name = "pyflakes" +optional = false +python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*" +version = "2.1.1" + [[package]] category = "main" description = "Extensions to the standard Python datetime module" @@ -94,15 +158,19 @@ six = ">=1.5" [[package]] category = "main" -description = "Python extension for computing string edit distances and similarities." -marker = "extra == \"speedup\"" -name = "python-levenshtein" +description = "Programmatically open an editor, capture the result." +name = "python-editor" optional = false python-versions = "*" -version = "0.12.0" +version = "1.0.4" -[package.dependencies] -setuptools = "*" +[[package]] +category = "main" +description = "Utilities to read single characters and key-strokes" +name = "readchar" +optional = false +python-versions = "*" +version = "2.0.1" [[package]] category = "main" @@ -115,20 +183,6 @@ version = "1.0.0" [package.dependencies] six = "*" -[[package]] -category = "main" -description = "Python HTTP for Humans." -name = "requests" -optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, !=3.4.*" -version = "2.22.0" - -[package.dependencies] -certifi = ">=2017.4.17" -chardet = ">=3.0.2,<3.1.0" -idna = ">=2.5,<2.9" -urllib3 = ">=1.21.1,<1.25.0 || >1.25.0,<1.25.1 || >1.25.1,<1.26" - [[package]] category = "main" description = "Python 2 and 3 compatibility utilities" @@ -138,30 +192,45 @@ python-versions = ">=2.6, !=3.0.*, !=3.1.*" version = "1.12.0" [[package]] -category = "main" -description = "HTTP library with thread-safe connection pooling, file post, and more." -name = "urllib3" +category = "dev" +description = "a fork of Python 2 and 3 ast modules with type comment support" +name = "typed-ast" +optional = false +python-versions = "*" +version = "1.4.0" + +[[package]] +category = "dev" +description = "Backported and Experimental Type Hints for Python 3.5+" +name = "typing-extensions" optional = false -python-versions = ">=2.7, !=3.0.*, !=3.1.*, !=3.2.*, !=3.3.*, <4" -version = "1.25.3" +python-versions = "*" +version = "3.7.4.1" [metadata] -content-hash = "2067f6c99d01faeee728926d04d649c41a1210066095b56a8d347473f61848d3" +content-hash = "b9ad6762f3c3ab922a5ab1f4295e23e624bf1cf6126fb3215bfc9a9a9a2eed4c" python-versions = "^3.7" [metadata.hashes] autopep8 = ["4d8eec30cc81bc5617dbf1218201d770dc35629363547f17577c61683ccfb3ee"] babelfish = ["8380879fa51164ac54a3e393f83c4551a275f03617f54a99d70151358e444104"] -certifi = ["59b7658e26ca9c7339e00f8f4636cdfe59d34fa37b9b04f6f9e9926b3cece1a5", "b26104d6835d1f5e49452a26eb2ff87fe7090b89dfcaee5ea2212697e1e1d7ae"] -chardet = ["84ab92ed1c4d4f16916e05906b6b75a6c0fb5db821cc65e70cbd64a3e2a5eaae", "fc323ffcaeaed0e0a02bf4d117757b98aed530d9ed4531e3e15460124c106691"] +blessings = ["98e5854d805f50a5b58ac2333411b0482516a8210f23f43308baeb58d77c157d", "b1fdd7e7a675295630f9ae71527a8ebc10bfefa236b3d6aa4932ee4462c17ba3", "caad5211e7ba5afe04367cdd4cfc68fa886e2e08f6f35e76b7387d2109ccea6e"] +click = ["2335065e6395b9e67ca716de5f7526736bfa6ceead690adf616d925bdc622b13", "5b94b49521f6456670fdb30cd82a4eca9412788a93fa6dd6df72c94d5a8ff2d7"] +colorama = ["05eed71e2e327246ad6b38c540c4a3117230b19679b875190486ddd2d721422d", "f8ac84de7840f5b9c4e3347b3c1eaa50f7e49c2b07596221daec5edaabbd7c48"] +entrypoints = ["589f874b313739ad35be6e0cd7efde2a4e9b6fea91edcc34e58ecbb8dbe56d19", "c70dd71abe5a8c85e55e12c19bd91ccfeec11a6e99044204511f9ed547d48451"] feedparser = ["bd030652c2d08532c034c27fcd7c85868e7fa3cb2b17f230a44a6bbc92519bf9", "cd2485472e41471632ed3029d44033ee420ad0b57111db95c240c9160a85831c", "ce875495c90ebd74b179855449040003a1beb40cd13d5f037a0654251e260b02"] -fuzzywuzzy = ["5ac7c0b3f4658d2743aa17da53a55598144edbc5bee3c6863840636e6926f254", "6f49de47db00e1c71d40ad16da42284ac357936fa9b66bea1df63fed07122d62"] +flake8 = ["45681a117ecc81e870cbf1262835ae4af5e7a8b08e40b944a8a6e6b895914cfb", "49356e766643ad15072a789a20915d3c91dc89fd313ccd71802303fd67e4deca"] guessit = ["590cfaac6adbc65a0297f7b2a44c2accf2cc660eeed6283b43cbad30e65806e0"] -idna = ["c357b3f628cf53ae2c4c05627ecc484553142ca23264e593d327bcde5e9c3407", "ea8b7f6188e6fa117537c3df7da9fc686d485087abf6ac197f9c46432f7e4a3c"] +inquirer = ["5f6e5dcbc881f43554b6fdfea245e417c6ed05c930cdb6e09b5df7357c288e06", "c77fd8c3c053e1b4aa7ac1e0300cbdec5fe887e144d7bdb40f9f97f96a0eb909"] +mccabe = ["ab8a6258860da4b6677da4bd2fe5dc2c659cff31b3ee4f7f5d64e79735b80d42", "dd8d182285a0fe56bace7f45b5e7d1a6ebcbf524e8f3bd87eb0f125271b8831f"] +mypy = ["1521c186a3d200c399bd5573c828ea2db1362af7209b2adb1bb8532cea2fb36f", "31a046ab040a84a0fc38bc93694876398e62bc9f35eca8ccbf6418b7297f4c00", "3b1a411909c84b2ae9b8283b58b48541654b918e8513c20a400bb946aa9111ae", "48c8bc99380575deb39f5d3400ebb6a8a1cb5cc669bbba4d3bb30f904e0a0e7d", "540c9caa57a22d0d5d3c69047cc9dd0094d49782603eb03069821b41f9e970e9", "672e418425d957e276c291930a3921b4a6413204f53fe7c37cad7bc57b9a3391", "6ed3b9b3fdc7193ea7aca6f3c20549b377a56f28769783a8f27191903a54170f", "9371290aa2cad5ad133e4cdc43892778efd13293406f7340b9ffe99d5ec7c1d9", "ace6ac1d0f87d4072f05b5468a084a45b4eda970e4d26704f201e06d47ab2990", "b428f883d2b3fe1d052c630642cc6afddd07d5cd7873da948644508be3b9d4a7", "d5bf0e6ec8ba346a2cf35cb55bf4adfddbc6b6576fcc9e10863daa523e418dbb", "d7574e283f83c08501607586b3167728c58e8442947e027d2d4c7dcd6d82f453", "dc889c84241a857c263a2b1cd1121507db7d5b5f5e87e77147097230f374d10b", "f4748697b349f373002656bf32fede706a0e713d67bfdcf04edf39b1f61d46eb"] +mypy-extensions = ["090fedd75945a69ae91ce1303b5824f428daf5a028d2f6ab8a299250a846f15d", "2d82818f5bb3e369420cb3c4060a7970edba416647068eb4c5343488a6c604a8"] pycodestyle = ["95a2219d12372f05704562a14ec30bc76b05a5b297b21a5dfe3f6fac3491ae56", "e40a936c9a450ad81df37f549d676d127b1b66000a6c500caa2b085bc0ca976c"] +pyflakes = ["17dbeb2e3f4d772725c777fabc446d5634d1038f234e77343108ce445ea69ce0", "d976835886f8c5b31d47970ed689944a0262b5f3afa00a5a7b4dc81e5449f8a2"] python-dateutil = ["7e6584c74aeed623791615e26efd690f29817a27c73085b78e4bad02493df2fb", "c89805f6f4d64db21ed966fda138f8a5ed7a4fdbc1a8ee329ce1b74e3c74da9e"] -python-levenshtein = ["033a11de5e3d19ea25c9302d11224e1a1898fe5abd23c61c7c360c25195e3eb1"] +python-editor = ["1bf6e860a8ad52a14c3ee1252d5dc25b2030618ed80c022598f00176adc8367d", "51fda6bcc5ddbbb7063b2af7509e43bd84bfc32a4ff71349ec7847713882327b", "5f98b069316ea1c2ed3f67e7f5df6c0d8f10b689964a4a811ff64f0106819ec8", "c3da2053dbab6b29c94e43c486ff67206eafbe7eb52dbec7390b5e2fb05aac77", "ea87e17f6ec459e780e4221f295411462e0d0810858e055fc514684350a2f522"] +readchar = ["3ac34aab28563bc895f73233d5c08b28f951ca190d5850b8d4bec973132a8dca", "ed00b7a49bb12f345319d9fa393f289f03670310ada2beb55e8c3f017c648f1e"] rebulk = ["1d49e4f7ef6fb874e60efccacbbe661092fabdb7770cdf7f7de4516d50535998"] -requests = ["11e007a8a2aa0323f5a921e9e6a2d7e4e67d9877e85773fba9ba6419025cbeb4", "9cf5292fcd0f598c671cfc1e0d7d1a7f13bb8085e9a590f48c010551dc6c4b31"] six = ["3350809f0555b11f552448330d0b52d5f24c91a322ea4a15ef22629740f3761c", "d16a0141ec1a18405cd4ce8b4613101da75da0e9a7aec5bdd4fa804d0e0eba73"] -urllib3 = ["b246607a25ac80bedac05c6f282e3cdaf3afb65420fd024ac94435cabe6e18d1", "dbe59173209418ae49d485b87d1681aefa36252ee85884c31346debd19463232"] +typed-ast = ["1170afa46a3799e18b4c977777ce137bb53c7485379d9706af8a59f2ea1aa161", "18511a0b3e7922276346bcb47e2ef9f38fb90fd31cb9223eed42c85d1312344e", "262c247a82d005e43b5b7f69aff746370538e176131c32dda9cb0f324d27141e", "2b907eb046d049bcd9892e3076c7a6456c93a25bebfe554e931620c90e6a25b0", "354c16e5babd09f5cb0ee000d54cfa38401d8b8891eefa878ac772f827181a3c", "48e5b1e71f25cfdef98b013263a88d7145879fbb2d5185f2a0c79fa7ebbeae47", "4e0b70c6fc4d010f8107726af5fd37921b666f5b31d9331f0bd24ad9a088e631", "630968c5cdee51a11c05a30453f8cd65e0cc1d2ad0d9192819df9978984529f4", "66480f95b8167c9c5c5c87f32cf437d585937970f3fc24386f313a4c97b44e34", "71211d26ffd12d63a83e079ff258ac9d56a1376a25bc80b1cdcdf601b855b90b", "7954560051331d003b4e2b3eb822d9dd2e376fa4f6d98fee32f452f52dd6ebb2", "838997f4310012cf2e1ad3803bce2f3402e9ffb71ded61b5ee22617b3a7f6b6e", "95bd11af7eafc16e829af2d3df510cecfd4387f6453355188342c3e79a2ec87a", "bc6c7d3fa1325a0c6613512a093bc2a2a15aeec350451cbdf9e1d4bffe3e3233", "cc34a6f5b426748a507dd5d1de4c1978f2eb5626d51326e43280941206c209e1", "d755f03c1e4a51e9b24d899561fec4ccaf51f210d52abdf8c07ee2849b212a36", "d7c45933b1bdfaf9f36c579671fec15d25b06c8398f113dab64c18ed1adda01d", "d896919306dd0aa22d0132f62a1b78d11aaf4c9fc5b3410d3c666b818191630a", "fdc1c9bbf79510b76408840e009ed65958feba92a88833cdceecff93ae8fff66", "ffde2fbfad571af120fcbfbbc61c72469e72f550d676c3342492a9dfdefb8f12"] +typing-extensions = ["091ecc894d5e908ac75209f10d5b4f118fbdb2eb1ede6a63544054bb1edb41f2", "910f4656f54de5993ad9304959ce9bb903f90aadc7c67a0bef07e678014e892d", "cf8b63fedea4d89bab840ecbb93e75578af28f76f66c35889bd7065f5af88575"] diff --git a/pyproject.toml b/pyproject.toml index f218536..012bc0c 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -8,13 +8,19 @@ license = "MIT" [tool.poetry.dependencies] python = "^3.7" feedparser = "^5.2" -requests = "^2.22" guessit = "^3.0" -fuzzywuzzy = {version = "^0.17.0",extras = ["speedup"]} +inquirer = "^2.6" +click = "^7.0" +colorama = "^0.4.1" [tool.poetry.dev-dependencies] autopep8 = "^1.4" +mypy = "^0.740.0" +flake8 = "^3.7" +[tool.poetry.scripts] +nyaa-cli = 'nyaa' [build-system] requires = ["poetry>=0.12"] build-backend = "poetry.masonry.api" + diff --git a/renamer.py b/renamer.py deleted file mode 100644 index 244b1fc..0000000 --- a/renamer.py +++ /dev/null @@ -1,29 +0,0 @@ -import logging -import os - -from guessit import guessit - -logger = logging.getLogger('anime_renamer') -fh = logging.FileHandler('anime_renamer.log') -formatter = logging.Formatter('%(asctime)s - %(levelname)s - %(message)s') -fh.setLevel(logging.INFO) -fh.setFormatter(formatter) -logger.setLevel(logging.INFO) -logger.addHandler(fh) -logger.addHandler(logging.StreamHandler()) - -if __name__ == '__main__': - path = f"/home/john/Videos/Anime" - for file in os.listdir(path): - guess = guessit(file) - - title = guess.get('title') - season = f'S{guess.get("season")}' if guess.get("season") else '' - episode = f'E{guess.get("episode")}' if guess.get("episode") else '' - container = f'.{guess.get("container")}' if guess.get("container") else '' - episode_title = f' - {guess.get("episode_title")}' if guess.get("episode_title") else '' - - final = f"{title}{episode_title} {season}{episode}{container}" - os.rename(f"{path}/{file}", f"{path}/{final}") - logger.info(f"Renaming {path}/{file} to {path}/{final}") - logger.info("")