├── tests ├── __init__.py ├── unit │ ├── __init__.py │ ├── test_constants.py │ └── test_catalog.py ├── functional │ └── __init__.py └── conftest.py ├── springer ├── __version__.py ├── __init__.py ├── constants.py ├── urls.py ├── __main__.py └── catalog.py ├── .gitignore ├── demo ├── animations │ ├── list-books.gif │ ├── long-demo.gif │ ├── list-catalog.gif │ ├── list-packages.gif │ ├── download-books.gif │ ├── list-books-long.gif │ ├── download-catalog.gif │ ├── download-package.gif │ ├── list-catalog-long.gif │ ├── list-packages-long.gif │ ├── get-default-catalog.gif │ ├── set-default-catalog.gif │ ├── get-default-catalog.cast │ ├── list-catalog.cast │ ├── demo.py │ ├── download-books.cast │ ├── list-packages.cast │ ├── list-books-long.cast │ ├── Makefile │ ├── set-default-catalog.cast │ ├── download-package.cast │ ├── list-books.cast │ ├── list-catalog-long.cast │ └── list-packages-long.cast └── README.md ├── pyproject.toml ├── Makefile ├── README.md └── LICENSE /tests/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /tests/unit/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /tests/functional/__init__.py: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /springer/__version__.py: -------------------------------------------------------------------------------- 1 | __version__ = "0.17.0" 2 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | *.pdf 2 | *.epub 3 | dist/* 4 | *.egg-info/* 5 | DOWNLOAD_REPORT.txt 6 | tst.py 7 | .DS_Store 8 | -------------------------------------------------------------------------------- /demo/animations/list-books.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JnyJny/springer_downloader/HEAD/demo/animations/list-books.gif -------------------------------------------------------------------------------- /demo/animations/long-demo.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JnyJny/springer_downloader/HEAD/demo/animations/long-demo.gif -------------------------------------------------------------------------------- /demo/animations/list-catalog.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JnyJny/springer_downloader/HEAD/demo/animations/list-catalog.gif -------------------------------------------------------------------------------- /demo/animations/list-packages.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JnyJny/springer_downloader/HEAD/demo/animations/list-packages.gif -------------------------------------------------------------------------------- /demo/animations/download-books.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JnyJny/springer_downloader/HEAD/demo/animations/download-books.gif -------------------------------------------------------------------------------- /demo/animations/list-books-long.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JnyJny/springer_downloader/HEAD/demo/animations/list-books-long.gif -------------------------------------------------------------------------------- /demo/animations/download-catalog.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JnyJny/springer_downloader/HEAD/demo/animations/download-catalog.gif -------------------------------------------------------------------------------- /demo/animations/download-package.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JnyJny/springer_downloader/HEAD/demo/animations/download-package.gif -------------------------------------------------------------------------------- /demo/animations/list-catalog-long.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JnyJny/springer_downloader/HEAD/demo/animations/list-catalog-long.gif -------------------------------------------------------------------------------- /demo/animations/list-packages-long.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JnyJny/springer_downloader/HEAD/demo/animations/list-packages-long.gif -------------------------------------------------------------------------------- /demo/animations/get-default-catalog.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JnyJny/springer_downloader/HEAD/demo/animations/get-default-catalog.gif -------------------------------------------------------------------------------- /demo/animations/set-default-catalog.gif: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/JnyJny/springer_downloader/HEAD/demo/animations/set-default-catalog.gif -------------------------------------------------------------------------------- /springer/__init__.py: -------------------------------------------------------------------------------- 1 | """ 2 | """ 3 | 4 | from .catalog import Catalog 5 | from .constants import FileFormat, Language, Topic 6 | 7 | 8 | __all__ = [Catalog, FileFormat, Language, Topic] 9 | -------------------------------------------------------------------------------- /tests/conftest.py: -------------------------------------------------------------------------------- 1 | """ 2 | """ 3 | 4 | import pytest 5 | 6 | from typer.testing import CliRunner 7 | 8 | 9 | @pytest.fixture(scope="module") 10 | def CliRunner() -> CliRunner: 11 | return CliRunner() 12 | -------------------------------------------------------------------------------- /pyproject.toml: -------------------------------------------------------------------------------- 1 | [tool.poetry] 2 | name = "springer" 3 | version = "0.17.0" 4 | description = "Bulk Springer Textbook Downloader" 5 | authors = ["JnyJny "] 6 | license = "Apache-2.0" 7 | readme="README.md" 8 | repository="http://github.com/JnyJny/springer_downloader" 9 | 10 | [tool.poetry.scripts] 11 | springer="springer.__main__:cli" 12 | 13 | [tool.poetry.dependencies] 14 | python = "^3.7" 15 | pandas = "^1.0.3" 16 | xlrd = "^1.2.0" 17 | requests = "^2.23.0" 18 | typer = "^0.1.1" 19 | loguru = "^0.4.1" 20 | toml = "^0.10.0" 21 | 22 | [tool.poetry.dev-dependencies] 23 | pytest = "^5.4.1" 24 | typer = "^0.1.1" 25 | black = "^19.10b0" 26 | typer-cli = "^0.0.8" 27 | termtosvg = "^1.1.0" 28 | asciinema = "^2.0.2" 29 | 30 | [build-system] 31 | requires = ["poetry>=0.12"] 32 | build-backend = "poetry.masonry.api" 33 | -------------------------------------------------------------------------------- /springer/constants.py: -------------------------------------------------------------------------------- 1 | """ 2 | """ 3 | 4 | from enum import Enum 5 | 6 | 7 | class Token(str, Enum): 8 | """Unicode Tokens""" 9 | 10 | Stop = "\N{OCTAGONAL SIGN}" 11 | Package = "\N{PACKAGE}" 12 | Catalog = "\N{BOOKS}" 13 | Book = "\N{GREEN BOOK}" 14 | Empty = "\N{CLOSED BOOK}" 15 | 16 | def __str__(self): 17 | return self.value 18 | 19 | 20 | class FileFormat(str, Enum): 21 | """Supported file formats.""" 22 | 23 | pdf = "pdf" 24 | epub = "epub" 25 | 26 | @property 27 | def suffix(self): 28 | return f".{self.value}" 29 | 30 | 31 | class Language(str, Enum): 32 | """Supported languages.""" 33 | 34 | English: str = "en" 35 | German: str = "de" 36 | 37 | 38 | class Topic(str, Enum): 39 | """Catalog topics.""" 40 | 41 | All_Disciplines: str = "all" 42 | Emergency_Nursing: str = "med" 43 | 44 | 45 | class Component(str, Enum): 46 | """Catalog components.""" 47 | 48 | Catalogs = "catalogs" 49 | Catalog = "catalog" 50 | Packages = "packages" 51 | Package = "package" 52 | Books = "books" 53 | -------------------------------------------------------------------------------- /demo/animations/get-default-catalog.cast: -------------------------------------------------------------------------------- 1 | {"version": 2, "width": 103, "height": 66, "timestamp": 1587518890, "idle_time_limit": 0.5, "env": {"SHELL": "/bin/bash", "TERM": "xterm-256color"}} 2 | [0.011003, "o", "\u001b[?1034h$ "] 3 | [0.265863, "o", "s"] 4 | [0.305564, "o", "p"] 5 | [0.345187, "o", "r"] 6 | [0.455746, "o", "i"] 7 | [0.463493, "o", "n"] 8 | [0.578003, "o", "g"] 9 | [0.655706, "o", "e"] 10 | [0.682668, "o", "r"] 11 | [0.846452, "o", " "] 12 | [0.948706, "o", "g"] 13 | [1.123472, "o", "e"] 14 | [1.143416, "o", "t"] 15 | [1.318904, "o", "-"] 16 | [1.351295, "o", "d"] 17 | [1.475299, "o", "e"] 18 | [1.485016, "o", "f"] 19 | [1.535935, "o", "a"] 20 | [1.646612, "o", "u"] 21 | [1.727876, "o", "l"] 22 | [1.918894, "o", "t"] 23 | [1.955811, "o", "-"] 24 | [2.034805, "o", "c"] 25 | [2.064585, "o", "a"] 26 | [2.06938, "o", "t"] 27 | [2.131033, "o", "a"] 28 | [2.316566, "o", "l"] 29 | [2.468673, "o", "o"] 30 | [2.492156, "o", "g"] 31 | [2.64743, "o", "\r\n"] 32 | [3.683232, "o", "\u001b[32mDefault: 📚|en-all\u001b[0m\r\n"] 33 | [3.736483, "o", "$ "] 34 | [4.151102, "o", "e"] 35 | [4.313975, "o", "x"] 36 | [4.431265, "o", "i"] 37 | [4.589209, "o", "t"] 38 | [4.68461, "o", "\r\n"] 39 | [4.684861, "o", "exit\r\n"] 40 | -------------------------------------------------------------------------------- /springer/urls.py: -------------------------------------------------------------------------------- 1 | """Springer URLS 2 | 3 | """ 4 | 5 | from .constants import Language, Topic, FileFormat 6 | 7 | SPRINGER_ANNOUNCEMENT_URL = "https://www.springernature.com/gp/librarians/news-events/all-news-articles/industry-news-initiatives/free-access-to-textbooks-for-institutions-affected-by-coronaviru/17855960" 8 | 9 | SPRINGER_REST_URL = "https://resource-cms.springernature.com/springer-cms/rest" 10 | 11 | SPRINGER_CATALOG_EN_URL = f"{SPRINGER_REST_URL}/v1/content/17858272/data/v8" 12 | SPRINGER_CATALOG_DE_URL = f"{SPRINGER_REST_URL}/v1/content/17863240/data/v3" 13 | SPRINGER_NURSING_CATALOG_DE_URL = f"{SPRINGER_REST_URL}/v1/content/17856246/data/v3" 14 | 15 | SPRINGER_PDF_URL = "https://link.springer.com/content/pdf" 16 | SPRINGER_EPUB_URL = "https://link.springer.com/download/epub" 17 | 18 | 19 | urls = { 20 | "announcement": SPRINGER_ANNOUNCEMENT_URL, 21 | "catalogs": { 22 | Language.English: {Topic.All_Disciplines: SPRINGER_CATALOG_EN_URL}, 23 | Language.German: { 24 | Topic.All_Disciplines: SPRINGER_CATALOG_DE_URL, 25 | Topic.Emergency_Nursing: SPRINGER_NURSING_CATALOG_DE_URL, 26 | }, 27 | }, 28 | "content": {FileFormat.pdf: SPRINGER_PDF_URL, FileFormat.epub: SPRINGER_EPUB_URL,}, 29 | } 30 | -------------------------------------------------------------------------------- /demo/animations/list-catalog.cast: -------------------------------------------------------------------------------- 1 | {"version": 2, "width": 103, "height": 66, "timestamp": 1587519711, "idle_time_limit": 0.5, "env": {"SHELL": "/bin/bash", "TERM": "xterm-256color"}} 2 | [0.010327, "o", "\u001b[?1034h$ "] 3 | [0.331995, "o", "s"] 4 | [0.444006, "o", "p"] 5 | [0.54144, "o", "r"] 6 | [0.586564, "o", "i"] 7 | [0.654954, "o", "n"] 8 | [0.827797, "o", "g"] 9 | [0.926395, "o", "e"] 10 | [0.998644, "o", "r"] 11 | [1.019846, "o", " "] 12 | [1.105172, "o", "l"] 13 | [1.151896, "o", "i"] 14 | [1.32649, "o", "s"] 15 | [1.414601, "o", "t"] 16 | [1.417493, "o", " "] 17 | [1.466418, "o", "c"] 18 | [1.576696, "o", "a"] 19 | [1.769622, "o", "t"] 20 | [1.85985, "o", "a"] 21 | [1.873143, "o", "l"] 22 | [2.060485, "o", "o"] 23 | [2.236552, "o", "g"] 24 | [2.368946, "o", "\r\n"] 25 | [2.98188, "o", "📚|en-all|URL|https://resource-cms.springernature.com/springer-cms/rest/v1/content/17858272/data/v4\r\n"] 26 | [2.982361, "o", "📚|en-all|Default|True\r\n📚|en-all|Cache|/Users/ejo/Library/Application Support/springer/catalog-en-all.csv\r\n"] 27 | [3.001537, "o", "📚|en-all|Packages|21\r\n📚|en-all|Books|407\r\n🛑|en-all\r\n"] 28 | [3.054203, "o", "$ "] 29 | [3.874681, "o", "e"] 30 | [4.068737, "o", "x"] 31 | [4.180495, "o", "i"] 32 | [4.358507, "o", "t"] 33 | [4.550332, "o", "\r\n"] 34 | [4.550569, "o", "exit\r\n"] 35 | -------------------------------------------------------------------------------- /demo/README.md: -------------------------------------------------------------------------------- 1 | ## Springer Subcommand Demonstrations 2 | 3 | ![springer download books -n python](https://github.com/JnyJny/springer_downloader/raw/master/demo/animations/download-books.gif) 4 | 5 | ![download-catalog](https://github.com/JnyJny/springer_downloader/raw/master/demo/animations/download-catalog.gif) 6 | ![download-package](https://github.com/JnyJny/springer_downloader/raw/master/demo/animations/download-package.gif) 7 | ![get-default-catalog](https://github.com/JnyJny/springer_downloader/raw/master/demo/animations/get-default-catalog.gif) 8 | ![list-books-long](https://github.com/JnyJny/springer_downloader/raw/master/demo/animations/list-books-long.gif) 9 | ![list-books](https://github.com/JnyJny/springer_downloader/raw/master/demo/animations/list-books.gif) 10 | ![list-catalog-long](https://github.com/JnyJny/springer_downloader/raw/master/demo/animations/list-catalog-long.gif) 11 | ![list-catalog](https://github.com/JnyJny/springer_downloader/raw/master/demo/animations/list-catalog.gif) 12 | ![list-packages-long](https://github.com/JnyJny/springer_downloader/raw/master/demo/animations/list-packages-long.gif) 13 | ![list-packages](https://github.com/JnyJny/springer_downloader/raw/master/demo/animations/list-packages.gif) 14 | ![long-demo](https://github.com/JnyJny/springer_downloader/raw/master/demo/animations/long-demo.gif) 15 | ![set-default-catalog](https://github.com/JnyJny/springer_downloader/raw/master/demo/animations/set-default-catalog.gif) 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | -------------------------------------------------------------------------------- /tests/unit/test_constants.py: -------------------------------------------------------------------------------- 1 | """ 2 | """ 3 | 4 | import pytest 5 | 6 | from springer.constants import FileFormat 7 | from springer.constants import Language 8 | from springer.constants import Topic 9 | from springer.constants import Component 10 | 11 | from enum import Enum 12 | 13 | 14 | @pytest.mark.parametrize("constant_class", [FileFormat, Language, Topic, Component]) 15 | def test_constant_class_issubclass_enum(constant_class): 16 | assert issubclass(constant_class, Enum) 17 | 18 | 19 | def test_file_format_constants(): 20 | 21 | assert FileFormat.pdf.name == "pdf" 22 | assert FileFormat.pdf.value == "pdf" 23 | assert FileFormat.epub.name == "epub" 24 | assert FileFormat.epub.value == "epub" 25 | 26 | 27 | def test_language_constants(): 28 | 29 | assert Language.English.name == "English" 30 | assert Language.English.value == "en" 31 | assert Language.German.name == "German" 32 | assert Language.German.value == "de" 33 | 34 | 35 | def test_topic_constants(): 36 | 37 | assert Topic.All_Disciplines.name == "All_Disciplines" 38 | assert Topic.All_Disciplines.value == "all" 39 | assert Topic.Emergency_Nursing.name == "Emergency_Nursing" 40 | assert Topic.Emergency_Nursing.value == "med" 41 | 42 | 43 | def test_component_constants(): 44 | 45 | assert Component.Books == "books" 46 | assert Component.Packages == "packages" 47 | assert Component.Package == "package" 48 | assert Component.Catalog == "catalog" 49 | assert Component.Catalogs == "catalogs" 50 | -------------------------------------------------------------------------------- /demo/animations/demo.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | 3 | """ 4 | Demo Echoing 5 | 6 | Argv is a list of strings, each of which have embedded semicolons 7 | indicating the end of a command. 8 | 9 | Echos the "commands" to stdout using random jitter to simulate 10 | being typed by a person. 11 | 12 | Runs the command in a subprocess homed in /tmp to time the 13 | echoing of the next command. 14 | 15 | This a hack. 16 | """ 17 | 18 | import subprocess 19 | 20 | from random import random, choice 21 | from sys import argv 22 | from time import sleep 23 | from string import printable 24 | 25 | 26 | def delayed_echo(v) -> None: 27 | """ 28 | """ 29 | print(v, sep="", end="", flush=True) 30 | sleep(random() / 3) 31 | 32 | 33 | def do_typo(): 34 | """ 35 | """ 36 | delayed_echo(choice(printable)) 37 | delayed_echo("") 38 | 39 | 40 | if __name__ == "__main__": 41 | 42 | cmds = [] 43 | 44 | for arg in argv[1:]: 45 | for c in arg.strip().split(";"): 46 | c = c.strip() 47 | if not len(c): 48 | continue 49 | cmds.append(c) 50 | 51 | if not cmds[-1].startswith("exit"): 52 | cmds.append("exit") 53 | 54 | for cmd in cmds: 55 | 56 | try: 57 | sleep(float(cmd)) 58 | continue 59 | except ValueError: 60 | sleep(0.2) 61 | 62 | # echo the command to stdout with a random cadence 63 | 64 | for c in cmd: 65 | if random() <= 0.05: 66 | do_typo() 67 | delayed_echo(c) 68 | print(flush=True) 69 | -------------------------------------------------------------------------------- /Makefile: -------------------------------------------------------------------------------- 1 | 2 | TARGET=springer 3 | 4 | VERSION_FILE= $(TARGET)/__version__.py 5 | 6 | .PHONY: $(VERSION_FILE) tag bump push update_pyproject README.md 7 | 8 | all: 9 | @echo $(TARGET) release automation 10 | @echo 11 | @echo "patch_release - updates version and publishes" 12 | @echo "major_release - updates version and publishes" 13 | @echo "minor_release - updates version and publishes" 14 | @echo 15 | @echo "release - performs a patch_release" 16 | @echo 17 | @echo "MAJOR - updates version major number" 18 | @echo "MINOR - updates version minor number" 19 | @echo "PATCH - updates version patch number" 20 | @echo "major - commits version update to git and tags" 21 | @echo "minor - commits version update to git and tags" 22 | @echo "patch - commits version update to git and tags" 23 | @echo "update - updates __version__.py, commits and tags" 24 | @echo "push - pushes commits and tags to origin/master" 25 | @echo 26 | @echo "clean - cleans up report files and/or directories" 27 | 28 | README.md: 29 | typer $(TARGET).__main__ utils docs --name $(TARGET) --output $@ 30 | sed -i '' -e "s///g" $@ 31 | 32 | MAJOR: 33 | @poetry version major 34 | 35 | MINOR: 36 | @poetry version minor 37 | 38 | PATCH: 39 | @poetry version patch 40 | 41 | major: MAJOR update 42 | 43 | minor: MINOR update 44 | 45 | patch: PATCH update 46 | 47 | 48 | version_file: $(VERSION_FILE) 49 | $(VERSION_FILE): 50 | @awk '/^version/ {print $$0}' pyproject.toml | sed "s/version/__version__/" > $@ 51 | 52 | update: $(VERSION_FILE) 53 | @git add pyproject.toml $(VERSION_FILE) 54 | @awk '{print $$3}' $(VERSION_FILE) | xargs git commit -m 55 | @awk '{print $$3}' $(VERSION_FILE) | xargs git tag 56 | 57 | 58 | push: 59 | @git push --tags origin master 60 | 61 | publish: 62 | @poetry build 63 | @poetry publish 64 | 65 | 66 | patch_release: patch push publish 67 | 68 | major_release: major push publish 69 | 70 | minor_release: minor push publish 71 | 72 | release: patch_release 73 | 74 | demo: 75 | @make -C demo 76 | 77 | 78 | clean: 79 | @/bin/rm -rf *.pdf *.epub DOWNLOAD_REPORT.txt *.cast 80 | @make -C demo clean 81 | -------------------------------------------------------------------------------- /demo/animations/download-books.cast: -------------------------------------------------------------------------------- 1 | {"version": 2, "width": 103, "height": 66, "timestamp": 1587525900, "idle_time_limit": 0.5, "env": {"SHELL": "/bin/bash", "TERM": "xterm-256color"}} 2 | [0.010279, "o", "\u001b[?1034h$ "] 3 | [0.324004, "o", "s"] 4 | [0.48734, "o", "p"] 5 | [0.646571, "o", "r"] 6 | [0.652933, "o", "i"] 7 | [0.812063, "o", "n"] 8 | [0.987862, "o", "g"] 9 | [1.145627, "o", "e"] 10 | [1.175284, "o", "r"] 11 | [1.268293, "o", " "] 12 | [1.412146, "o", "d"] 13 | [1.435862, "o", "o"] 14 | [1.580559, "o", "w"] 15 | [1.672243, "o", "n"] 16 | [1.749619, "o", "l"] 17 | [1.849676, "o", "o"] 18 | [1.9329, "o", "a"] 19 | [2.013034, "o", "d"] 20 | [2.030508, "o", " "] 21 | [2.058522, "o", "b"] 22 | [2.187146, "o", "o"] 23 | [2.32515, "o", "o"] 24 | [2.333044, "o", "k"] 25 | [2.449711, "o", "s"] 26 | [2.619691, "o", " "] 27 | [2.769179, "o", "-"] 28 | [2.858069, "o", "n"] 29 | [2.941844, "o", " "] 30 | [3.025083, "o", "p"] 31 | [3.166402, "o", "y"] 32 | [3.325177, "o", "t"] 33 | [3.520912, "o", "h"] 34 | [3.538531, "o", "o"] 35 | [3.564633, "o", "n"] 36 | [3.622433, "o", "\r\n"] 37 | [20.229702, "o", "\r\u001b[?25len-all:pdf [📗📕📕📕📕📕📕📕📕📕] 1/8 00:01:51 A Beginners Guide to"] 38 | [24.076445, "o", "\r\u001b[?25len-all:pdf [📗📗📕📕📕📕📕📕📕📕] 2/8 00:01:17 A Primer on Scientif"] 39 | [29.832222, "o", "\r\u001b[?25len-all:pdf [📗📗📗📕📕📕📕📕📕📕] 3/8 00:00:57 Advanced Guide to Py"] 40 | [35.848547, "o", "\r\u001b[?25len-all:pdf [📗📗📗📗📗📕📕📕📕📕] 4/8 00:00:42 Data Structures and "] 41 | [43.54246, "o", "\r\u001b[?25len-all:pdf [📗📗📗📗📗📗📕📕📕📕] 5/8 00:00:30 Elementary Mechanics"] 42 | [48.190715, "o", "\r\u001b[?25len-all:pdf [📗📗📗📗📗📗📗📕📕📕] 6/8 00:00:19 Python For ArcGIS "] 43 | [49.416772, "o", "\r\u001b[?25len-all:pdf [📗📗📗📗📗📗📗📗📕📕] 7/8 00:00:09 Python Programming F"] 44 | [56.721208, "o", "\r\u001b[?25len-all:pdf [📗📗📗📗📗📗📗📗📗📗] 8/8 The Python Workbook "] 45 | [56.721469, "o", "\r\u001b[?25len-all:pdf [📗📗📗📗📗📗📗📗📗📗] 8/8 \u001b[?25h\r\n"] 46 | [56.775881, "o", "$ "] 47 | [304.114839, "o", "e"] 48 | [304.154364, "o", "x"] 49 | [304.213517, "o", "i"] 50 | [304.272518, "o", "t"] 51 | [304.397005, "o", "\r\n"] 52 | [304.397259, "o", "exit\r\n"] 53 | -------------------------------------------------------------------------------- /demo/animations/list-packages.cast: -------------------------------------------------------------------------------- 1 | {"version": 2, "width": 103, "height": 66, "timestamp": 1587519909, "idle_time_limit": 0.5, "env": {"SHELL": "/bin/bash", "TERM": "xterm-256color"}} 2 | [0.010133, "o", "\u001b[?1034h$ "] 3 | [0.328856, "o", "s"] 4 | [0.515717, "o", "p"] 5 | [0.625174, "o", "r"] 6 | [0.775153, "o", "i"] 7 | [0.79578, "o", "n"] 8 | [0.836999, "o", "g"] 9 | [0.98805, "o", "e"] 10 | [1.078758, "o", "r"] 11 | [1.218114, "o", " "] 12 | [1.295452, "o", "l"] 13 | [1.489165, "o", "i"] 14 | [1.681102, "o", "s"] 15 | [1.755715, "o", "t"] 16 | [1.916891, "o", " "] 17 | [2.071654, "o", "p"] 18 | [2.152993, "o", "a"] 19 | [2.196846, "o", "c"] 20 | [2.254846, "o", "k"] 21 | [2.320189, "o", "a"] 22 | [2.403628, "o", "g"] 23 | [2.481006, "o", "e"] 24 | [2.612138, "o", "s"] 25 | [2.636699, "o", "\r\n"] 26 | [3.269881, "o", "📦|11640|Name|Behavioral Science\r\n"] 27 | [3.270064, "o", "📦|41168|Name|Behavioral Science and Psychology\r\n"] 28 | [3.270237, "o", "📦|11642|Name|Biomedical and Life Sciences\r\n"] 29 | [3.270426, "o", "📦|11643|Name|Business and Economics\r\n"] 30 | [3.270598, "o", "📦|41169|Name|Business and Management\r\n"] 31 | [3.270735, "o", "📦|11644|Name|Chemistry and Materials Science\r\n"] 32 | [3.270963, "o", "📦|11645|Name|Computer Science\r\n"] 33 | [3.2711, "o", "📦|11646|Name|Earth and Environmental Science\r\n"] 34 | [3.271353, "o", "📦|41170|Name|Economics and Finance\r\n"] 35 | [3.271518, "o", "📦|41171|Name|Education\r\n"] 36 | [3.271679, "o", "📦|40367|Name|Energy\r\n"] 37 | [3.271896, "o", "📦|11647|Name|Engineering\r\n"] 38 | [3.272058, "o", "📦|11648|Name|Humanities, Social Sciences and Law\r\n"] 39 | [3.272188, "o", "📦|42732|Name|Intelligent Technologies and Robotics\r\n"] 40 | [3.272412, "o", "📦|41177|Name|Law and Criminology\r\n"] 41 | [3.272517, "o", "📦|41173|Name|Literature, Cultural and Media Studies\r\n"] 42 | [3.272677, "o", "📦|11649|Name|Mathematics and Statistics\r\n"] 43 | [3.272811, "o", "📦|11650|Name|Medicine\r\n"] 44 | [3.272981, "o", "📦|11651|Name|Physics and Astronomy\r\n"] 45 | [3.273154, "o", "📦|41175|Name|Religion and Philosophy\r\n"] 46 | [3.27331, "o", "📦|41176|Name|Social Sciences\r\n"] 47 | [3.32347, "o", "$ "] 48 | [4.142902, "o", "e"] 49 | [4.236919, "o", "x"] 50 | [4.263717, "o", "i"] 51 | [4.454522, "o", "t"] 52 | [4.546906, "o", "\r\n"] 53 | [4.54715, "o", "exit\r\n"] 54 | -------------------------------------------------------------------------------- /tests/unit/test_catalog.py: -------------------------------------------------------------------------------- 1 | """ 2 | """ 3 | 4 | import pytest 5 | 6 | from pathlib import Path 7 | from pandas import DataFrame 8 | 9 | from springer.catalog import Catalog 10 | from springer.constants import Language, Topic 11 | 12 | 13 | @pytest.fixture(scope="module") 14 | def CATALOG(): 15 | return Catalog() 16 | 17 | 18 | def test_creating_catalog_no_args(): 19 | 20 | catalog = Catalog() 21 | assert catalog 22 | assert isinstance(catalog, Catalog) 23 | 24 | 25 | @pytest.mark.parametrize( 26 | "lang,cat", 27 | [ 28 | (Language.English, Topic.All_Disciplines), 29 | (Language.German, Topic.All_Disciplines), 30 | (Language.German, Topic.Emergency_Nursing), 31 | ], 32 | ) 33 | def test_creating_catalog_with_args_xpass(lang, cat): 34 | 35 | catalog = Catalog(lang, cat) 36 | assert catalog 37 | assert isinstance(catalog, Catalog) 38 | assert catalog.language == lang 39 | assert catalog.topic == cat 40 | 41 | 42 | @pytest.mark.parametrize( 43 | "lang,cat", [(Language.English, Topic.Emergency_Nursing),], 44 | ) 45 | def test_creating_catalog_with_args_xfail(lang, cat): 46 | 47 | with pytest.raises(KeyError): 48 | catalog = Catalog(lang, cat) 49 | 50 | 51 | @pytest.mark.parametrize( 52 | "prop_name,prop_type", 53 | [ 54 | ("name", str), 55 | ("is_default", bool), 56 | ("language", Language), 57 | ("topic", Topic), 58 | ("url", str), 59 | ("config_dir", Path), 60 | ("defaults_file", Path), 61 | ("defaults", dict), 62 | ("cache_file", Path), 63 | ("ttable", dict), 64 | ("dataframe", DataFrame), 65 | ("packages", dict), 66 | ], 67 | ) 68 | def test_catalog_property_existence_and_type(prop_name, prop_type, CATALOG): 69 | 70 | value = getattr(CATALOG, prop_name) 71 | assert isinstance(value, prop_type) 72 | 73 | 74 | @pytest.mark.parametrize( 75 | "method_name", 76 | [ 77 | "__repr__", 78 | "__str__", 79 | "__iter__", 80 | "__eq__", 81 | "all_catalogs", 82 | "content_url", 83 | "save_defaults", 84 | "fetch_catalog", 85 | "textbooks", 86 | "download_textbook", 87 | "download_dataframe", 88 | "download_dataframe_animated", 89 | "download_title", 90 | "download_package", 91 | "download", 92 | "list_dataframe", 93 | "list_textbooks", 94 | "list_package", 95 | "list_packages", 96 | "list_catalog", 97 | ], 98 | ) 99 | def test_catalog_method_existence(method_name, CATALOG): 100 | 101 | method = getattr(CATALOG, method_name) 102 | assert callable(method) 103 | 104 | 105 | def test_catalog_classmethod_all_catalogs(): 106 | 107 | for catalog in Catalog.all_catalogs(): 108 | assert isinstance(catalog, Catalog) 109 | -------------------------------------------------------------------------------- /demo/animations/list-books-long.cast: -------------------------------------------------------------------------------- 1 | {"version": 2, "width": 103, "height": 66, "timestamp": 1587579480, "idle_time_limit": 0.5, "env": {"SHELL": "/bin/bash", "TERM": "xterm-256color"}} 2 | [0.012323, "o", "\u001b[?1034h$ "] 3 | [0.332735, "o", "s"] 4 | [0.522236, "o", "p"] 5 | [0.632587, "o", "r"] 6 | [0.687265, "o", "i"] 7 | [0.857397, "o", "n"] 8 | [1.044178, "o", "g"] 9 | [1.157576, "o", "e"] 10 | [1.22962, "o", "r"] 11 | [1.388822, "o", " "] 12 | [1.584604, "o", "l"] 13 | [1.751559, "o", "i"] 14 | [1.952067, "o", "s"] 15 | [2.126765, "o", "t"] 16 | [2.161412, "o", " "] 17 | [2.185147, "o", "b"] 18 | [2.322314, "o", "o"] 19 | [2.381501, "o", "o"] 20 | [2.497441, "o", "k"] 21 | [2.550818, "o", "s"] 22 | [2.55843, "o", " "] 23 | [2.717616, "o", "-"] 24 | [2.806932, "o", "n"] 25 | [2.817965, "o", " "] 26 | [2.922357, "o", "'"] 27 | [3.059088, "o", "A"] 28 | [3.236432, "o", " "] 29 | [3.322331, "o", "B"] 30 | [3.468457, "o", "e"] 31 | [3.58035, "o", "g"] 32 | [3.674268, "o", "i"] 33 | [3.695845, "o", "n"] 34 | [3.888441, "o", "n"] 35 | [3.947649, "o", "e"] 36 | [4.13851, "o", "r"] 37 | [4.18244, "o", "s"] 38 | [4.278104, "o", " "] 39 | [4.317162, "o", "G"] 40 | [4.322383, "o", "u"] 41 | [4.430235, "o", "i"] 42 | [4.510213, "o", "d"] 43 | [4.668539, "o", "e"] 44 | [4.826796, "o", " "] 45 | [4.855467, "o", "t"] 46 | [5.001901, "o", "o"] 47 | [5.175913, "o", " "] 48 | [5.374346, "o", "P"] 49 | [5.5784, "o", "y"] 50 | [5.662699, "o", "t"] 51 | [5.809722, "o", "h"] 52 | [5.846145, "o", "o"] 53 | [5.898475, "o", "n"] 54 | [5.951888, "o", " "] 55 | [5.968552, "o", "3"] 56 | [6.137601, "o", " "] 57 | [6.298093, "o", "P"] 58 | [6.407523, "o", "r"] 59 | [6.602262, "o", "o"] 60 | [6.722349, "o", "g"] 61 | [6.847052, "o", "r"] 62 | [6.922258, "o", "a"] 63 | [7.055538, "o", "m"] 64 | [7.070165, "o", "m"] 65 | [7.216993, "o", "i"] 66 | [7.367678, "o", "n"] 67 | [7.442343, "o", "g"] 68 | [7.536294, "o", "'"] 69 | [7.721108, "o", " "] 70 | [7.853599, "o", "-"] 71 | [8.051168, "o", "l"] 72 | [8.245334, "o", "\r\n"] 73 | [8.878751, "o", "📗|978-3-030-20290-3|Title|A Beginners Guide to Python 3 Programming\r\n📗|978-3-030-20290-3|Author|John Hunt\r\n📗|978-3-030-20290-3|Edition|1st ed. 2019\r\n📗|978-3-030-20290-3|Product Type|Undergraduate textbook\r\n📗|978-3-030-20290-3|Copyright Year|2019\r\n📗|978-3-030-20290-3|Copyright Holder|Springer Nature Switzerland AG\r\n📗|978-3-030-20290-3|Print Isbn|978-3-030-20289-7\r\n📗|978-3-030-20290-3|Electronic Isbn|978-3-030-20290-3\r\n📗|978-3-030-20290-3|Language|EN\r\n📗|978-3-030-20290-3|Language Collection|English/International\r\n📗|978-3-030-20290-3|Ebook Package|11645\r\n📗|978-3-030-20290-3|English Package Name|Computer Science\r\n📗|978-3-030-20290-3|Doi Url|http://doi.org/10.1007/978-3-030-20290-3\r\n📗|978-3-030-20290-3|Openurl|http://link.springer.com/openurl?genre=book&isbn=978-3-030-20290-3\r\n📗|978-3-030-20290-3|Subject Classification|Computer Science; Programming Languages, Compilers, Interpreters; Python; Database Management\r\n📗|978-3-030-20290-3|Publisher|Springer International Pu"] 74 | [8.87897, "o", "blishing\r\n📗|978-3-030-20290-3|Imprint|Springer\r\n📗|978-3-030-20290-3|Package Name|Computer Science\r\n📗|978-3-030-20290-3|Uid|10.1007/978-3-030-20290-3\r\n📗|978-3-030-20290-3|Filename|A_Beginners_Guide_to_Python_3_Programming-10-1007-978-3-030-20290-3\r\n🛑|978-3-030-20290-3|Title|A Beginners Guide to Python 3 Programming\r\n"] 75 | [8.928331, "o", "$ "] 76 | [11.748995, "o", "e"] 77 | [11.876252, "o", "x"] 78 | [11.975104, "o", "i"] 79 | [11.99343, "o", "t"] 80 | [12.128635, "o", "\r\n"] 81 | [12.128811, "o", "exit\r\n"] 82 | -------------------------------------------------------------------------------- /demo/animations/Makefile: -------------------------------------------------------------------------------- 1 | # demo/Makefile - create GIF animations to demonstrate 2 | # how to use the springer texbook download tool 3 | # 4 | # *automagically* 5 | 6 | SPRINGER= springer 7 | 8 | TARGETS = get-default-catalog 9 | TARGETS+= set-default-catalog 10 | TARGETS+= list-catalog 11 | TARGETS+= list-catalog-long 12 | TARGETS+= list-packages 13 | TARGETS+= list-packages-long 14 | TARGETS+= list-books 15 | TARGETS+= list-books-long 16 | TARGETS+= download-catalog 17 | TARGETS+= download-package 18 | TARGETS+= download-books 19 | 20 | 21 | CASTS= $(TARGETS:=.cast) 22 | GIFS= $(TARGETS:=.gif) 23 | 24 | PLAY= ./demo.py "$1" 25 | 26 | RFLAGS= -i 0.5 --overwrite -q 27 | 28 | RECORD= asciinema rec $1 $(RFLAGS) 29 | 30 | SPEEDUP= asciinema rec -c 'asciinema play -i 1 -s $1 $2' $2.fast 31 | 32 | CAST2GIF= asciicast2gif 33 | C2GFLAGS= -s 5 -w 100 34 | 35 | GET_DEFAULT_CATALOG_SCRIPT=springer get-default-catalog;1; 36 | 37 | SET_DEFAULT_CATALOG_SCRIPT+=springer --language de set-default-catalog;1; 38 | SET_DEFAULT_CATALOG_SCRIPT+=springer --language en set-default-catalog;1; 39 | SET_DEFAULT_CATALOG_SCRIPT+=springer --language de --topic med set-default-catalog;1; 40 | SET_DEFAULT_CATALOG_SCRIPT+=springer --language en --topic all set-default-catalog;1; 41 | 42 | LIST_CATALOG_SCRIPT=springer list catalog;1; 43 | LIST_CATALOG_LONG_SCRIPT=springer list catalog -l;2; 44 | 45 | LIST_PACKAGES_SCRIPT=springer list packages;1; 46 | LIST_PACKAGES_LONG_SCRIPT=springer list packages -l;2; 47 | 48 | LIST_PACAKGE_SCRIPT=springer list package -n science;1; 49 | LIST_PACAKGE_LONG_SCRIPT=springer list package -n 'Economics and Finance' -l;1; 50 | 51 | LIST_BOOKS_SCRIPT=springer list books;2; 52 | LIST_BOOKS_LONG_SCRIPT=springer list books -n 'A Beginners Guide to Python 3 Programming' -l;1; 53 | 54 | DOWNLOAD_CATALOG_SCRIPT=springer download catalog;1200; 55 | DOWNLOAD_PACKAGE_SCRIPT=springer download package -n 'Computer Science';300; 56 | DOWNLOAD_BOOKS_SCRIPT=springer download books -n python;240; 57 | 58 | LONG_DEMO_SCRIPT= springer get-default-catalog;1; 59 | LONG_DEMO_SCRIPT+= springer list catalog;1; 60 | LONG_DEMO_SCRIPT+= springer list packages;1; 61 | LONG_DEMO_SCRIPT+= springer list packages -n 'Computer Science' -l;2; 62 | LONG_DEMO_SCRIPT+= springer download books -n 'python' -f epub -d epubs ;240; 63 | 64 | all: $(GIFS) 65 | 66 | get-default-catalog.cast: 67 | @$(call PLAY,$(GET_DEFAULT_CATALOG_SCRIPT)) | $(call RECORD,$@) 68 | 69 | get-default-catalog.gif: get-default-catalog.cast clean_fast 70 | $(call SPEEDUP,0.5,$<) 71 | @$(CAST2GIF) $(C2GFLAGS) -h 3 $<.fast $@ 72 | 73 | set-default-catalog.cast: 74 | @springer -L en -T all set-default-catalog > /dev/null 75 | @$(call PLAY,$(SET_DEFAULT_CATALOG_SCRIPT)) | $(call RECORD,$@) 76 | @springer -L en -T all set-default-catalog > /dev/null 77 | 78 | set-default-catalog.gif: set-default-catalog.cast clean_fast 79 | $(call SPEEDUP,0.5,$<) 80 | @springer -L en -T all set-default-catalog 81 | @$(CAST2GIF) $(C2GFLAGS) -h 12 $<.fast $@ 82 | 83 | list-catalog.cast: 84 | @$(call PLAY,$(LIST_CATALOG_SCRIPT)) | $(call RECORD,$@) 85 | 86 | list-catalog.gif: list-catalog.cast clean_fast 87 | $(call SPEEDUP,0.5,$<) 88 | @$(CAST2GIF) $(C2GFLAGS) -h 6 $<.fast $@ 89 | 90 | list-catalog-long.cast: 91 | @$(call PLAY,$(LIST_CATALOG_LONG_SCRIPT)) | $(call RECORD,$@) 92 | 93 | list-catalog-long.gif: list-catalog-long.cast 94 | @$(CAST2GIF) $(C2GFLAGS) -h 10 $< $@ 95 | 96 | list-packages.cast: 97 | @$(call PLAY,$(LIST_PACKAGES_SCRIPT)) | $(call RECORD,$@) 98 | 99 | list-packages.gif: list-packages.cast clean_fast 100 | $(call SPEEDUp,0.5,$<) 101 | @$(CAST2GIF) $(C2GFLAGS) -h 23 $<.fast $@ 102 | 103 | list-packages-long.cast: 104 | @$(call PLAY,$(LIST_PACKAGES_LONG_SCRIPT)) | $(call RECORD,$@) 105 | 106 | list-packages-long.gif: list-packages-long.cast 107 | @$(CAST2GIF) $(C2GFLAGS) -h 10 $< $@ 108 | 109 | list-package.cast: 110 | @$(call PLAY,$(LIST_PACKAGE_SCRIPT)) | $(call RECORD,$@) 111 | 112 | list-package.gif: list-package.cast clean_fast 113 | $(call SPEEDUp,0.5,$<) 114 | @$(CAST2GIF) $(C2GFLAGS) -h 23 $<.fast $@ 115 | 116 | list-package-long.cast: 117 | @$(call PLAY,$(LIST_PACKAGE_LONG_SCRIPT)) | $(call RECORD,$@) 118 | 119 | list-package-long.gif: list-package-long.cast 120 | @$(CAST2GIF) $(C2GFLAGS) -h 10 $< $@ 121 | 122 | list-books.cast: 123 | @$(call PLAY,$(LIST_BOOKS_SCRIPT)) | $(call RECORD,$@) 124 | 125 | list-books.gif: list-books.cast 126 | @$(CAST2GIF) $(C2GFLAGS) -h 10 $< $@ 127 | 128 | list-books-long.cast: 129 | @$(call PLAY,$(LIST_BOOKS_LONG_SCRIPT)) | $(call RECORD,$@) 130 | 131 | list-books-long.gif: list-books-long.cast 132 | @$(CAST2GIF) $(C2GFLAGS) -h 23 $< $@ 133 | 134 | download-catalog.cast: 135 | @$(call PLAY,$(DOWNLOAD_CATALOG_SCRIPT)) | $(call RECORD,$@) 136 | 137 | download-catalog.gif: download-catalog.cast clean_fast 138 | $(call SPEEDUP,10,$<) 139 | @$(CAST2GIF) $(C2GFLAGS) -h 2 $<.fast $@ 140 | 141 | download-package.cast: 142 | @$(call PLAY,$(DOWNLOAD_PACKAGE_SCRIPT)) | $(call RECORD,$@) 143 | 144 | download-package.gif: download-package.cast clean_fast 145 | $(call SPEEDUP,10,$<) 146 | @$(CAST2GIF) $(C2GFLAGS) -h 2 $<.fast $@ 147 | 148 | download-books.cast: 149 | @$(call PLAY,$(DOWNLOAD_BOOKS_SCRIPT)) | $(call RECORD,$@) 150 | 151 | download-books.gif: download-books.cast 152 | @$(CAST2GIF) $(C2GFLAGS) -h 2 $< $@ 153 | 154 | long-demo.cast: 155 | @$(call PLAY,$(LONG_DEMO_SCRIPT)) | $(call RECORD,$@) 156 | 157 | long-demo.gif: long-demo.cast 158 | @$(CAST2GIF) $(C2GFLAGS) -h 20 $@ 159 | 160 | clean_fast: 161 | @/bin/rm -f *.fast 162 | 163 | clean: clean_fast 164 | @/bin/rm -rf *.pdf *.epub DOWNLOAD_REPORT.txt Computer_Science epubs 165 | 166 | immaculate: clean 167 | @/bin/rm -f $(CASTS) $(GIFS) 168 | 169 | -------------------------------------------------------------------------------- /demo/animations/set-default-catalog.cast: -------------------------------------------------------------------------------- 1 | {"version": 2, "width": 103, "height": 66, "timestamp": 1587519024, "idle_time_limit": 0.5, "env": {"SHELL": "/bin/bash", "TERM": "xterm-256color"}} 2 | [0.011352, "o", "\u001b[?1034h$ "] 3 | [0.332844, "o", "s"] 4 | [0.495595, "o", "p"] 5 | [0.601077, "o", "r"] 6 | [0.661146, "o", "i"] 7 | [0.81267, "o", "n"] 8 | [0.879574, "o", "g"] 9 | [1.068624, "o", "e"] 10 | [1.111227, "o", "r"] 11 | [1.29448, "o", " "] 12 | [1.478638, "o", "-"] 13 | [1.618062, "o", "-"] 14 | [1.738688, "o", "l"] 15 | [1.827371, "o", "a"] 16 | [1.977484, "o", "n"] 17 | [2.039324, "o", "g"] 18 | [2.186496, "o", "u"] 19 | [2.27722, "o", "a"] 20 | [2.426416, "o", "g"] 21 | [2.438973, "o", "e"] 22 | [2.521412, "o", " "] 23 | [2.60919, "o", "d"] 24 | [2.693345, "o", "e"] 25 | [2.830652, "o", " "] 26 | [2.967084, "o", "s"] 27 | [3.039868, "o", "e"] 28 | [3.234435, "o", "t"] 29 | [3.326771, "o", "-"] 30 | [3.342967, "o", "d"] 31 | [3.479114, "o", "e"] 32 | [3.64733, "o", "f"] 33 | [3.765, "o", "a"] 34 | [3.852346, "o", "u"] 35 | [3.918963, "o", "l"] 36 | [3.93579, "o", "t"] 37 | [4.044151, "o", "-"] 38 | [4.108373, "o", "c"] 39 | [4.161033, "o", "a"] 40 | [4.335625, "o", "t"] 41 | [4.449811, "o", "a"] 42 | [4.58455, "o", "l"] 43 | [4.671867, "o", "o"] 44 | [4.865835, "o", "g"] 45 | [5.052333, "o", "\r\n"] 46 | [5.682414, "o", "\u001b[34mOld Default: 📚|en-all\u001b[0m\r\n"] 47 | [5.682809, "o", "\u001b[32mNew Default: 📚|de-all\u001b[0m\r\n"] 48 | [5.731248, "o", "$ "] 49 | [6.56174, "o", "s"] 50 | [6.662238, "o", "p"] 51 | [6.81527, "o", "r"] 52 | [6.827157, "o", "i"] 53 | [6.947329, "o", "n"] 54 | [7.01257, "o", "g"] 55 | [7.053738, "o", "e"] 56 | [7.131936, "o", "r"] 57 | [7.169703, "o", " "] 58 | [7.351482, "o", "-"] 59 | [7.457743, "o", "-"] 60 | [7.521536, "o", "l"] 61 | [7.684498, "o", "a"] 62 | [7.777806, "o", "n"] 63 | [7.812885, "o", "g"] 64 | [7.991018, "o", "u"] 65 | [8.101378, "o", "a"] 66 | [8.177226, "o", "g"] 67 | [8.30136, "o", "e"] 68 | [8.301523, "o", " "] 69 | [8.377265, "o", "e"] 70 | [8.41228, "o", "n"] 71 | [8.423791, "o", " "] 72 | [8.480503, "o", "s"] 73 | [8.62142, "o", "e"] 74 | [8.739123, "o", "t"] 75 | [8.775121, "o", "-"] 76 | [8.901404, "o", "d"] 77 | [9.084933, "o", "e"] 78 | [9.251261, "o", "f"] 79 | [9.347299, "o", "a"] 80 | [9.431067, "o", "u"] 81 | [9.518279, "o", "l"] 82 | [9.644209, "o", "t"] 83 | [9.747177, "o", "-"] 84 | [9.92712, "o", "c"] 85 | [10.038917, "o", "a"] 86 | [10.093519, "o", "t"] 87 | [10.201436, "o", "a"] 88 | [10.207496, "o", "l"] 89 | [10.337714, "o", "o"] 90 | [10.442239, "o", "g"] 91 | [10.445514, "o", "\r\n"] 92 | [11.082237, "o", "\u001b[34mOld Default: 📚|de-all\u001b[0m\r\n"] 93 | [11.082628, "o", "\u001b[32mNew Default: 📚|en-all\u001b[0m\r\n"] 94 | [11.132438, "o", "$ "] 95 | [11.951381, "o", "s"] 96 | [12.151962, "o", "p"] 97 | [12.303722, "o", "r"] 98 | [12.360652, "o", "i"] 99 | [12.449556, "o", "n"] 100 | [12.513837, "o", "g"] 101 | [12.578841, "o", "e"] 102 | [12.778059, "o", "r"] 103 | [12.942206, "o", " "] 104 | [13.054178, "o", "-"] 105 | [13.169954, "o", "-"] 106 | [13.260434, "o", "l"] 107 | [13.386231, "o", "a"] 108 | [13.426996, "o", "n"] 109 | [13.588689, "o", "g"] 110 | [13.702267, "o", "u"] 111 | [13.889391, "o", "a"] 112 | [13.91379, "o", "g"] 113 | [14.111531, "o", "e"] 114 | [14.271295, "o", " "] 115 | [14.412211, "o", "d"] 116 | [14.435288, "o", "e"] 117 | [14.484139, "o", " "] 118 | [14.55116, "o", "-"] 119 | [14.646976, "o", "-"] 120 | [14.777378, "o", "t"] 121 | [14.934919, "o", "o"] 122 | [15.028784, "o", "p"] 123 | [15.108234, "o", "i"] 124 | [15.188546, "o", "c"] 125 | [15.26049, "o", " "] 126 | [15.36033, "o", "m"] 127 | [15.425516, "o", "e"] 128 | [15.540586, "o", "d"] 129 | [15.594002, "o", " "] 130 | [15.756308, "o", "s"] 131 | [15.79694, "o", "e"] 132 | [15.948159, "o", "t"] 133 | [16.082581, "o", "-"] 134 | [16.234186, "o", "d"] 135 | [16.268312, "o", "e"] 136 | [16.469768, "o", "f"] 137 | [16.537398, "o", "a"] 138 | [16.662666, "o", "u"] 139 | [16.665243, "o", "l"] 140 | [16.740841, "o", "t"] 141 | [16.854616, "o", "-"] 142 | [16.979744, "o", "c"] 143 | [17.003989, "o", "a"] 144 | [17.089012, "o", "t"] 145 | [17.288339, "o", "a"] 146 | [17.341481, "o", "l"] 147 | [17.505405, "o", "o"] 148 | [17.612089, "o", "g"] 149 | [17.750744, "o", "\r\n"] 150 | [18.377418, "o", "\u001b[34mOld Default: 📚|en-all\u001b[0m\r\n"] 151 | [18.377852, "o", "\u001b[32mNew Default: 📚|de-med\u001b[0m\r\n"] 152 | [18.429416, "o", "$ "] 153 | [19.254761, "o", "s"] 154 | [19.436052, "o", "p"] 155 | [19.532048, "o", "r"] 156 | [19.594059, "o", "i"] 157 | [19.758019, "o", "n"] 158 | [19.887673, "o", "g"] 159 | [20.033409, "o", "e"] 160 | [20.060573, "o", "r"] 161 | [20.149521, "o", " "] 162 | [20.340619, "o", "-"] 163 | [20.463701, "o", "-"] 164 | [20.514728, "o", "l"] 165 | [20.612431, "o", "a"] 166 | [20.735181, "o", "n"] 167 | [20.785236, "o", "g"] 168 | [20.901937, "o", "u"] 169 | [20.977148, "o", "a"] 170 | [21.127349, "o", "g"] 171 | [21.136414, "o", "e"] 172 | [21.279258, "o", " "] 173 | [21.45199, "o", "e"] 174 | [21.481883, "o", "n"] 175 | [21.654476, "o", " "] 176 | [21.740099, "o", "-"] 177 | [21.745643, "o", "-"] 178 | [21.79678, "o", "t"] 179 | [21.887128, "o", "o"] 180 | [21.944641, "o", "p"] 181 | [22.060694, "o", "i"] 182 | [22.076896, "o", "c"] 183 | [22.101063, "o", " "] 184 | [22.235614, "o", "a"] 185 | [22.315929, "o", "l"] 186 | [22.38506, "o", "l"] 187 | [22.446709, "o", " "] 188 | [22.62308, "o", "s"] 189 | [22.669538, "o", "e"] 190 | [22.86278, "o", "t"] 191 | [23.062689, "o", "-"] 192 | [23.231192, "o", "d"] 193 | [23.341029, "o", "e"] 194 | [23.489168, "o", "f"] 195 | [23.521095, "o", "a"] 196 | [23.572505, "o", "u"] 197 | [23.590725, "o", "l"] 198 | [23.662381, "o", "t"] 199 | [23.862542, "o", "-"] 200 | [24.013478, "o", "c"] 201 | [24.122301, "o", "a"] 202 | [24.193193, "o", "t"] 203 | [24.301933, "o", "a"] 204 | [24.363788, "o", "l"] 205 | [24.543275, "o", "o"] 206 | [24.581982, "o", "g"] 207 | [24.687608, "o", "\r\n"] 208 | [25.324882, "o", "\u001b[34mOld Default: 📚|de-med\u001b[0m\r\n"] 209 | [25.325241, "o", "\u001b[32mNew Default: 📚|en-all\u001b[0m\r\n"] 210 | [25.37692, "o", "$ "] 211 | [26.193004, "o", "e"] 212 | [26.218979, "o", "x"] 213 | [26.337032, "o", "i"] 214 | [26.477622, "o", "t"] 215 | [26.558999, "o", "\r\n"] 216 | [26.559249, "o", "exit\r\n"] 217 | -------------------------------------------------------------------------------- /demo/animations/download-package.cast: -------------------------------------------------------------------------------- 1 | {"version": 2, "width": 103, "height": 66, "timestamp": 1587525488, "idle_time_limit": 0.5, "env": {"SHELL": "/bin/bash", "TERM": "xterm-256color"}} 2 | [0.011066, "o", "\u001b[?1034h$ "] 3 | [0.332525, "o", "s"] 4 | [0.503021, "o", "p"] 5 | [0.603079, "o", "r"] 6 | [0.708873, "o", "i"] 7 | [0.781675, "o", "n"] 8 | [0.919397, "o", "g"] 9 | [0.985776, "o", "e"] 10 | [0.990512, "o", "r"] 11 | [1.032708, "o", " "] 12 | [1.119326, "o", "d"] 13 | [1.165975, "o", "o"] 14 | [1.330624, "o", "w"] 15 | [1.525534, "o", "n"] 16 | [1.569487, "o", "l"] 17 | [1.641922, "o", "o"] 18 | [1.744679, "o", "a"] 19 | [1.932722, "o", "d"] 20 | [2.069476, "o", " "] 21 | [2.217593, "o", "p"] 22 | [2.378802, "o", "a"] 23 | [2.54779, "o", "c"] 24 | [2.719561, "o", "k"] 25 | [2.753626, "o", "a"] 26 | [2.890715, "o", "g"] 27 | [2.932767, "o", "e"] 28 | [2.935184, "o", " "] 29 | [2.957023, "o", "-"] 30 | [3.153133, "o", "n"] 31 | [3.156057, "o", " "] 32 | [3.173987, "o", "'"] 33 | [3.340554, "o", "C"] 34 | [3.361576, "o", "o"] 35 | [3.540533, "o", "m"] 36 | [3.551942, "o", "p"] 37 | [3.650546, "o", "u"] 38 | [3.850682, "o", "t"] 39 | [4.021497, "o", "e"] 40 | [4.219405, "o", "r"] 41 | [4.269388, "o", " "] 42 | [4.349237, "o", "S"] 43 | [4.416029, "o", "c"] 44 | [4.554628, "o", "i"] 45 | [4.578669, "o", "e"] 46 | [4.619328, "o", "n"] 47 | [4.802875, "o", "c"] 48 | [4.913657, "o", "e"] 49 | [4.993533, "o", "'"] 50 | [5.084185, "o", "\r\n"] 51 | [16.394534, "o", "\r\u001b[?25len-all:pdf [📕📕📕📕📕📕📕📕📕📕] 1/49 00:08:32 A Beginner's Guide t"] 52 | [21.879143, "o", "\r\u001b[?25len-all:pdf [📕📕📕📕📕📕📕📕📕📕] 2/49 00:07:20 A Beginners Guide to"] 53 | [25.821805, "o", "\r\u001b[?25len-all:pdf [📕📕📕📕📕📕📕📕📕📕] 3/49 00:06:30 Advanced Guide to Py"] 54 | [30.07555, "o", "\r\u001b[?25len-all:pdf [📕📕📕📕📕📕📕📕📕📕] 4/49 00:05:54 An Introduction to M"] 55 | [32.17443, "o", "\r\u001b[?25len-all:pdf [📗📕📕📕📕📕📕📕📕📕] 5/49 00:05:24 Analysis for Compute"] 56 | [38.066732, "o", "\r\u001b[?25len-all:pdf [📗📕📕📕📕📕📕📕📕📕] 6/49 00:05:02 Automata and Computa"] 57 | [42.53578, "o", "\r\u001b[?25len-all:pdf [📗📕📕📕📕📕📕📕📕📕] 7/49 00:04:44 Computational Geomet"] 58 | [58.584271, "o", "\r\u001b[?25len-all:pdf [📗📕📕📕📕📕📕📕📕📕] 8/49 00:04:14 Computer Vision "] 59 | [60.966293, "o", "\r\u001b[?25len-all:pdf [📗📕📕📕📕📕📕📕📕📕] 9/49 00:03:56 Concise Guide to Dat"] 60 | [65.42517, "o", "\r\u001b[?25len-all:pdf [📗📗📕📕📕📕📕📕📕📕] 10/49 00:03:46 Concise Guide to Sof"] 61 | [66.886722, "o", "\r\u001b[?25len-all:pdf [📗📗📕📕📕📕📕📕📕📕] 11/49 00:03:38 Cryptography Made Si"] 62 | [72.130045, "o", "\r\u001b[?25len-all:pdf [📗📗📕📕📕📕📕📕📕📕] 12/49 00:03:33 Data Mining "] 63 | [91.187289, "o", "\r\u001b[?25len-all:pdf [📗📗📕📕📕📕📕📕📕📕] 13/49 00:03:34 Data Science and Pre"] 64 | [95.10631, "o", "\r\u001b[?25len-all:pdf [📗📗📕📕📕📕📕📕📕📕] 14/49 00:03:33 Data Structures and "] 65 | [106.481294, "o", "\r\u001b[?25len-all:pdf [📗📗📗📕📕📕📕📕📕📕] 15/49 00:03:28 Digital Image Proces"] 66 | [113.510238, "o", "\r\u001b[?25len-all:pdf [📗📗📗📕📕📕📕📕📕📕] 16/49 00:03:24 Eye Tracking Methodo"] 67 | [118.254337, "o", "\r\u001b[?25len-all:pdf [📗📗📗📕📕📕📕📕📕📕] 17/49 00:03:21 Foundations for Desi"] 68 | [125.61408, "o", "\r\u001b[?25len-all:pdf [📗📗📗📕📕📕📕📕📕📕] 18/49 00:03:20 Foundations of Progr"] 69 | [129.894705, "o", "\r\u001b[?25len-all:pdf [📗📗📗📕📕📕📕📕📕📕] 19/49 00:03:18 Fundamentals of Busi"] 70 | [136.690708, "o", "\r\u001b[?25len-all:pdf [📗📗📗📗📕📕📕📕📕📕] 20/49 00:03:11 Fundamentals of Busi"] 71 | [145.882202, "o", "\r\u001b[?25len-all:pdf [📗📗📗📗📕📕📕📕📕📕] 21/49 00:03:05 Fundamentals of Java"] 72 | [152.304364, "o", "\r\u001b[?25len-all:pdf [📗📗📗📗📕📕📕📕📕📕] 22/49 00:02:59 Fundamentals of Mult"] 73 | [156.153346, "o", "\r\u001b[?25len-all:pdf [📗📗📗📗📕📕📕📕📕📕] 23/49 00:02:51 Guide to Competitive"] 74 | [158.720417, "o", "\r\u001b[?25len-all:pdf [📗📗📗📗📕📕📕📕📕📕] 24/49 00:02:44 Guide to Computer Ne"] 75 | [161.265346, "o", "\r\u001b[?25len-all:pdf [📗📗📗📗📗📕📕📕📕📕] 25/49 00:02:36 Guide to Discrete Ma"] 76 | [162.794205, "o", "\r\u001b[?25len-all:pdf [📗📗📗📗📗📕📕📕📕📕] 26/49 00:02:28 Guide to Scientific "] 77 | [167.062523, "o", "\r\u001b[?25len-all:pdf [📗📗📗📗📗📕📕📕📕📕] 27/49 00:02:19 Introduction to Arti"] 78 | [168.833252, "o", "\r\u001b[?25len-all:pdf [📗📗📗📗📗📕📕📕📕📕] 28/49 00:02:10 Introduction to Data"] 79 | [172.667988, "o", "\r\u001b[?25len-all:pdf [📗📗📗📗📗📕📕📕📕📕] 29/49 00:02:02 Introduction to Deep"] 80 | [173.958868, "o", "\r\u001b[?25len-all:pdf [📗📗📗📗📗📗📕📕📕📕] 30/49 00:01:53 Introduction to Evol"] 81 | [176.548207, "o", "\r\u001b[?25len-all:pdf [📗📗📗📗📗📗📕📕📕📕] 31/49 00:01:45 Introduction to Para"] 82 | [178.021115, "o", "\r\u001b[?25len-all:pdf [📗📗📗📗📗📗📕📕📕📕] 32/49 00:01:37 Introduction to Prog"] 83 | [189.382399, "o", "\r\u001b[?25len-all:pdf [📗📗📗📗📗📗📕📕📕📕] 33/49 00:01:30 Introductory Compute"] 84 | [193.247194, "o", "\r\u001b[?25len-all:pdf [📗📗📗📗📗📗📕📕📕📕] 34/49 00:01:23 Java in Two Semester"] 85 | [194.015855, "o", "\r\u001b[?25len-all:pdf [📗📗📗📗📗📗📗📕📕📕] 35/49 00:01:18 LaTeX in 24 Hours "] 86 | [195.686989, "o", "\r\u001b[?25len-all:pdf [📗📗📗📗📗📗📗📕📕📕] 36/49 00:01:11 Logical Foundations "] 87 | [197.07349, "o", "\r\u001b[?25len-all:pdf [📗📗📗📗📗📗📗📕📕📕] 37/49 00:01:05 Modelling Computing "] 88 | [200.543284, "o", "\r\u001b[?25len-all:pdf [📗📗📗📗📗📗📗📕📕📕] 38/49 00:00:59 Neural Networks and "] 89 | [203.618608, "o", "\r\u001b[?25len-all:pdf [📗📗📗📗📗📗📗📕📕📕] 39/49 00:00:53 Object-Oriented Anal"] 90 | [204.34296, "o", "\r\u001b[?25len-all:pdf [📗📗📗📗📗📗📗📗📕📕] 40/49 00:00:47 Principles of Data M"] 91 | [206.699028, "o", "\r\u001b[?25len-all:pdf [📗📗📗📗📗📗📗📗📕📕] 41/49 00:00:41 Probability and Stat"] 92 | [211.406787, "o", "\r\u001b[?25len-all:pdf [📗📗📗📗📗📗📗📗📕📕] 42/49 00:00:35 Python Programming F"] 93 | [213.82305, "o", "\r\u001b[?25len-all:pdf [📗📗📗📗📗📗📗📗📕📕] 43/49 00:00:30 Recommender Systems "] 94 | [215.775534, "o", "\r\u001b[?25len-all:pdf [📗📗📗📗📗📗📗📗📕📕] 44/49 00:00:24 Systems Programming "] 95 | [217.270928, "o", "\r\u001b[?25len-all:pdf [📗📗📗📗📗📗📗📗📗📕] 45/49 00:00:19 The Algorithm Design"] 96 | [220.62134, "o", "\r\u001b[?25len-all:pdf [📗📗📗📗📗📗📗📗📗📕] 46/49 00:00:14 The Data Science Des"] 97 | [231.015165, "o", "\r\u001b[?25len-all:pdf [📗📗📗📗📗📗📗📗📗📕] 47/49 00:00:09 The Python Workbook "] 98 | [231.692476, "o", "\r\u001b[?25len-all:pdf [📗📗📗📗📗📗📗📗📗📕] 48/49 00:00:04 UML @ Classroom "] 99 | [232.387509, "o", "\r\u001b[?25len-all:pdf [📗📗📗📗📗📗📗📗📗📗] 49/49 Understanding Crypto "] 100 | [232.387587, "o", "\r\u001b[?25len-all:pdf [📗📗📗📗📗📗📗📗📗📗] 49/49 "] 101 | [232.387623, "o", "\u001b[?25h\r\n"] 102 | [232.441239, "o", "$ "] 103 | [305.582544, "o", "e"] 104 | [305.688088, "o", "x"] 105 | [305.747028, "o", "i"] 106 | [305.793679, "o", "t"] 107 | [305.921462, "o", "\r\n"] 108 | [305.921785, "o", "exit\r\n"] 109 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # `springer` 2 | 3 | ![Downloading](https://github.com/JnyJny/springer_downloader/raw/master/demo/animations/download-catalog.gif) 4 | __Springer Textbook Bulk Download Tool__ 5 | 6 | ## NOTICE 7 | 8 | The author of this software is not affiliated with Springer and this 9 | tool is not authorized or supported by Springer. Thank you to 10 | Springer for making these high quality textbooks available at no 11 | cost. 12 | 13 | 14 | >"With the Coronavirus outbreak having an unprecedented impact on 15 | >education, Springer Nature is launching a global program to support 16 | >learning and teaching at higher education institutions 17 | >worldwide. Remote access to educational resources has become 18 | >essential. We want to support lecturers, teachers and students 19 | >during this challenging period and hope that this initiative will go 20 | >some way to help. 21 | > 22 | >Institutions will be able to access more than 500 key textbooks 23 | >across Springer Nature’s eBook subject collections for free. In 24 | >addition, we are making a number of German-language Springer medical 25 | >training books on emergency nursing freely accessible. These books 26 | >will be available via SpringerLink until at least the end of July." 27 | 28 | [Source](https://www.springernature.com/gp/librarians/news-events/all-news-articles/industry-news-initiatives/free-access-to-textbooks-for-institutions-affected-by-coronaviru/17855960) 29 | 30 | ## Overview 31 | 32 | This tool automates the process of downloading the Springer-provided 33 | Excel catalogs, locating URLs and downloading the files in PDF or epub 34 | format. 35 | 36 | Catalogs are lists of books in a specific _language_, spanning a 37 | _topic_. Catalogs are further subdivided into _packages_ which are 38 | books grouped by sub-topics. 39 | 40 | Textbooks can be downloaded by; title, package name or the entire 41 | catalog. Title and package names can be incompletely specified and 42 | are case-insensitive. 43 | 44 | The available languages are: English & German. 45 | 46 | The available topics are: _All Disciplines_ and _Emergency Nursing_. 47 | 48 | **Note: The _Emergency Nursing_ topic is not available in English.** 49 | 50 | ## Source and License 51 | 52 | Full source is available on 53 | [GitHub](https://github.com/JnyJny/springer_downloader) and it is 54 | licensed under the 55 | [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0) 56 | license. 57 | 58 | ## Installation 59 | 60 | This utility can be installed using `pip`: 61 | 62 | `$ python3 -m pip install springer` 63 | 64 | Or from the latest source on GitHub: 65 | 66 | `$ python3 -m pip install git+https://github.com/JnyJny/springer_downloader` 67 | 68 | **Usage**: 69 | 70 | ```console 71 | $ springer [OPTIONS] COMMAND [ARGS]... 72 | ``` 73 | 74 | **Options**: 75 | 76 | * `-L, --language [en|de]`: Choose catalog language 77 | * `-T, --topic [all|med]`: Choose a catalog topic. 78 | * `--install-completion`: Install completion for the current shell. 79 | * `--show-completion`: Show completion for the current shell, to copy it or customize the installation. 80 | * `--help`: Show this message and exit. 81 | 82 | **Commands**: 83 | 84 | * `clean-catalog`: Remove cached catalogs. 85 | * `download`: Download textbooks from Springer This command... 86 | * `get-default-catalog`: Print the default catalog identifier. 87 | * `list`: List books, package, packages, catalog or... 88 | * `refresh-catalog`: Refresh the cached catalog of springer... 89 | * `set-default-catalog`: Set default catalog language and topic. 90 | 91 | ## `springer clean-catalog` 92 | 93 | Remove cached catalogs. 94 | 95 | __Examples__ 96 | 97 | Remove the cached default catalog: 98 | 99 | `$ springer clean-catalog --force` 100 | 101 | Remove the cached German language _Emergency Nursing_ catalog: 102 | 103 | `$ springer --language de --topic med clean-catalog --force` 104 | 105 | Remove all catalogs: 106 | 107 | `$ springer clean-catalog --force --all` 108 | 109 | **Usage**: 110 | 111 | ```console 112 | $ springer clean-catalog [OPTIONS] 113 | ``` 114 | 115 | **Options**: 116 | 117 | * `-F, --force` 118 | * `--all` 119 | * `--help`: Show this message and exit. 120 | 121 | ## `springer download` 122 | 123 | Download textbooks from Springer 124 | 125 | This command downloads textbooks from Springer to the local host. Files 126 | are saved by default in PDF format to the current working directory. 127 | 128 | If a download is interrupted by the user, it can be later restarted where 129 | the interruption occurred without downloading previous files. 130 | 131 | Problems encountered while downloading files are logged to: 132 | 133 | `dest-path/DOWNLOAD_REPORT.txt` 134 | 135 | __Examples__ 136 | 137 | Download all books in the default catalog in PDF format to the 138 | current directory: 139 | 140 | `$ springer download books` 141 | 142 | Download all books in EPUB format whose title includes 'python': 143 | 144 | `$ springer download books --name python --format epub` 145 | 146 | Download all books into directories grouped by package: 147 | 148 | `$ springer download packages --dest-path by_pkgs 149 | 150 | Download all books in a specific package in EPUB format: 151 | 152 | `$ springer download package --name 'Computer Science' --format epub` 153 | 154 | Download all books in packages whose name includes `Science`: 155 | 156 | `$ springer download package --name science --dest sciences` 157 | 158 | Download all books in all catalogs [en-all, de-all, de-med] in EPUB format: 159 | 160 | `$ springer download catalogs --format epub` 161 | 162 | The `catalogs` download subcommand will create a set of directories by language 163 | and topic for each catalog and save downloaded files into the appropriate 164 | directory, eg: 165 | 166 | 167 | - dest-path/English/All_Disciplines/package_name/title.fmt 168 | - dest-path/German/All_Disciplines/package_name/title.fmt 169 | - dest-path/German/Emergency_Nursing/package_name/title.fmt 170 | 171 | The `package` and `packages` subcommands will also save downloaded 172 | files into directories with package names rooted in the destination 173 | path: 174 | 175 | 176 | dest-path/package_name/title.fmt 177 | ... 178 | 179 | 180 | 181 | See Also: `set-default-catalog`, `get-default-catalog`, `list` 182 | 183 | **Usage**: 184 | 185 | ```console 186 | $ springer download [OPTIONS] [catalogs|catalog|packages|package|books] 187 | ``` 188 | 189 | **Options**: 190 | 191 | * `-n, --name TEXT`: Name to match against title or package. 192 | * `-d, --dest-path PATH`: Destination directory for downloaded files. [default: /Users/ejo/local/springer] 193 | * `-f, --format [pdf|epub]`: [default: pdf] 194 | * `-W, --over-write`: Over write downloaded files. [default: False] 195 | * `--help`: Show this message and exit. 196 | 197 | ## `springer get-default-catalog` 198 | 199 | Print the default catalog identifier. 200 | 201 | This is the default catalog that will be used when listing books and packages 202 | and the user has not specified a --language or --topic on the command line. 203 | 204 | **Usage**: 205 | 206 | ```console 207 | $ springer get-default-catalog [OPTIONS] 208 | ``` 209 | 210 | **Options**: 211 | 212 | * `--help`: Show this message and exit. 213 | 214 | ## `springer list` 215 | 216 | List books, package, packages, catalog or catalogs. 217 | 218 | Display information about books, packages, and catalogs. Packages 219 | are sets of books grouped by subject. 220 | 221 | __Examples__ 222 | 223 | List titles available in the default catalog: 224 | 225 | `$ springer list books` 226 | 227 | List packages available in the default catalog: 228 | 229 | `$ springer list packages` 230 | 231 | List titles available in the German language, all disciplines catalog: 232 | 233 | `$ springer --language de --topic all list books` 234 | 235 | List all eBook packages in the default catalog: 236 | 237 | `$ springer list packages` 238 | 239 | List all eBook packages in the default catalog whose name match: 240 | 241 | `$ springer list package -m science` 242 | 243 | List information about the current catalog: 244 | 245 | `$ springer list catalog` 246 | 247 | List information about the Germal language, Emergency Nursing catalog: 248 | 249 | `$ springer --language de --topic med list catalog` 250 | 251 | **Usage**: 252 | 253 | ```console 254 | $ springer list [OPTIONS] [catalogs|catalog|packages|package|books] 255 | ``` 256 | 257 | **Options**: 258 | 259 | * `-n, --name TEXT`: Name to match against title or pacakge. 260 | * `-l, --long-format`: Display selected information in a longer format. [default: False] 261 | * `--help`: Show this message and exit. 262 | 263 | ## `springer refresh-catalog` 264 | 265 | Refresh the cached catalog of springer textbooks. 266 | 267 | If `--all` is specified, the `--url` option is ignored. 268 | 269 | __Examples__ 270 | 271 | Update English language catalog: 272 | 273 | `$ springer --language en refresh` 274 | 275 | Update German language catalog whose topic is 'all': 276 | 277 | `$ springer --language de --topic all refresh` 278 | 279 | Update German language catalog whose topic is 'med' with a new url: 280 | 281 | `$ springer -l de -d med refresh --url https://example.com/api/endpoint/something/v11` 282 | 283 | __NOTE: THIS URL DOES NOT REPLACE THE DEFAULT URL FOR THE TARGET CATALOG__ 284 | 285 | Update all catalogs: 286 | 287 | `$ springer refresh-catalog --all` 288 | 289 | **Usage**: 290 | 291 | ```console 292 | $ springer refresh-catalog [OPTIONS] 293 | ``` 294 | 295 | **Options**: 296 | 297 | * `-u, --url TEXT`: URL for Excel-formatted catalog. 298 | * `--all` 299 | * `--help`: Show this message and exit. 300 | 301 | ## `springer set-default-catalog` 302 | 303 | Set default catalog language and topic. 304 | 305 | __Examples__ 306 | 307 | Set the default catalog to German language: 308 | 309 | `$ springer --language de set-default-catalog` 310 | 311 | Set the default catalog to German and emergency nursing: 312 | 313 | `$ springer --language de --topic med set-default-catalog` 314 | 315 | Set the default catalog to English and all disciplines topic: 316 | 317 | `$ springer --language en --topic all set-default-catalog` 318 | 319 | Note: The only English language catalog is `en-all`. 320 | 321 | **Usage**: 322 | 323 | ```console 324 | $ springer set-default-catalog [OPTIONS] 325 | ``` 326 | 327 | **Options**: 328 | 329 | * `--help`: Show this message and exit. 330 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | Apache License 2 | Version 2.0, January 2004 3 | http://www.apache.org/licenses/ 4 | 5 | TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION 6 | 7 | 1. Definitions. 8 | 9 | "License" shall mean the terms and conditions for use, reproduction, 10 | and distribution as defined by Sections 1 through 9 of this document. 11 | 12 | "Licensor" shall mean the copyright owner or entity authorized by 13 | the copyright owner that is granting the License. 14 | 15 | "Legal Entity" shall mean the union of the acting entity and all 16 | other entities that control, are controlled by, or are under common 17 | control with that entity. For the purposes of this definition, 18 | "control" means (i) the power, direct or indirect, to cause the 19 | direction or management of such entity, whether by contract or 20 | otherwise, or (ii) ownership of fifty percent (50%) or more of the 21 | outstanding shares, or (iii) beneficial ownership of such entity. 22 | 23 | "You" (or "Your") shall mean an individual or Legal Entity 24 | exercising permissions granted by this License. 25 | 26 | "Source" form shall mean the preferred form for making modifications, 27 | including but not limited to software source code, documentation 28 | source, and configuration files. 29 | 30 | "Object" form shall mean any form resulting from mechanical 31 | transformation or translation of a Source form, including but 32 | not limited to compiled object code, generated documentation, 33 | and conversions to other media types. 34 | 35 | "Work" shall mean the work of authorship, whether in Source or 36 | Object form, made available under the License, as indicated by a 37 | copyright notice that is included in or attached to the work 38 | (an example is provided in the Appendix below). 39 | 40 | "Derivative Works" shall mean any work, whether in Source or Object 41 | form, that is based on (or derived from) the Work and for which the 42 | editorial revisions, annotations, elaborations, or other modifications 43 | represent, as a whole, an original work of authorship. For the purposes 44 | of this License, Derivative Works shall not include works that remain 45 | separable from, or merely link (or bind by name) to the interfaces of, 46 | the Work and Derivative Works thereof. 47 | 48 | "Contribution" shall mean any work of authorship, including 49 | the original version of the Work and any modifications or additions 50 | to that Work or Derivative Works thereof, that is intentionally 51 | submitted to Licensor for inclusion in the Work by the copyright owner 52 | or by an individual or Legal Entity authorized to submit on behalf of 53 | the copyright owner. For the purposes of this definition, "submitted" 54 | means any form of electronic, verbal, or written communication sent 55 | to the Licensor or its representatives, including but not limited to 56 | communication on electronic mailing lists, source code control systems, 57 | and issue tracking systems that are managed by, or on behalf of, the 58 | Licensor for the purpose of discussing and improving the Work, but 59 | excluding communication that is conspicuously marked or otherwise 60 | designated in writing by the copyright owner as "Not a Contribution." 61 | 62 | "Contributor" shall mean Licensor and any individual or Legal Entity 63 | on behalf of whom a Contribution has been received by Licensor and 64 | subsequently incorporated within the Work. 65 | 66 | 2. Grant of Copyright License. Subject to the terms and conditions of 67 | this License, each Contributor hereby grants to You a perpetual, 68 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 69 | copyright license to reproduce, prepare Derivative Works of, 70 | publicly display, publicly perform, sublicense, and distribute the 71 | Work and such Derivative Works in Source or Object form. 72 | 73 | 3. Grant of Patent License. Subject to the terms and conditions of 74 | this License, each Contributor hereby grants to You a perpetual, 75 | worldwide, non-exclusive, no-charge, royalty-free, irrevocable 76 | (except as stated in this section) patent license to make, have made, 77 | use, offer to sell, sell, import, and otherwise transfer the Work, 78 | where such license applies only to those patent claims licensable 79 | by such Contributor that are necessarily infringed by their 80 | Contribution(s) alone or by combination of their Contribution(s) 81 | with the Work to which such Contribution(s) was submitted. If You 82 | institute patent litigation against any entity (including a 83 | cross-claim or counterclaim in a lawsuit) alleging that the Work 84 | or a Contribution incorporated within the Work constitutes direct 85 | or contributory patent infringement, then any patent licenses 86 | granted to You under this License for that Work shall terminate 87 | as of the date such litigation is filed. 88 | 89 | 4. Redistribution. You may reproduce and distribute copies of the 90 | Work or Derivative Works thereof in any medium, with or without 91 | modifications, and in Source or Object form, provided that You 92 | meet the following conditions: 93 | 94 | (a) You must give any other recipients of the Work or 95 | Derivative Works a copy of this License; and 96 | 97 | (b) You must cause any modified files to carry prominent notices 98 | stating that You changed the files; and 99 | 100 | (c) You must retain, in the Source form of any Derivative Works 101 | that You distribute, all copyright, patent, trademark, and 102 | attribution notices from the Source form of the Work, 103 | excluding those notices that do not pertain to any part of 104 | the Derivative Works; and 105 | 106 | (d) If the Work includes a "NOTICE" text file as part of its 107 | distribution, then any Derivative Works that You distribute must 108 | include a readable copy of the attribution notices contained 109 | within such NOTICE file, excluding those notices that do not 110 | pertain to any part of the Derivative Works, in at least one 111 | of the following places: within a NOTICE text file distributed 112 | as part of the Derivative Works; within the Source form or 113 | documentation, if provided along with the Derivative Works; or, 114 | within a display generated by the Derivative Works, if and 115 | wherever such third-party notices normally appear. The contents 116 | of the NOTICE file are for informational purposes only and 117 | do not modify the License. You may add Your own attribution 118 | notices within Derivative Works that You distribute, alongside 119 | or as an addendum to the NOTICE text from the Work, provided 120 | that such additional attribution notices cannot be construed 121 | as modifying the License. 122 | 123 | You may add Your own copyright statement to Your modifications and 124 | may provide additional or different license terms and conditions 125 | for use, reproduction, or distribution of Your modifications, or 126 | for any such Derivative Works as a whole, provided Your use, 127 | reproduction, and distribution of the Work otherwise complies with 128 | the conditions stated in this License. 129 | 130 | 5. Submission of Contributions. Unless You explicitly state otherwise, 131 | any Contribution intentionally submitted for inclusion in the Work 132 | by You to the Licensor shall be under the terms and conditions of 133 | this License, without any additional terms or conditions. 134 | Notwithstanding the above, nothing herein shall supersede or modify 135 | the terms of any separate license agreement you may have executed 136 | with Licensor regarding such Contributions. 137 | 138 | 6. Trademarks. This License does not grant permission to use the trade 139 | names, trademarks, service marks, or product names of the Licensor, 140 | except as required for reasonable and customary use in describing the 141 | origin of the Work and reproducing the content of the NOTICE file. 142 | 143 | 7. Disclaimer of Warranty. Unless required by applicable law or 144 | agreed to in writing, Licensor provides the Work (and each 145 | Contributor provides its Contributions) on an "AS IS" BASIS, 146 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or 147 | implied, including, without limitation, any warranties or conditions 148 | of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A 149 | PARTICULAR PURPOSE. You are solely responsible for determining the 150 | appropriateness of using or redistributing the Work and assume any 151 | risks associated with Your exercise of permissions under this License. 152 | 153 | 8. Limitation of Liability. In no event and under no legal theory, 154 | whether in tort (including negligence), contract, or otherwise, 155 | unless required by applicable law (such as deliberate and grossly 156 | negligent acts) or agreed to in writing, shall any Contributor be 157 | liable to You for damages, including any direct, indirect, special, 158 | incidental, or consequential damages of any character arising as a 159 | result of this License or out of the use or inability to use the 160 | Work (including but not limited to damages for loss of goodwill, 161 | work stoppage, computer failure or malfunction, or any and all 162 | other commercial damages or losses), even if such Contributor 163 | has been advised of the possibility of such damages. 164 | 165 | 9. Accepting Warranty or Additional Liability. While redistributing 166 | the Work or Derivative Works thereof, You may choose to offer, 167 | and charge a fee for, acceptance of support, warranty, indemnity, 168 | or other liability obligations and/or rights consistent with this 169 | License. However, in accepting such obligations, You may act only 170 | on Your own behalf and on Your sole responsibility, not on behalf 171 | of any other Contributor, and only if You agree to indemnify, 172 | defend, and hold each Contributor harmless for any liability 173 | incurred by, or claims asserted against, such Contributor by reason 174 | of your accepting any such warranty or additional liability. 175 | 176 | END OF TERMS AND CONDITIONS 177 | 178 | APPENDIX: How to apply the Apache License to your work. 179 | 180 | To apply the Apache License to your work, attach the following 181 | boilerplate notice, with the fields enclosed by brackets "[]" 182 | replaced with your own identifying information. (Don't include 183 | the brackets!) The text should be enclosed in the appropriate 184 | comment syntax for the file format. We also recommend that a 185 | file or class name and description of purpose be included on the 186 | same "printed page" as the copyright notice for easier 187 | identification within third-party archives. 188 | 189 | Copyright [yyyy] [name of copyright owner] 190 | 191 | Licensed under the Apache License, Version 2.0 (the "License"); 192 | you may not use this file except in compliance with the License. 193 | You may obtain a copy of the License at 194 | 195 | http://www.apache.org/licenses/LICENSE-2.0 196 | 197 | Unless required by applicable law or agreed to in writing, software 198 | distributed under the License is distributed on an "AS IS" BASIS, 199 | WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 200 | See the License for the specific language governing permissions and 201 | limitations under the License. 202 | -------------------------------------------------------------------------------- /springer/__main__.py: -------------------------------------------------------------------------------- 1 | """Springer Textbook Bulk Download Tool 2 | """ 3 | 4 | import typer 5 | 6 | from loguru import logger 7 | from pathlib import Path 8 | 9 | from .constants import FileFormat, Language, Topic, Component 10 | from .catalog import Catalog 11 | 12 | 13 | cli = typer.Typer() 14 | 15 | DOWNLOAD_REPORT = "DOWNLOAD_REPORT.txt" 16 | 17 | 18 | @cli.callback() 19 | def main( 20 | ctx: typer.Context, 21 | language: Language = typer.Option( 22 | None, 23 | "--language", 24 | "-L", 25 | show_choices=True, 26 | show_default=True, 27 | help="Choose catalog language", 28 | ), 29 | topic: Topic = typer.Option( 30 | None, 31 | "--topic", 32 | "-T", 33 | show_default=True, 34 | show_choices=True, 35 | help="Choose a catalog topic.", 36 | ), 37 | ): 38 | """![Downloading](https://github.com/JnyJny/springer_downloader/raw/master/demo/animations/download-catalog.gif) 39 | __Springer Textbook Bulk Download Tool__ 40 | 41 | ## NOTICE 42 | 43 | The author of this software is not affiliated with Springer and this 44 | tool is not authorized or supported by Springer. Thank you to 45 | Springer for making these high quality textbooks available at no 46 | cost. 47 | 48 | \b 49 | >"With the Coronavirus outbreak having an unprecedented impact on 50 | >education, Springer Nature is launching a global program to support 51 | >learning and teaching at higher education institutions 52 | >worldwide. Remote access to educational resources has become 53 | >essential. We want to support lecturers, teachers and students 54 | >during this challenging period and hope that this initiative will go 55 | >some way to help. 56 | > 57 | >Institutions will be able to access more than 500 key textbooks 58 | >across Springer Nature’s eBook subject collections for free. In 59 | >addition, we are making a number of German-language Springer medical 60 | >training books on emergency nursing freely accessible. These books 61 | >will be available via SpringerLink until at least the end of July." 62 | 63 | [Source](https://www.springernature.com/gp/librarians/news-events/all-news-articles/industry-news-initiatives/free-access-to-textbooks-for-institutions-affected-by-coronaviru/17855960) 64 | 65 | ## Overview 66 | 67 | This tool automates the process of downloading the Springer-provided 68 | Excel catalogs, locating URLs and downloading the files in PDF or epub 69 | format. 70 | 71 | Catalogs are lists of books in a specific _language_, spanning a 72 | _topic_. Catalogs are further subdivided into _packages_ which are 73 | books grouped by sub-topics. 74 | 75 | Textbooks can be downloaded by; title, package name or the entire 76 | catalog. Title and package names can be incompletely specified and 77 | are case-insensitive. 78 | 79 | The available languages are: English & German. 80 | 81 | The available topics are: _All Disciplines_ and _Emergency Nursing_. 82 | 83 | **Note: The _Emergency Nursing_ topic is not available in English.** 84 | 85 | ## Source and License 86 | 87 | Full source is available on 88 | [GitHub](https://github.com/JnyJny/springer_downloader) and it is 89 | licensed under the 90 | [Apache-2.0](https://www.apache.org/licenses/LICENSE-2.0) 91 | license. 92 | 93 | ## Installation 94 | 95 | This utility can be installed using `pip`: 96 | 97 | `$ python3 -m pip install springer` 98 | 99 | Or from the latest source on GitHub: 100 | 101 | `$ python3 -m pip install git+https://github.com/JnyJny/springer_downloader` 102 | """ 103 | 104 | # EJO The callback function is called before any of the command functions 105 | # are invoked. Since all the subcommands work with an instantiation of 106 | # springer.catalog.Catalog, we create one in the callback and attach it 107 | # to the typer.Context object using the attribute 'obj'. I don't 108 | # particularly care for accessing the catalog as 'ctx.obj' in the 109 | # subcommands, but I haven't found a better solution to this "problem" 110 | # yet. 111 | 112 | try: 113 | ctx.obj = Catalog(language, topic) 114 | 115 | except KeyError as error: 116 | typer.secho( 117 | f"Failed to locate a catalog for: '{error.args[0].value!s}'", fg="red" 118 | ) 119 | raise typer.Exit(-1) 120 | 121 | 122 | @cli.command(name="get-default-catalog") 123 | def get_default_catalog_subcommand(): 124 | """Print the default catalog identifier. 125 | 126 | This is the default catalog that will be used when listing books and packages 127 | and the user has not specified a --language or --topic on the command line. 128 | """ 129 | 130 | typer.secho(f"Default: {Catalog(fetch=False)}", fg="green") 131 | 132 | 133 | @cli.command(name="set-default-catalog") 134 | def set_default_catalog_subcommand(ctx: typer.Context,): 135 | """Set default catalog language and topic. 136 | 137 | __Examples__ 138 | 139 | Set the default catalog to German language: 140 | 141 | `$ springer --language de set-default-catalog` 142 | 143 | Set the default catalog to German and emergency nursing: 144 | 145 | `$ springer --language de --topic med set-default-catalog` 146 | 147 | Set the default catalog to English and all disciplines topic: 148 | 149 | `$ springer --language en --topic all set-default-catalog` 150 | 151 | Note: The only English language catalog is `en-all`. 152 | """ 153 | prev = Catalog(fetch=False) 154 | ctx.obj.save_defaults() 155 | typer.secho(f"Old Default: {prev!s}", fg="red" if prev.is_default else "blue") 156 | typer.secho(f"New Default: {Catalog(fetch=False)!s}", fg="green") 157 | 158 | 159 | @cli.command(name="list") 160 | def list_subcommand( 161 | ctx: typer.Context, 162 | component: Component, 163 | name: str = typer.Option( 164 | None, "--name", "-n", help="Name to match against title or pacakge." 165 | ), 166 | long_format: bool = typer.Option( 167 | False, 168 | "--long-format", 169 | "-l", 170 | is_flag=True, 171 | show_default=True, 172 | help="Display selected information in a longer format.", 173 | ), 174 | ): 175 | """List books, package, packages, catalog or catalogs. 176 | 177 | Display information about books, packages, and catalogs. Packages 178 | are sets of books grouped by subject. 179 | 180 | __Examples__ 181 | 182 | List titles available in the default catalog: 183 | 184 | `$ springer list books` 185 | 186 | List packages available in the default catalog: 187 | 188 | `$ springer list packages` 189 | 190 | List titles available in the German language, all disciplines catalog: 191 | 192 | `$ springer --language de --topic all list books` 193 | 194 | List all eBook packages in the default catalog: 195 | 196 | `$ springer list packages` 197 | 198 | List all eBook packages in the default catalog whose name match: 199 | 200 | `$ springer list package -m science` 201 | 202 | List information about the current catalog: 203 | 204 | `$ springer list catalog` 205 | 206 | List information about the Germal language, Emergency Nursing catalog: 207 | 208 | `$ springer --language de --topic med list catalog` 209 | """ 210 | 211 | if component == Component.Books: 212 | ctx.obj.list_textbooks(long_format, name) 213 | return 214 | 215 | if component is Component.Package: 216 | if name: 217 | for pkgname, pkginfo in ctx.obj.packages.items(): 218 | if name.casefold() in pkgname.casefold(): 219 | ctx.obj.list_package(pkgname, pkginfo, long_format) 220 | return 221 | else: 222 | component = Component.Packages 223 | 224 | if component is Component.Packages: 225 | ctx.obj.list_packages(long_format) 226 | return 227 | 228 | if component is Component.Catalog: 229 | catalogs = [ctx.obj] 230 | 231 | if component is Component.Catalogs: 232 | catalogs = Catalog.all_catalogs() 233 | 234 | for catalog in catalogs: 235 | catalog.list_catalog(long_format) 236 | 237 | 238 | @cli.command(name="refresh-catalog") 239 | def refresh_subcommand( 240 | ctx: typer.Context, 241 | catalog_url: str = typer.Option( 242 | None, "--url", "-u", help="URL for Excel-formatted catalog." 243 | ), 244 | all_catalogs: bool = typer.Option(False, "--all", is_flag=True), 245 | ): 246 | """Refresh the cached catalog of springer textbooks. 247 | 248 | If `--all` is specified, the `--url` option is ignored. 249 | 250 | __Examples__ 251 | 252 | Update English language catalog: 253 | 254 | `$ springer --language en refresh` 255 | 256 | Update German language catalog whose topic is 'all': 257 | 258 | `$ springer --language de --topic all refresh` 259 | 260 | Update German language catalog whose topic is 'med' with a new url: 261 | 262 | `$ springer -l de -d med refresh --url https://example.com/api/endpoint/something/v11` 263 | 264 | __NOTE: THIS URL DOES NOT REPLACE THE DEFAULT URL FOR THE TARGET CATALOG__ 265 | 266 | Update all catalogs: 267 | 268 | `$ springer refresh-catalog --all` 269 | 270 | """ 271 | 272 | if not all_catalogs: 273 | ctx.obj.fetch_catalog(catalog_url) 274 | print(ctx.obj) 275 | return 276 | 277 | for catalog in Catalog.all_catalogs(): 278 | catalog.fetch_catalog() 279 | print(catalog) 280 | 281 | 282 | @cli.command(name="clean-catalog") 283 | def clean_subcommand( 284 | ctx: typer.Context, 285 | force: bool = typer.Option(False, "--force", "-F", is_flag=True), 286 | all_catalogs: bool = typer.Option(False, "--all", is_flag=True), 287 | ): 288 | """Remove cached catalogs. 289 | 290 | __Examples__ 291 | 292 | Remove the cached default catalog: 293 | 294 | `$ springer clean-catalog --force` 295 | 296 | Remove the cached German language _Emergency Nursing_ catalog: 297 | 298 | `$ springer --language de --topic med clean-catalog --force` 299 | 300 | Remove all catalogs: 301 | 302 | `$ springer clean-catalog --force --all` 303 | """ 304 | 305 | if not force: 306 | typer.secho("The --force switch is required!", fg="red") 307 | raise typer.Exit(-1) 308 | 309 | if not all_catalogs: 310 | ctx.obj.cache_file.unlink() 311 | return 312 | 313 | for catalog in Catalog.all_catalogs(): 314 | catalog.cache_file.unlink() 315 | 316 | 317 | def _configure_logger(path: Path, logfile: str = None) -> None: 318 | """Adds `path` / `logfile` to the logger configuration. 319 | 320 | Makes sure that the path exists (including parents) 321 | and enables logging to the specified file located in that 322 | directory. 323 | 324 | :param path: pathlib.Path 325 | :param logfile: str 326 | 327 | """ 328 | 329 | logfile = logfile or DOWNLOAD_REPORT 330 | 331 | logfmt = "{time:YYYY-MM-DD HH:mm} | {message}" 332 | logger.configure( 333 | **{"handlers": [{"sink": path / logfile, "format": logfmt, "colorize": True,},]} 334 | ) 335 | 336 | 337 | @cli.command("download") 338 | def download_subcommand( 339 | ctx: typer.Context, 340 | component: Component, 341 | name: str = typer.Option( 342 | None, "--name", "-n", help="Name to match against title or package." 343 | ), 344 | dest_path: Path = typer.Option( 345 | Path.cwd(), 346 | "--dest-path", 347 | "-d", 348 | show_default=True, 349 | help="Destination directory for downloaded files.", 350 | ), 351 | file_format: FileFormat = typer.Option( 352 | FileFormat.pdf, "--format", "-f", show_default=True, show_choices=True, 353 | ), 354 | overwrite: bool = typer.Option( 355 | False, 356 | "--over-write", 357 | "-W", 358 | is_flag=True, 359 | show_default=True, 360 | help="Over write downloaded files.", 361 | ), 362 | ): 363 | """Download textbooks from Springer 364 | 365 | This command downloads textbooks from Springer to the local host. Files 366 | are saved by default in PDF format to the current working directory. 367 | 368 | If a download is interrupted by the user, it can be later restarted where 369 | the interruption occurred without downloading previous files. 370 | 371 | Problems encountered while downloading files are logged to: 372 | 373 | `dest-path/DOWNLOAD_REPORT.txt` 374 | 375 | __Examples__ 376 | 377 | Download all books in the default catalog in PDF format to the 378 | current directory: 379 | 380 | `$ springer download books` 381 | 382 | Download all books in EPUB format whose title includes 'python': 383 | 384 | `$ springer download books --name python --format epub` 385 | 386 | Download all books into directories grouped by package: 387 | 388 | `$ springer download packages --dest-path by_pkgs 389 | 390 | Download all books in a specific package in EPUB format: 391 | 392 | `$ springer download package --name 'Computer Science' --format epub` 393 | 394 | Download all books in packages whose name includes `Science`: 395 | 396 | `$ springer download package --name science --dest sciences` 397 | 398 | Download all books in all catalogs [en-all, de-all, de-med] in EPUB format: 399 | 400 | `$ springer download catalogs --format epub` 401 | 402 | The `catalogs` download subcommand will create a set of directories by language 403 | and topic for each catalog and save downloaded files into the appropriate 404 | directory, eg: 405 | 406 | \b 407 | - dest-path/English/All_Disciplines/package_name/title.fmt 408 | - dest-path/German/All_Disciplines/package_name/title.fmt 409 | - dest-path/German/Emergency_Nursing/package_name/title.fmt 410 | 411 | The `package` and `packages` subcommands will also save downloaded 412 | files into directories with package names rooted in the destination 413 | path: 414 | 415 | \b 416 | dest-path/package_name/title.fmt 417 | ... 418 | 419 | See Also: `set-default-catalog`, `get-default-catalog`, `list` 420 | """ 421 | 422 | dest_path = dest_path.resolve() 423 | 424 | dest_path.mkdir(mode=0o755, exist_ok=True, parents=True) 425 | 426 | _configure_logger(dest_path) 427 | 428 | try: 429 | if component in [Component.Books, Component.Catalog]: 430 | if not name: 431 | ctx.obj.download(dest_path, file_format, overwrite) 432 | else: 433 | ctx.obj.download_title(name, dest_path, file_format, overwrite) 434 | return 435 | 436 | if component in [Component.Package, Component.Packages]: 437 | 438 | if component is Component.Package: 439 | if not name: 440 | typer.secho(f"Please supply a `name` for package", fg="red") 441 | raise typer.Exit(-1) 442 | package_names = [name] 443 | else: 444 | package_names = ctx.obj.packages.keys() 445 | 446 | for pkgname in package_names: 447 | path = dest_path / pkgname.replace(" ", "_") 448 | path.mkdir(mode=0o755, exist_ok=True, parents=True) 449 | ctx.obj.download_package(pkgname, path, file_format, overwrite) 450 | return 451 | 452 | if component is Component.Catalogs: 453 | 454 | for catalog in Catalog.all_catalogs(): 455 | path = dest_path / catalog.language.name / catalog.topic.name 456 | path.mkdir(mode=0o755, exist_ok=True, parents=True) 457 | for pkgname in catalog.packages: 458 | path = dest_path / pkgname.replace(" ", "_") 459 | path.mkdir(mode=0o755, exist_ok=True, parents=True) 460 | catalog.download_package(pkgname, path, file_format, overwrite) 461 | 462 | except KeyError as error: 463 | typer.secho(str(error), fg="red") 464 | raise typer.Exit(-1) from None 465 | 466 | except PermissionError as error: 467 | typer.secho("Permission error for: ", nl=False) 468 | typer.secho(str(error.filename), fg="red") 469 | raise typer.Exit(-1) from None 470 | 471 | 472 | @cli.command("version") 473 | def version_subcommand(ctx: typer.Context): 474 | from .__version__ import __version__ 475 | 476 | typer.secho(f"{__version__}", fg="green") 477 | -------------------------------------------------------------------------------- /springer/catalog.py: -------------------------------------------------------------------------------- 1 | """the Springer Free Textbook Catalog 2 | """ 3 | 4 | import pandas 5 | import toml 6 | import typer 7 | import requests 8 | import string 9 | import sys 10 | 11 | from itertools import product 12 | from loguru import logger 13 | from time import sleep 14 | from pathlib import Path 15 | 16 | from .constants import FileFormat, Language, Topic, Token 17 | from .urls import urls as DEFAULT_URLS 18 | 19 | 20 | class Catalog: 21 | """Manage Springer's Excel-formated catalogs of textbooks 22 | 23 | This class simplifies using the Excel catalogs of textbooks Springer 24 | has made available free of charge. The class can manage the 25 | various catalogs, list the contents of the catalogs and finally 26 | use the catalogs to download textbooks to the local filesystem 27 | 28 | Using it is pretty simple: 29 | 30 | > from springer.catalog import Catalog 31 | > catalog = Catalog() 32 | > # will download and cache the initial default catalog 'en-all' 33 | 34 | 35 | """ 36 | 37 | @classmethod 38 | def all_catalogs(cls): 39 | """Generator classmethod that returns a configured Catalog 40 | for all valid combinations of Language and Topic. 41 | """ 42 | for language, topic in product(Language, Topic): 43 | try: 44 | yield cls(language, topic) 45 | except KeyError: 46 | pass 47 | 48 | def __init__( 49 | self, language: Language = None, topic: Topic = None, fetch: bool = True 50 | ): 51 | """ 52 | :param language: springer.constants.Language 53 | :param topic: springer.constants.Topic 54 | :param fetch: bool 55 | """ 56 | 57 | self.language = language or Language(self.defaults.get("language", "en")) 58 | self.topic = topic or Topic(self.defaults.get("topic", "all")) 59 | 60 | if not self.cache_file.exists() and fetch: 61 | try: 62 | self.fetch_catalog() 63 | except Exception as error: 64 | raise error from None 65 | 66 | def __repr__(self): 67 | return ( 68 | f"{self.__class__.__name__}(language={self.language}, topic={self.topic})" 69 | ) 70 | 71 | def __str__(self): 72 | return f"{Token.Catalog}|{self.name}" 73 | 74 | def __iter__(self): 75 | """An iterator over all textbooks in a catalog.""" 76 | return self.textbooks() 77 | 78 | @property 79 | def name(self) -> str: 80 | """An identifier formed from `language`-`topic`.""" 81 | try: 82 | return self._name 83 | except AttributeError: 84 | pass 85 | self._name = f"{self.language}-{self.topic}" 86 | return self._name 87 | 88 | @property 89 | def is_default(self) -> bool: 90 | """Returns True if this catalog has the default language and topic.""" 91 | 92 | # Avoid fetching the Catalog, normally shouldn't be a problem 93 | # but can slow down this method if the catalog hasn't been cached 94 | # locally yet. 95 | 96 | return Catalog(fetch=False) == self 97 | 98 | def __eq__(self, other): 99 | """Catalogs are equivalent if they have the same name.""" 100 | try: 101 | return self.name == other.name 102 | except AttributeError: 103 | pass 104 | return False 105 | 106 | @property 107 | def url(self) -> str: 108 | """The URL location of the Excel-formatted file for this catalog. 109 | 110 | Accessing this URL can raise KeyError for language/topic 111 | combinations which do not exist. 112 | """ 113 | try: 114 | return self._url 115 | except AttributeError: 116 | pass 117 | 118 | self._url = DEFAULT_URLS["catalogs"][self.language][self.topic] 119 | 120 | return self._url 121 | 122 | def content_url(self, uid: str, file_format: FileFormat) -> str: 123 | """The content download URL for textbook `uid` with `file_format`. 124 | 125 | :param uid: str 126 | :param file_format: springer.constants.FileFormat 127 | :return: str 128 | """ 129 | return DEFAULT_URLS["content"][file_format] + f"/{uid}.{file_format}" 130 | 131 | @property 132 | def config_dir(self) -> Path: 133 | """A pathlib.Path for the application-specific configuration directory. 134 | 135 | Configuration files and cached catalog CSV files are kept here. 136 | """ 137 | try: 138 | return self._config_dir 139 | except AttributeError: 140 | pass 141 | 142 | self._config_dir = Path(typer.get_app_dir(__package__)) 143 | self._config_dir.mkdir(mode=0o755, exist_ok=True) 144 | 145 | return self._config_dir 146 | 147 | @property 148 | def defaults_file(self) -> Path: 149 | """Path to the default Catalog configuration TOML file.""" 150 | try: 151 | return self._defaults_file 152 | except AttributeError: 153 | pass 154 | self._defaults_file = self.config_dir / "catalog_defaults.toml" 155 | return self._defaults_file 156 | 157 | @property 158 | def defaults(self) -> dict: 159 | """A dictionary loaded from the file `self.defaults_file`. 160 | """ 161 | try: 162 | contents = toml.decoder.load(self.defaults_file) 163 | except FileNotFoundError: 164 | contents = {} 165 | return contents 166 | 167 | def save_defaults(self) -> None: 168 | """Saves this instance's langauage and topic values to `defaults_file`. 169 | """ 170 | updated = {"language": self.language.value, "topic": self.topic.value} 171 | try: 172 | contents = toml.decoder.load(self.defaults_file) 173 | except FileNotFoundError: 174 | contents = {} 175 | contents.update(updated) 176 | toml.encoder.dump(contents, self.defaults_file.open("w")) 177 | 178 | @property 179 | def cache_file(self) -> Path: 180 | """A pathlib.Path for the locally cached catalog in CSV format. 181 | """ 182 | try: 183 | return self._cache_file 184 | except AttributeError: 185 | pass 186 | 187 | self._cache_file = self.config_dir / f"catalog-{self.name}.csv" 188 | 189 | return self._cache_file 190 | 191 | @property 192 | def ttable(self) -> dict: 193 | """Dictionary result of str.maketrans() for use with str.translate(). 194 | 195 | This table collapses punctuation to empty strings and whitespace 196 | to an underscore. 197 | """ 198 | try: 199 | return self._ttable 200 | except AttributeError: 201 | pass 202 | 203 | table = {p: "" for p in string.punctuation} 204 | table.update({w: "_" for w in string.whitespace}) 205 | table.update({"/": "_", "\\": "_"}) 206 | table.update({"™": "", "®": ""}) 207 | 208 | self._ttable = str.maketrans(table) 209 | 210 | return self._ttable 211 | 212 | @property 213 | def dataframe(self) -> pandas.DataFrame: 214 | """A pandas.DataFrame populated with the contents of the Springer free textbook catalog. 215 | 216 | The dataframe's source data is the cached CSV-formatted file 217 | self.`cache_file` and we transform the cached data everytime we 218 | construct the dataframe rather than applying it to the cached 219 | file. This seemed simpler for handling cached catalog updates. 220 | 221 | The source data is modified to make it easier to work with: 222 | 223 | - Empty rows are dropped 224 | - Column names are casefolded and embedded spaces replaced with underscores. 225 | - Column names replaced: 226 | o english_package_name|german_package_name -> package_name 227 | o book_title -> title 228 | - Columns added: uid, filename 229 | - Columns removed: "Unnamed: 0" if present 230 | 231 | Finally, the dataframe is sorted by title and author in 232 | ascending order. 233 | """ 234 | 235 | try: 236 | return self._dataframe 237 | except AttributeError: 238 | pass 239 | 240 | if not self.cache_file.exists(): 241 | self.fetch_catalog() 242 | 243 | df = pandas.read_csv(self.cache_file).dropna(axis=1, how="all") 244 | 245 | try: 246 | df.drop(columns="Unnamed: 0", inplace=True) 247 | except KeyError: 248 | pass 249 | 250 | # Normalize column names to make them easier to use. In this case, it 251 | # means replacing embedded spaces with underscores and casefolding the 252 | # resultant string. The column names should then be valid python 253 | # identifiers which makes the dataframe easier to use. 254 | 255 | columns = {c: c.casefold().translate(self.ttable) for c in df.columns} 256 | 257 | # later on, textbook.book_title looks funny 258 | columns["Book Title"] = "title" 259 | 260 | df.rename(columns=columns, inplace=True) 261 | 262 | # German language catalogs have 'german_package_name' and 'english 263 | # package_name' columns where the English column is empty. Again, to 264 | # make things easier later on, I conditionally rename 265 | # 'german_package_name' or 'english_package_name' to 'package_name' and 266 | # drop any unused package name columns. 267 | 268 | if "german_package_name" in df.columns: 269 | pkg_rename = {"german_package_name": "package_name"} 270 | df.drop(columns="english_package_name", inplace=True) 271 | else: 272 | pkg_rename = {"english_package_name": "package_name"} 273 | 274 | df.rename(columns=pkg_rename, inplace=True) 275 | 276 | # UID = unique identifier in content download URL 277 | df["uid"] = df.doi_url.str.lstrip("http://doi.org") 278 | 279 | # The filename is composed of the title and uid columns with different 280 | # rules for collapsing punctuation and white space. 281 | 282 | slash_and_dot_to_dash = str.maketrans({"/": "-", ".": "-",}) 283 | 284 | df["filename"] = ( 285 | df["title"] 286 | .str.translate(self.ttable) 287 | .str.cat(df.uid.str.translate(slash_and_dot_to_dash), sep="-",) 288 | ) 289 | 290 | self._dataframe = df.sort_values(by=["title", "author"], ascending=[True, True]) 291 | 292 | return self._dataframe 293 | 294 | @property 295 | def packages(self) -> dict: 296 | """Dictionary of pandas.DataFrames values whose keys are eBook package names. 297 | 298 | Keys are in sorted order. 299 | 300 | Note: Do not mutate the package dataframes unless you copy them. 301 | """ 302 | try: 303 | return self._packages 304 | except AttributeError: 305 | pass 306 | 307 | self._packages = { 308 | name: pkg for name, pkg in self.dataframe.groupby("package_name") 309 | } 310 | return self._packages 311 | 312 | def fetch_catalog(self, url: str = None) -> None: 313 | """Reads the Excel file at `url` and writes it to the local filesystem. 314 | 315 | The Excel file is written to `cache_file` in CSV format. If 316 | `url` is not given, `self.url` is used. 317 | 318 | :param url: str 319 | :return: None 320 | """ 321 | # XXX update defaults with new url if one is given and it succeeds? 322 | pandas.read_excel(url or self.url).to_csv(self.cache_file) 323 | 324 | def textbooks(self, dataframe: pandas.DataFrame = None) -> tuple: 325 | """This generator function returns a namedtuple for each row in `dataframe`. 326 | 327 | If `dataframe` is got supplied, `self.dataframe` is used. 328 | 329 | :param dataframe: pandas.DataFrame 330 | :return: generator returning namedtuples called 'TextBook' 331 | """ 332 | 333 | if dataframe is None: 334 | dataframe = self.dataframe 335 | 336 | for textbook in dataframe.itertuples(index=None, name="Textbook"): 337 | yield textbook 338 | 339 | def download_textbook( 340 | self, textbook: tuple, dest: Path, file_format: FileFormat, overwrite: bool, 341 | ) -> int: 342 | """Download `textbook` to `dest` with format `file_format`. 343 | 344 | Textbook is a Pandas.itertuple generated namedtuple based on 345 | the row in a dataframe. 346 | 347 | If destination path does not currently exist, it will be 348 | created. 349 | 350 | If the destination path exists and overwrite is False, a skipped 351 | entry for that textbook will be logged to the download report and 352 | zero bytes written is returned. 353 | 354 | If the textbook fails to download, an entry is logged to the 355 | download report with the HTTP status code and URL of the 356 | attemtped textbook. Again, zero bytes written is returned to 357 | the caller. 358 | 359 | Finally, the data received via HTTP is written to the local 360 | filesystem. The path to save the data is constructed using 361 | `dest`, the textbook.filename field and `file_format`.suffix. 362 | 363 | If the user interrupts saving the file to the local filesystem, 364 | the partial file is removed and the path is logged to the 365 | download report. The intention is to avoid leaving a truncated 366 | file for the user to trip on later. Not a delighter. 367 | 368 | The number of bytes written to the local filesystem is returned. 369 | 370 | :param textbook: namedtuple 371 | :param dest: Path 372 | :param file_format: springer.constants.FileFormat 373 | :param overwrite: bool 374 | :return: int 375 | 376 | Raises: 377 | - ValueError for missing Textbook attributes 378 | 379 | """ 380 | 381 | path = (dest / textbook.filename).with_suffix(file_format.suffix) 382 | 383 | if not overwrite and path.exists(): 384 | logger.debug(f"Skipped {path}") 385 | return 0 386 | 387 | url = self.content_url(textbook.uid, file_format) 388 | 389 | response = requests.get(url, stream=True) 390 | 391 | if not response: 392 | logger.debug(f"{response} {url}") 393 | return 0 394 | 395 | try: 396 | size = 0 397 | with path.open("wb") as fp: 398 | for chunk in response.iter_content(chunk_size=8192): 399 | size += len(chunk) 400 | fp.write(chunk) 401 | return size 402 | except KeyboardInterrupt: 403 | # EJO The user has aborted the download and we don't want to leave 404 | # a partially downloaded file to upset them later. Remove the 405 | # partial file, issue a log entry with the aborted path and 406 | # re-raise the exception. 407 | path.unlink() 408 | logger.debug(f"User aborted, removed partial file: {path}") 409 | raise 410 | 411 | def download_dataframe( 412 | self, 413 | dest: Path, 414 | file_format: FileFormat, 415 | overwrite: bool, 416 | dataframe: pandas.DataFrame = None, 417 | animated: bool = False, 418 | ) -> int: 419 | """Downloads all the textbooks in `dataframe` to `dest` with format `file_format`. 420 | 421 | :param dest: pathlib.path 422 | :param file_format: springer.constants.FileFormat 423 | :param overwrite: bool 424 | :param dataframe: pandas.DataFrame 425 | :return: 426 | """ 427 | 428 | if dataframe is None: 429 | dataframe = self.dataframe 430 | 431 | if len(dataframe) > 1 or animated: 432 | return self.download_dataframe_animated( 433 | dest, file_format, overwrite, dataframe 434 | ) 435 | 436 | total = 0 437 | for textbook in self.textbooks(dataframe): 438 | total += self.download_textbook( 439 | textbook, dest, file_format, overwrite=overwrite 440 | ) 441 | return total 442 | 443 | def download_dataframe_animated( 444 | self, 445 | dest: Path, 446 | file_format: FileFormat, 447 | overwrite: bool, 448 | dataframe: pandas.DataFrame = None, 449 | ) -> int: 450 | """Downloads all the textbooks in `dataframe` to `dest` with format `file_format`. 451 | 452 | :param dest: pathlib.path 453 | :param file_format: springer.constants.FileFormat 454 | :param overwrite: bool 455 | :param dataframe: pandas.DataFrame 456 | :return: int 457 | """ 458 | 459 | if dataframe is None: 460 | dataframe = self.dataframe 461 | 462 | def show_title(item): 463 | if not item: 464 | return f"Downloaded to {dest}" 465 | return item.title[:20] 466 | 467 | with typer.progressbar( 468 | self.textbooks(dataframe), 469 | length=len(dataframe), 470 | label=f"{self.name}:{file_format:4s}", 471 | show_percent=False, 472 | show_pos=True, 473 | width=10, 474 | empty_char=Token.Empty, 475 | fill_char=Token.Book, 476 | item_show_func=show_title, 477 | ) as workitems: 478 | total = 0 479 | for textbook in workitems: 480 | total += self.download_textbook( 481 | textbook, dest, file_format, overwrite=overwrite 482 | ) 483 | return total 484 | 485 | def download_title(self, title: str, dest: Path, file_format, overwrite: bool): 486 | """Download all the textbooks matching `title` to `dest` with format `file_format`. 487 | 488 | :param title: str 489 | :param dest: pathlib.path 490 | :param file_format: springer.constants.FileFormat 491 | :param overwrite: bool 492 | :return: int 493 | 494 | Raises KeyError if the requested title does not match any textbook titles. 495 | """ 496 | 497 | df = self.dataframe[self.dataframe.title.str.contains(title, case=False)] 498 | 499 | if df.empty: 500 | raise KeyError(f"No matches for requested title '{title}'") 501 | 502 | return self.download_dataframe(dest, file_format, overwrite, df) 503 | 504 | def download_package( 505 | self, package: str, dest: Path, file_format: FileFormat, overwrite: bool, 506 | ) -> int: 507 | """Download all the textbooks in `package` to `dest` with format `file_format`. 508 | 509 | :param package: str 510 | :param dest: pathlib.path 511 | :param file_format: springer.constants.FileFormat 512 | :param overwrite: bool 513 | :return: int 514 | 515 | Raises KeyError if the requested package does not match any package names. 516 | """ 517 | 518 | df = self.dataframe[ 519 | self.dataframe.package_name.str.contains(package, case=False) 520 | ] 521 | 522 | if df.empty: 523 | raise KeyError(f"No matches for requested package '{package}'") 524 | 525 | return self.download_dataframe(dest, file_format, overwrite, df) 526 | 527 | def download(self, dest: Path, file_format: FileFormat, overwrite: bool,) -> int: 528 | """Download all the textbooks in this catalog to `dest` with format `file_format`. 529 | 530 | :param dest: pathlib.path 531 | :param file_format: springer.constants.FileFormat 532 | :param overwrite: bool 533 | :return: int 534 | """ 535 | return self.download_dataframe(dest, file_format, overwrite) 536 | 537 | # EJO A formatter object might be a nice way to abstract all the list_* functions. 538 | 539 | def list_dataframe(self, dataframe: pandas.DataFrame, long_format: bool) -> None: 540 | """Displays one line per book described in the source `dataframe`. 541 | 542 | :param dataframe: pandas.DataFrame 543 | :param long_format: bool 544 | """ 545 | 546 | for textbook in self.textbooks(dataframe): 547 | 548 | lines = [] 549 | 550 | for key, value in textbook._asdict().items(): 551 | key = key.replace("_", " ").title() 552 | lines.append(f"{Token.Book}|{textbook.electronic_isbn}|{key}|{value}") 553 | lines.append(f"{Token.Stop}{lines[0][1:]}") 554 | if not long_format: 555 | lines = lines[:1] 556 | 557 | print("\n".join(lines)) 558 | 559 | def list_textbooks(self, long_format: bool, match: str = None) -> None: 560 | """Displays all books in a catalog. 561 | 562 | :param long_format: bool 563 | :param match: bool 564 | """ 565 | 566 | if match: 567 | source = self.dataframe[ 568 | self.dataframe.title.str.contains(match, case=False) 569 | ] 570 | else: 571 | source = self.dataframe 572 | 573 | self.list_dataframe(source, long_format) 574 | 575 | def list_package( 576 | self, name: str, package: pandas.DataFrame, long_format: bool, 577 | ): 578 | """Displays information about an eBook package with `name`. 579 | 580 | :param name: str 581 | :param package: pandas.DataFrame 582 | :param long_format: bool 583 | """ 584 | 585 | ebook = package.ebook_package.unique()[0] 586 | 587 | lines = [f"{Token.Package}|{ebook}|Name|{name}"] 588 | 589 | if long_format: 590 | lines.extend( 591 | [f"{Token.Package}|{ebook}|Books|{len(package)}",] 592 | ) 593 | print("\n".join(lines)) 594 | 595 | if long_format: 596 | self.list_dataframe(package, False) 597 | print(f"{Token.Stop}|{ebook}|Name|{name}") 598 | 599 | def list_packages(self, long_format: bool) -> None: 600 | """Display package information for all pacakges in the catalog. 601 | 602 | :param long_format: bool 603 | """ 604 | 605 | for name, package in self.packages.items(): 606 | self.list_package(name, package, long_format) 607 | 608 | def list_catalog(self, long_format: bool) -> None: 609 | """Display catalog information. 610 | 611 | :param long_format: bool 612 | """ 613 | 614 | print(f"{self}|URL|{self.url}") 615 | print(f"{self}|Default|{self.is_default}") 616 | print(f"{self}|Cache|{self.cache_file}") 617 | print(f"{self}|Packages|{len(self.packages)}") 618 | print(f"{self}|Books|{len(self.dataframe)}") 619 | 620 | if long_format: 621 | for name, package in self.packages.items(): 622 | self.list_package(name, package, False) 623 | self.list_dataframe(package, False) 624 | print(f"{Token.Stop}|{self.name}") 625 | -------------------------------------------------------------------------------- /demo/animations/list-books.cast: -------------------------------------------------------------------------------- 1 | {"version": 2, "width": 103, "height": 66, "timestamp": 1587525460, "idle_time_limit": 0.5, "env": {"SHELL": "/bin/bash", "TERM": "xterm-256color"}} 2 | [0.010432, "o", "\u001b[?1034h$ "] 3 | [0.326201, "o", "s"] 4 | [0.504314, "o", "p"] 5 | [0.578984, "o", "r"] 6 | [0.583897, "o", "i"] 7 | [0.750622, "o", "n"] 8 | [0.856761, "o", "g"] 9 | [0.931841, "o", "e"] 10 | [1.13395, "o", "r"] 11 | [1.209441, "o", " "] 12 | [1.348967, "o", "l"] 13 | [1.392846, "o", "i"] 14 | [1.518014, "o", "s"] 15 | [1.592658, "o", "t"] 16 | [1.62639, "o", " "] 17 | [1.720305, "o", "b"] 18 | [1.917407, "o", "o"] 19 | [1.923892, "o", "o"] 20 | [2.122343, "o", "k"] 21 | [2.159774, "o", "s"] 22 | [2.179249, "o", "\r\n"] 23 | [2.852864, "o", "📗|978-0-387-93837-0|Title|A Beginner's Guide to R\r\n"] 24 | [2.853024, "o", "📗|978-3-319-75771-1|Title|A Beginner's Guide to Scala, Object Orientation and Functional Programming\r\n📗|978-3-030-20290-3|Title|A Beginners Guide to Python 3 Programming\r\n📗|978-1-4614-5538-7|Title|A Clinical Guide to the Treatment of the Human Stress Response\r\n📗|978-3-662-56707-4|Title|A Concise Guide to Market Research\r\n"] 25 | [2.853156, "o", "📗|978-981-13-7496-8|Title|A Course in Rasch Measurement Theory\r\n📗|978-3-319-92207-2|Title|A First Introduction to Quantum Physics\r\n"] 26 | [2.853301, "o", "📗|978-1-84628-168-6|Title|A Modern Introduction to Probability and Statistics\r\n📗|978-3-662-49887-3|Title|A Primer on Scientific Programming with Python\r\n"] 27 | [2.853451, "o", "📗|978-3-030-02604-2|Title|A Pythagorean Introduction to Number Theory\r\n📗|978-3-319-77649-1|Title|Abstract Algebra\r\n"] 28 | [2.853562, "o", "📗|978-3-642-37902-4|Title|Acid-Base Diagrams\r\n📗|978-0-387-37575-5|Title|Acquired Brain Injury\r\n"] 29 | [2.853688, "o", "📗|978-1-4939-2113-3|Title|Additive Manufacturing Technologies\r\n"] 30 | [2.853791, "o", "📗|978-1-4419-1120-9|Title|Additive Manufacturing Technologies\r\n"] 31 | [2.85389, "o", "📗|978-3-030-25943-3|Title|Advanced Guide to Python 3 Programming\r\n"] 32 | [2.853993, "o", "📗|978-0-387-44899-2|Title|Advanced Organic Chemistry\r\n"] 33 | [2.854082, "o", "📗|978-0-387-71481-3|Title|Advanced Organic Chemistry\r\n"] 34 | [2.854171, "o", "📗|978-3-319-25675-7|Title|Advanced Quantum Mechanics\r\n"] 35 | [2.854268, "o", "📗|978-981-287-212-8|Title|Air Pollution and Greenhouse Gases\r\n📗|978-1-4613-0041-0|Title|Algebra\r\n"] 36 | [2.854383, "o", "📗|978-0-387-21736-9|Title|All of Statistics\r\n"] 37 | [2.854504, "o", "📗|978-3-642-20951-2|Title|Alternative Energy Sources\r\n"] 38 | [2.854604, "o", "📗|978-3-030-05609-4|Title|An Anthology of London in Literature, 1558-1914\r\n"] 39 | [2.854697, "o", "📗|978-1-4939-2623-7|Title|An Introduction to Biomechanics\r\n"] 40 | [2.85478, "o", "📗|978-3-319-63913-0|Title|An Introduction to Machine Learning\r\n"] 41 | [2.854895, "o", "📗|978-3-319-61185-3|Title|An Introduction to Soil Mechanics\r\n"] 42 | [2.854985, "o", "📗|978-1-4614-7138-7|Title|An Introduction to Statistical Learning\r\n"] 43 | [2.855084, "o", "📗|978-3-319-65682-3|Title|An Introduction to Zooarchaeology\r\n📗|978-3-319-91155-7|Title|Analysis for Computer Scientists\r\n"] 44 | [2.855186, "o", "📗|978-3-319-95762-3|Title|Analytical Corporate Finance\r\n"] 45 | [2.855259, "o", "📗|978-3-030-15671-8|Title|Analyzing Qualitative Data with MAXQDA\r\n📗|978-3-319-44794-0|Title|Applied Behavior Analysis\r\n"] 46 | [2.855321, "o", "📗|978-3-319-68301-0|Title|Applied Bioinformatics\r\n"] 47 | [2.855395, "o", "📗|978-1-4614-4262-2|Title|Applied Chemistry\r\n"] 48 | [2.855528, "o", "📗|978-3-319-91041-3|Title|Applied Linear Algebra\r\n📗|978-3-662-45171-7|Title|Applied Multivariate Statistical Analysis\r\n"] 49 | [2.855643, "o", "📗|978-3-319-12493-3|Title|Applied Partial Differential Equations\r\n📗|978-1-4614-6849-3|Title|Applied Predictive Modeling\r\n"] 50 | [2.855716, "o", "📗|978-3-662-54486-0|Title|Applied Quantitative Finance\r\n"] 51 | [2.855785, "o", "📗|978-3-319-61158-7|Title|ArcGIS for Environmental and Water Issues\r\n"] 52 | [2.855896, "o", "📗|978-3-319-95381-6|Title|Argumentation Theory: A Pragma-Dialectical Perspective\r\n📗|978-3-319-74373-8|Title|Astronautics\r\n"] 53 | [2.855977, "o", "📗|978-1-4612-1844-9|Title|Automata and Computability\r\n"] 54 | [2.856046, "o", "📗|978-3-319-75804-6|Title|Automatic Control with Experiments\r\n"] 55 | [2.856115, "o", "📗|978-3-319-27265-8|Title|Basic Concepts in Computational Physics\r\n"] 56 | [2.856197, "o", "📗|978-3-319-50651-7|Title|Basics of Laser Physics\r\n"] 57 | [2.856283, "o", "📗|978-1-4614-8687-9|Title|Bayesian Essentials with R\r\n"] 58 | [2.856392, "o", "📗|978-1-4419-0925-1|Title|Bayesian and Frequentist Regression Methods\r\n📗|978-3-319-67395-0|Title|Bioinformatics for Evolutionary Biologists\r\n"] 59 | [2.85646, "o", "📗|978-1-4471-4474-8|Title|Biomedical Informatics\r\n📗|978-3-319-48848-6|Title|Breast Cancer\r\n"] 60 | [2.856557, "o", "📗|978-3-319-46394-0|Title|Brewing Science: A Multidisciplinary Approach\r\n📗|978-3-319-31089-3|Title|Brownian Motion, Martingales, and Stochastic Calculus \r\n"] 61 | [2.856632, "o", "📗|978-3-319-77809-9|Title|Building Energy Modeling with OpenStudio\r\n📗|978-3-319-91575-3|Title|Business Ethics - A Philosophical and Behavioral Approach\r\n"] 62 | [2.856745, "o", "📗|978-3-319-58307-5|Title|Business Process Management Cases\r\n📗|978-1-4614-7946-8|Title|Calculus With Applications\r\n"] 63 | [2.856829, "o", "📗|978-3-319-46407-7|Title|Cardiovascular Biomechanics\r\n📗|978-0-387-46271-4|Title|Ceramic Materials\r\n"] 64 | [2.856916, "o", "📗|978-1-4614-3523-5|Title|Ceramic Materials\r\n📗|978-3-642-19864-9|Title|Chemical Thermodynamics\r\n"] 65 | [2.857024, "o", "📗|978-1-4614-9126-2|Title|Chemical and Bioprocess Engineering\r\n📗|978-0-387-88963-4|Title|Child Neuropsychology\r\n"] 66 | [2.857057, "o", "📗|978-1-4939-1194-3|Title|Classical Fourier Analysis\r\n"] 67 | [2.857165, "o", "📗|978-94-007-5757-8|Title|Climate Change Science: A Modern Synthesis\r\n📗|978-1-4419-0641-0|Title|Clinical Assessment of Child and Adolescent Personality and Behavior\r\n"] 68 | [2.857255, "o", "📗|978-3-319-27104-0|Title|Clinical Data Analysis on a Pocket Calculator\r\n📗|978-3-319-68834-3|Title|Clinical Methods in Medical Family Therapy\r\n📗|978-0-387-36601-2|Title|Clinical Neuroanatomy\r\n"] 69 | [2.857347, "o", "📗|978-3-319-70920-8|Title|Communication and Bioethics at the End of Life\r\n📗|978-1-4419-7288-0|Title|Complex Analysis\r\n"] 70 | [2.857419, "o", "📗|978-0-387-74365-3|Title|Composite Materials\r\n"] 71 | [2.857489, "o", "📗|978-3-540-77974-2|Title|Computational Geometry\r\n📗|978-3-319-61088-7|Title|Computational Physics\r\n"] 72 | [2.857567, "o", "📗|978-3-319-00401-3|Title|Computational Physics\r\n"] 73 | [2.857658, "o", "📗|978-1-84882-935-0|Title|Computer Vision\r\n📗|978-3-319-65439-3|Title|Concepts, Methods and Practical Applications in Applied Demography\r\n"] 74 | [2.857738, "o", "📗|978-1-4471-5601-7|Title|Concise Guide to Databases\r\n"] 75 | [2.857819, "o", "📗|978-3-319-57750-0|Title|Concise Guide to Software Engineering\r\n📗|978-981-13-2475-8|Title|Conferencing and Presentation English for Young Academics\r\n"] 76 | [2.857921, "o", "📗|978-981-10-8297-9|Title|Control Engineering\r\n📗|978-981-10-8321-1|Title|Control Engineering: MATLAB Exercises\r\n"] 77 | [2.858011, "o", "📗|978-3-642-40975-2|Title|Corporate Social Responsibility\r\n📗|978-3-319-54349-9|Title|Correctional Counseling and Treatment\r\n"] 78 | [2.858103, "o", "📗|978-3-319-57040-2|Title|Cosmology for the Curious\r\n"] 79 | [2.858231, "o", "📗|978-3-319-76442-9|Title|Criminal Justice and Mental Health\r\n"] 80 | [2.858329, "o", "📗|978-3-319-21936-3|Title|Cryptography Made Simple\r\n📗|978-3-662-55381-7|Title|Customer Relationship Management\r\n"] 81 | [2.858436, "o", "📗|978-3-319-03762-2|Title|Data Analysis\r\n"] 82 | [2.858472, "o", "📗|978-3-319-14142-8|Title|Data Mining\r\n"] 83 | [2.85861, "o", "📗|978-3-319-72347-1|Title|Data Science and Predictive Analytics\r\n"] 84 | [2.858709, "o", "📗|978-3-319-13072-9|Title|Data Structures and Algorithms with Python\r\n📗|978-0-387-72579-6|Title|Database Marketing\r\n"] 85 | [2.858831, "o", "📗|978-1-4419-5653-8|Title|Design Research in Information Systems\r\n"] 86 | [2.858944, "o", "📗|978-3-319-52250-0|Title|Design and Analysis of Experiments\r\n"] 87 | [2.859039, "o", "📗|978-0-387-28117-9|Title|Developmental Neurobiology\r\n"] 88 | [2.859155, "o", "📗|978-1-4612-4360-1|Title|Differential Equations and Their Applications\r\n"] 89 | [2.859259, "o", "📗|978-3-030-13005-3|Title|Digital Business Models\r\n📗|978-1-4471-6684-9|Title|Digital Image Processing\r\n"] 90 | [2.859356, "o", "📗|978-3-319-64786-9|Title|Disability and Vocational Rehabilitation in Rural Settings\r\n"] 91 | [2.859473, "o", "📗|978-0-387-21777-2|Title|Discrete Mathematics\r\n"] 92 | [2.859611, "o", "📗|978-981-13-0785-0|Title|ENZYMES: Catalysis, Kinetics and Mechanisms\r\n"] 93 | [2.859741, "o", "📗|978-3-642-20059-5|Title|Econometrics\r\n📗|978-3-319-50319-6|Title|Economics as Applied Ethics\r\n"] 94 | [2.859854, "o", "📗|978-981-13-6643-7|Title|Educational Technology\r\n"] 95 | [2.859934, "o", "📗|978-1-4614-0400-2|Title|Electrical Machines\r\n"] 96 | [2.860039, "o", "📗|978-4-431-54526-2|Title|Electricity and Magnetism\r\n"] 97 | [2.860137, "o", "📗|978-1-4614-8933-7|Title|Electrochemical Impedance Spectroscopy and its Applications\r\n"] 98 | [2.860223, "o", "📗|978-3-642-30250-3|Title|Electrochemistry\r\n"] 99 | [2.860308, "o", "📗|978-3-319-10091-3|Title|Electronic Commerce\r\n"] 100 | [2.860412, "o", "📗|978-3-319-58715-8|Title|Electronic Commerce 2018\r\n"] 101 | [2.860518, "o", "📗|978-3-319-39439-8|Title|Electronics for Embedded Systems\r\n"] 102 | [2.86063, "o", "📗|978-1-4614-6271-2|Title|Elementary Analysis\r\n📗|978-3-319-19587-2|Title|Elementary Mechanics Using Matlab\r\n"] 103 | [2.860697, "o", "📗|978-3-319-19596-4|Title|Elementary Mechanics Using Python\r\n"] 104 | [2.8608, "o", "📗|978-3-319-66772-0|Title|Empathetic Space on Screen\r\n"] 105 | [2.860889, "o", "📗|978-3-662-53022-1|Title|Energy Economics\r\n"] 106 | [2.860997, "o", "📗|978-3-319-49875-1|Title|Energy Harvesting and Energy Efficiency\r\n"] 107 | [2.861091, "o", "📗|978-3-319-21239-5|Title|Energy Storage\r\n"] 108 | [2.861219, "o", "📗|978-3-319-66219-0|Title|Energy and the Wealth of Nations\r\n"] 109 | [2.861342, "o", "📗|978-3-319-07806-9|Title|Engineering Electromagnetics\r\n📗|978-1-4899-7454-9|Title|Engineering Flow and Heat Exchange\r\n"] 110 | [2.861468, "o", "📗|978-3-642-30319-7|Title|Engineering Mechanics 1\r\n"] 111 | [2.861577, "o", "📗|978-3-662-56272-7|Title|Engineering Mechanics 2\r\n📗|978-3-662-53785-5|Title|Enterprise Risk Management Models\r\n"] 112 | [2.861711, "o", "📗|978-3-319-89292-4|Title|Entertainment Science\r\n📗|978-94-007-1171-6|Title|Epidemiological Research: Terms and Concepts\r\n"] 113 | [2.861797, "o", "📗|978-3-642-35963-7|Title|Essential Astrophysics\r\n📗|978-3-319-68837-4|Title|Essentials of Business Analytics\r\n"] 114 | [2.861885, "o", "📗|978-3-319-24551-5|Title|Essentials of Cerebellum and Cerebellar Disorders\r\n📗|978-1-4614-9138-5|Title|Essentials of Food Science\r\n"] 115 | [2.861983, "o", "📗|978-3-319-43341-7|Title|Evidence-Based Critical Care\r\n📗|978-1-4614-7807-2|Title|Evidence-Based Interventions for Children with Challenging Behavior\r\n"] 116 | [2.862124, "o", "📗|978-3-030-15224-6|Title|Evidence-Based Practice in Clinical Social Work\r\n📗|978-3-319-29716-3|Title|Evolutionary Thinking in Medicine\r\n📗|978-3-319-49810-2|Title|Exam Survival Guide: Physical Chemistry\r\n"] 117 | [2.862154, "o", "📗|978-3-030-01279-3|Title|Excel Data Analysis\r\n"] 118 | [2.862283, "o", "📗|978-3-642-54083-7|Title|Extragalactic Astronomy and Cosmology\r\n📗|978-3-319-57883-5|Title|Eye Tracking Methodology\r\n"] 119 | [2.862367, "o", "📗|978-1-4020-6808-9|Title|Fatigue of Structures and Materials\r\n📗|978-3-319-09351-2|Title|Fluid Dynamics\r\n"] 120 | [2.86248, "o", "📗|978-3-319-45776-5|Title|Food Analysis\r\n📗|978-3-319-44127-6|Title|Food Analysis Laboratory Manual\r\n📗|978-3-540-69934-7|Title|Food Chemistry\r\n"] 121 | [2.862595, "o", "📗|978-1-4939-9621-6|Title|Food Fraud Prevention\r\n📗|978-1-4471-5134-0|Title|Foundations for Designing User-Centered Systems\r\n"] 122 | [2.862711, "o", "📗|978-3-319-62872-1|Title|Foundations of Analytical Chemistry\r\n📗|978-3-030-18435-3|Title|Foundations of Behavioral Health\r\n📗|978-3-319-70790-7|Title|Foundations of Programming Languages\r\n"] 123 | [2.8628, "o", "📗|978-3-319-65867-4|Title|Foundations of Quantum Mechanics\r\n"] 124 | [2.862903, "o", "📗|978-3-319-92333-8|Title|Fraud and Corruption\r\n"] 125 | [2.862984, "o", "📗|978-3-662-53045-0|Title|Fundamental Astronomy\r\n"] 126 | [2.863071, "o", "📗|978-0-387-49312-1|Title|Fundamentals of Biomechanics\r\n"] 127 | [2.863154, "o", "📗|978-3-319-44738-4|Title|Fundamentals of Biomechanics\r\n"] 128 | [2.863242, "o", "📗|978-3-642-33143-5|Title|Fundamentals of Business Process Management\r\n"] 129 | [2.863333, "o", "📗|978-3-662-56509-4|Title|Fundamentals of Business Process Management\r\n"] 130 | [2.863433, "o", "📗|978-3-319-18539-2|Title|Fundamentals of Clinical Trials\r\n"] 131 | [2.863532, "o", "📗|978-3-319-89491-1|Title|Fundamentals of Java Programming\r\n📗|978-3-319-05290-8|Title|Fundamentals of Multimedia\r\n📗|978-0-306-48048-5|Title|Fundamentals of Power Electronics\r\n📗|978-3-319-01851-5|Title|Fundamentals of Robotic Mechanical Systems\r\n"] 132 | [2.863624, "o", "📗|978-3-319-75708-7|Title|Fundamentals of Solid State Engineering\r\n📗|978-3-319-24331-3|Title|Fundamentals of Structural Engineering\r\n"] 133 | [2.863711, "o", "📗|978-3-662-46950-7|Title|Game Theory\r\n📗|978-1-4020-5719-9|Title|Geomorphology of Desert Environments\r\n"] 134 | [2.86379, "o", "📗|978-3-319-94313-8|Title|Global Supply Chain and Operations Management\r\n📗|978-3-319-33916-0|Title|Grammar for Teachers\r\n"] 135 | [2.863875, "o", "📗|978-3-540-32899-5|Title|Group Theory\r\n📗|978-94-007-6863-5|Title|Group Theory Applied to Chemistry\r\n"] 136 | [2.863965, "o", "📗|978-3-319-72547-5|Title|Guide to Competitive Programming\r\n"] 137 | [2.864035, "o", "📗|978-3-319-55606-2|Title|Guide to Computer Network Security\r\n📗|978-3-319-44561-8|Title|Guide to Discrete Mathematics\r\n"] 138 | [2.864125, "o", "📗|978-3-319-73132-2|Title|Guide to Scientific Computing in C++\r\n📗|978-0-387-45524-2|Title|Handbook of Biological Confocal Microscopy\r\n"] 139 | [2.864212, "o", "📗|978-3-319-19464-6|Title|Handbook of Cardiac Anatomy, Physiology, and Devices\r\n"] 140 | [2.864315, "o", "📗|978-3-319-28887-1|Title|Handbook of Consumer Finance Research\r\n"] 141 | [2.864399, "o", "📗|978-0-387-32353-4|Title|Handbook of Disaster Research\r\n📗|978-3-030-11117-5|Title|Handbook of Evolutionary Research in Archaeology\r\n"] 142 | [2.864518, "o", "📗|978-3-319-03623-6|Title|Handbook of LGBT Elders\r\n"] 143 | [2.864584, "o", "📗|978-1-4614-3987-5|Title|Handbook of Marriage and the Family\r\n📗|978-0-387-77650-7|Title|Handbook of Quantitative Criminology\r\n"] 144 | [2.864687, "o", "📗|978-0-387-36274-8|Title|Handbook of Sociological Theory\r\n📗|978-0-306-48247-2|Title|Handbook of the Life Course\r\n"] 145 | [2.86471, "o", "📗|978-0-387-36218-2|Title|Handbook of the Sociology of Gender\r\n"] 146 | [2.864871, "o", "📗|978-1-4613-0139-4|Title|Human Chromosomes\r\n📗|978-1-4615-1077-2|Title|Integrated Neuroscience\r\n"] 147 | [2.86497, "o", "📗|978-1-4939-3058-6|Title|Integrative Human Biochemistry\r\n📗|978-3-319-12682-1|Title|Intermediate Physics for Medicine and Biology\r\n"] 148 | [2.865061, "o", "📗|978-3-319-96622-9|Title|International Business Management\r\n📗|978-0-387-72071-5|Title|International Handbook of Historical Archaeology\r\n"] 149 | [2.865158, "o", "📗|978-3-319-14454-2|Title|International Humanitarian Action\r\n"] 150 | [2.865253, "o", "📗|978-3-319-56194-3|Title|International Perspectives on Psychotherapy\r\n"] 151 | [2.865349, "o", "📗|978-3-642-37314-5|Title|International Trade Theory and Policy\r\n📗|978-3-319-99516-8|Title|Internet of Things From Hype to Reality\r\n📗|978-3-319-58487-4|Title|Introduction to Artificial Intelligence\r\n"] 152 | [2.865423, "o", "📗|978-3-319-50017-1|Title|Introduction to Data Science\r\n"] 153 | [2.865497, "o", "📗|978-3-319-73004-2|Title|Introduction to Deep Learning\r\n"] 154 | [2.865592, "o", "📗|978-3-319-92804-3|Title|Introduction to Digital Systems Design\r\n📗|978-3-319-50091-1|Title|Introduction to Electronic Commerce and Social Commerce\r\n"] 155 | [2.865679, "o", "📗|978-1-4614-3143-5|Title|Introduction to Embedded Systems\r\n"] 156 | [2.865789, "o", "📗|978-3-662-44874-8|Title|Introduction to Evolutionary Computing\r\n📗|978-3-319-77434-3|Title|Introduction to Formal Philosophy\r\n"] 157 | [2.865863, "o", "📗|978-981-13-1090-4|Title|Introduction to General Relativity\r\n"] 158 | [2.865967, "o", "📗|978-3-319-57252-9|Title|Introduction to Law\r\n📗|978-3-319-34195-8|Title|Introduction to Logic Circuits & Logic Design with VHDL \r\n"] 159 | [2.866042, "o", "📗|978-3-030-12489-2|Title|Introduction to Logic Circuits & Logic Design with VHDL \r\n"] 160 | [2.866131, "o", "📗|978-3-319-53883-9|Title|Introduction to Logic Circuits & Logic Design with Verilog\r\n📗|978-3-030-13605-5|Title|Introduction to Logic Circuits & Logic Design with Verilog\r\n"] 161 | [2.866266, "o", "📗|978-3-319-00894-3|Title|Introduction to Mathematica® for Physicists\r\n📗|978-3-319-98833-7|Title|Introduction to Parallel Computing\r\n"] 162 | [2.866351, "o", "📗|978-3-319-48936-0|Title|Introduction to Partial Differential Equations\r\n📗|978-3-319-02099-0|Title|Introduction to Partial Differential Equations\r\n"] 163 | [2.866434, "o", "📗|978-3-319-78181-5|Title|Introduction to Particle and Astroparticle Physics\r\n"] 164 | [2.866582, "o", "📗|978-3-319-22309-4|Title|Introduction to Plasma Physics and Controlled Fusion\r\n"] 165 | [2.86661, "o", "📗|978-3-319-75502-1|Title|Introduction to Programming with Fortran\r\n"] 166 | [2.866703, "o", "📗|978-1-4419-9982-5|Title|Introduction to Smooth Manifolds\r\n📗|978-3-319-46162-5|Title|Introduction to Statistics and Data Analysis \r\n"] 167 | [2.866805, "o", "📗|978-3-319-29854-2|Title|Introduction to Time Series and Forecasting\r\n📗|978-3-030-00581-8|Title|Introductory Computer Forensics\r\n"] 168 | [2.866896, "o", "📗|978-3-319-68598-4|Title|Introductory Quantum Mechanics\r\n📗|978-0-387-79054-1|Title|Introductory Statistics with R\r\n"] 169 | [2.866969, "o", "📗|978-0-387-88698-5|Title|Introductory Time Series with R\r\n"] 170 | [2.867063, "o", "📗|978-0-387-24158-6|Title|Intuitive Probability and Random Processes using MATLAB®\r\n📗|978-3-319-05699-9|Title|Irrigation and Drainage Engineering\r\n"] 171 | [2.867173, "o", "📗|978-3-319-99420-8|Title|Java in Two Semesters\r\n📗|978-3-319-59978-6|Title|Knowledge Management\r\n"] 172 | [2.867271, "o", "📗|978-1-4614-4556-2|Title|LGBT-Parent Families\r\n📗|978-3-319-47831-9|Title|LaTeX in 24 Hours\r\n"] 173 | [2.867422, "o", "📗|978-981-10-1802-2|Title|Language Across the Curriculum & CLIL in English as an Additional Language (EAL) Contexts\r\n📗|978-3-319-31036-7|Title|Leadership Today\r\n📗|978-1-4939-6374-4|Title|Learning Landscape Ecology\r\n"] 174 | [2.867513, "o", "📗|978-3-662-54817-2|Title|Legal Dynamics of EU External Relations\r\n📗|978-3-319-73123-0|Title|Lessons on Synthetic Bioarchitectures\r\n"] 175 | [2.867595, "o", "📗|978-3-319-56475-3|Title|Life Cycle Assessment\r\n"] 176 | [2.867672, "o", "📗|978-3-319-24346-7|Title|Linear Algebra\r\n📗|978-3-319-11080-6|Title|Linear Algebra Done Right\r\n"] 177 | [2.867773, "o", "📗|978-3-319-78361-1|Title|Linear Algebra and Analytic Geometry for Physical Sciences\r\n📗|978-1-4614-7630-6|Title|Linear Programming\r\n📗|978-3-319-18842-3|Title|Linear and Nonlinear Programming\r\n"] 178 | [2.867872, "o", "📗|978-3-319-63588-0|Title|Logical Foundations of Cyber-Physical Systems\r\n📗|978-3-319-01769-3|Title|Logistics\r\n"] 179 | [2.867965, "o", "📗|978-1-4614-2197-9|Title|MATLAB for Psychologists\r\n"] 180 | [2.868055, "o", "📗|978-3-319-15195-3|Title|Machine Learning in Medicine - a Complete Overview\r\n📗|978-3-319-22951-5|Title|Magnetic Interactions in Molecules and Solids\r\n"] 181 | [2.868145, "o", "📗|978-3-319-71288-8|Title|Managing Media and Digital Organizations\r\n📗|978-94-024-1144-7|Title|Managing Sustainable Business\r\n"] 182 | [2.868269, "o", "📗|978-3-030-12727-5|Title|Mapping Global Theatre Histories\r\n📗|978-981-10-5218-7|Title|Market Research\r\n📗|978-3-319-54398-7|Title|Mass Spectrometry\r\n"] 183 | [2.868355, "o", "📗|978-3-319-97298-5|Title|Mathematical Logic\r\n"] 184 | [2.868447, "o", "📗|978-3-319-01195-0|Title|Mathematical Physics\r\n📗|978-3-319-27877-3|Title|Mechanics and Thermodynamics\r\n"] 185 | [2.868546, "o", "📗|978-3-319-72000-5|Title|Media and Digital Management\r\n📗|978-3-7091-0715-7|Title|Metabolism of Human Diseases\r\n"] 186 | [2.868643, "o", "📗|978-3-319-23042-9|Title|Methods of Mathematical Modelling\r\n📗|978-3-642-37434-0|Title|Microeconomics\r\n📗|978-3-319-59731-7|Title|Modeling Life\r\n"] 187 | [2.868743, "o", "📗|978-1-84800-322-4|Title|Modelling Computing Systems\r\n📗|978-3-319-65094-4|Title|Motivation and Action \r\n"] 188 | [2.868839, "o", "📗|978-981-13-8759-3|Title|Multimedia Big Data Computing for IoT Applications\r\n📗|978-3-319-23012-2|Title|Multinational Management\r\n"] 189 | [2.868908, "o", "📗|978-1-4471-6419-7|Title|Multivariate Calculus and Geometry\r\n"] 190 | [2.868987, "o", "📗|978-3-319-09171-6|Title|Nanotechnology: Principles and Practices\r\n📗|978-3-319-94463-0|Title|Neural Networks and Deep Learning\r\n"] 191 | [2.869058, "o", "📗|978-3-540-27752-1|Title|New Introduction to Multiple Time Series Analysis\r\n"] 192 | [2.869152, "o", "📗|978-0-387-40065-5|Title|Numerical Optimization\r\n📗|978-3-319-24280-4|Title|Object-Oriented Analysis, Design and Implementation\r\n"] 193 | [2.86924, "o", "📗|978-1-349-95348-6|Title|Of Cigarettes, High Heels, and Other Interesting Things\r\n📗|978-3-319-91890-7|Title|Off-Grid Electrical Systems in Developing Countries\r\n"] 194 | [2.869317, "o", "📗|978-3-319-91722-1|Title|Optimization of Process Flowsheets through Metaheuristic Techniques \r\n📗|978-1-4614-3618-8|Title|Ordinary Differential Equations\r\n"] 195 | [2.869407, "o", "📗|978-1-4614-4809-9|Title|Partial Differential Equations\r\n📗|978-3-662-46321-5|Title|Particles and Nuclei\r\n"] 196 | [2.869512, "o", "📗|978-3-319-96337-2|Title|Perceptual Organization\r\n📗|978-3-319-72682-3|Title|Perspectives on Elderly Crime and Victimization\r\n"] 197 | [2.869599, "o", "📗|978-3-642-34132-8|Title|Petroleum Geoscience\r\n📗|978-1-4614-6486-0|Title|Pharmaceutical Biotechnology\r\n"] 198 | [2.869648, "o", "📗|978-3-030-00710-2|Title|Pharmaceutical Biotechnology\r\n"] 199 | [2.869755, "o", "📗|978-3-030-03255-5|Title|Philosophical and Mathematical Logic\r\n📗|978-3-319-78729-9|Title|Philosophy of Race\r\n"] 200 | [2.869824, "o", "📗|978-3-319-26551-3|Title|Philosophy of Science for Scientists\r\n"] 201 | [2.86991, "o", "📗|978-3-319-54064-1|Title|Phylogenomics\r\n📗|978-3-319-14777-2|Title|Physical Asset Management\r\n"] 202 | [2.870001, "o", "📗|978-3-319-15666-8|Title|Physical Chemistry from a Different Angle\r\n📗|978-3-319-66631-0|Title|Physics from Symmetry\r\n"] 203 | [2.870107, "o", "📗|978-3-319-72314-3|Title|Physics of Oscillations and Waves\r\n📗|978-1-4939-1151-6|Title|Physics of Semiconductor Devices\r\n"] 204 | [2.8702, "o", "📗|978-3-319-77315-5|Title|Plant Anatomy\r\n📗|978-3-662-56233-8|Title|Plant Ecology\r\n"] 205 | [2.870284, "o", "📗|978-0-387-78341-3|Title|Plant Physiological Ecology\r\n📗|978-981-13-2023-1|Title|Plant Physiology, Development and Metabolism\r\n"] 206 | [2.870338, "o", "📗|978-3-540-76504-2|Title|Plate Tectonics\r\n"] 207 | [2.870373, "o", "📗|978-3-030-19182-5|Title|Policing and Minority Communities\r\n"] 208 | [2.870426, "o", "📗|978-3-319-68588-5|Title|Political Social Work\r\n"] 209 | [2.870536, "o", "📗|978-3-662-49279-6|Title|Polymer Chemistry\r\n📗|978-3-642-28980-4|Title|Polymer Synthesis: Theory and Practice\r\n"] 210 | [2.870626, "o", "📗|978-3-319-21173-2|Title|Practical Electrical Engineering\r\n📗|978-0-387-68566-3|Title|Primer on the Rheumatic Diseases\r\n📗|978-1-4614-9236-8|Title|Principles of Astrophysics\r\n"] 211 | [2.87069, "o", "📗|978-1-4471-7307-6|Title|Principles of Data Mining\r\n"] 212 | [2.870791, "o", "📗|978-0-387-46312-4|Title|Principles of Fluorescence Spectroscopy\r\n📗|978-3-319-57589-6|Title|Principles of Microeconomics\r\n"] 213 | [2.870874, "o", "📗|978-3-319-55615-4|Title|Principles of Mobile Communication\r\n📗|978-1-4614-6786-1|Title|Principles of Musical Acoustics\r\n"] 214 | [2.870953, "o", "📗|978-3-642-23026-4|Title|Principles of Physics\r\n📗|978-1-4614-2212-9|Title|Principles of Polymer Chemistry\r\n"] 215 | [2.871043, "o", "📗|978-1-4757-0576-8|Title|Principles of Quantum Mechanics\r\n📗|978-1-4419-9504-9|Title|Principles of Terrestrial Ecosystem Ecology\r\n"] 216 | [2.871147, "o", "📗|978-1-4612-4374-8|Title|Probability\r\n📗|978-1-4471-5361-0|Title|Probability Theory\r\n📗|978-1-4471-5201-9|Title|Probability Theory\r\n"] 217 | [2.87123, "o", "📗|978-3-319-64410-3|Title|Probability and Statistics for Computer Science\r\n"] 218 | [2.871307, "o", "📗|978-3-319-63133-2|Title|Problems in Classical Electromagnetism\r\n📗|978-3-662-57265-8|Title|Proofs from THE BOOK\r\n"] 219 | [2.871407, "o", "📗|978-1-4939-1911-6|Title|Psychoeducational Assessment and Report Writing\r\n📗|978-3-319-31791-5|Title|Psychology of Perception\r\n"] 220 | [2.871486, "o", "📗|978-0-387-87573-6|Title|Psychology, Religion, and Spirituality\r\n"] 221 | [2.871587, "o", "📗|978-3-319-18398-5|Title|Python For ArcGIS\r\n📗|978-1-4471-6642-9|Title|Python Programming Fundamentals\r\n📗|978-3-319-99118-4|Title|Quantitative Methods for the Social Sciences\r\n"] 222 | [2.871686, "o", "📗|978-3-642-20556-9|Title|Quantum Mechanics\r\n📗|978-1-4612-1272-0|Title|Quantum Mechanics\r\n"] 223 | [2.87179, "o", "📗|978-3-030-00464-4|Title|Quantum Mechanics for Pedestrians 1\r\n📗|978-3-030-00467-5|Title|Quantum Mechanics for Pedestrians 2\r\n"] 224 | [2.871913, "o", "📗|978-1-4614-7116-5|Title|Quantum Theory for Mathematicians\r\n📗|978-3-030-04516-6|Title|Quick Start Guide to VHDL\r\n"] 225 | [2.872013, "o", "📗|978-3-030-10552-5|Title|Quick Start Guide to Verilog\r\n📗|978-3-319-51118-4|Title|Reactive Power Control in AC Power Systems\r\n📗|978-1-4419-9479-0|Title|Reading, Writing, and Proving\r\n"] 226 | [2.872102, "o", "📗|978-3-319-20451-2|Title|Readings in Formal Epistemology\r\n📗|978-1-4939-2766-1|Title|Real Analysis\r\n"] 227 | [2.872211, "o", "📗|978-3-319-29659-3|Title|Recommender Systems\r\n"] 228 | [2.872306, "o", "📗|978-3-319-19425-7|Title|Regression Modeling Strategies\r\n"] 229 | [2.872393, "o", "📗|978-1-4612-0979-9|Title|Representation Theory\r\n📗|978-3-030-05900-2|Title|Research Methods for Social Justice and Equity in Education\r\n"] 230 | [2.872469, "o", "📗|978-3-319-96713-4|Title|Research Methods for the Digital Humanities\r\n"] 231 | [2.87255, "o", "📗|978-1-84628-642-1|Title|Robotics\r\n📗|978-3-319-72911-4|Title|Robotics\r\n"] 232 | [2.872626, "o", "📗|978-3-319-54413-7|Title|Robotics, Vision and Control\r\n"] 233 | [2.872729, "o", "📗|978-3-642-20144-8|Title|Robotics, Vision and Control\r\n📗|978-3-319-20600-4|Title|SPSS for Starters and 2nd Levelers\r\n"] 234 | [2.872853, "o", "📗|978-1-4939-6676-9|Title|Scanning Electron Microscopy and X-Ray Microanalysis\r\n📗|978-3-319-74746-0|Title|School Leadership and Educational Change in Singapore\r\n"] 235 | [2.872952, "o", "📗|978-1-4614-6940-7|Title|Search Methodologies\r\n"] 236 | [2.873035, "o", "📗|978-1-4419-6488-5|Title|Sensory Evaluation of Food\r\n"] 237 | [2.873126, "o", "📗|978-0-387-22592-0|Title|Social Anxiety and Social Phobia in Youth\r\n"] 238 | [2.873222, "o", "📗|978-981-13-3621-8|Title|Social Justice Theory and Practice for Social Work\r\n📗|978-3-030-13020-6|Title|Social Marketing in Action\r\n"] 239 | [2.873293, "o", "📗|978-3-319-21990-5|Title|Social Media Management\r\n"] 240 | [2.873363, "o", "📗|978-3-030-13788-5|Title|Social Psychology in Action\r\n"] 241 | [2.873456, "o", "📗|978-3-319-14941-7|Title|Solar PV and Wind Energy Conversion Systems\r\n"] 242 | [2.8735, "o", "📗|978-3-540-93804-0|Title|Solid-State Physics\r\n"] 243 | [2.873628, "o", "📗|978-3-319-98875-7|Title|Spine Surgery\r\n📗|978-3-030-02405-5|Title|Stability and Control of Linear Systems\r\n"] 244 | [2.873716, "o", "📗|978-94-007-6113-1|Title|Statics and Mechanics of Structures\r\n"] 245 | [2.873825, "o", "📗|978-1-4939-2122-5|Title|Statistical Analysis and Data Display\r\n📗|978-94-007-1211-9|Title|Statistical Analysis of Clinical Data on a Pocket Calculator\r\n📗|978-3-319-44048-4|Title|Statistical Learning from a Regression Perspective\r\n"] 246 | [2.87393, "o", "📗|978-3-319-15018-5|Title|Statistical Mechanics for Engineers\r\n"] 247 | [2.874013, "o", "📗|978-1-4939-6572-4|Title|Statistics and Analysis of Scientific Data\r\n"] 248 | [2.874103, "o", "📗|978-1-4939-2614-5|Title|Statistics and Data Analysis for Financial Engineering\r\n"] 249 | [2.874213, "o", "📗|978-1-4614-9170-5|Title|Statistics in Criminal Justice\r\n📗|978-3-642-30304-3|Title|Stellar Structure and Evolution\r\n"] 250 | [2.874309, "o", "📗|978-3-319-23428-1|Title|Stochastic Processes and Calculus\r\n"] 251 | [2.874415, "o", "📗|978-981-13-0399-9|Title|Strategic Human Resource Management and Employment Relations\r\n"] 252 | [2.874532, "o", "📗|978-3-8349-6331-4|Title|Strategic International Management\r\n"] 253 | [2.874646, "o", "📗|978-3-658-07884-3|Title|Strategic International Management\r\n📗|978-3-658-10183-1|Title|Strategic Retail Management\r\n📗|978-90-481-2516-6|Title|Structural Analysis\r\n📗|978-3-319-94743-3|Title|Structural Dynamics\r\n"] 254 | [2.874739, "o", "📗|978-1-4614-3954-7|Title|Structure Determination by X-ray Crystallography\r\n📗|978-3-642-55309-7|Title|Supply Chain Management and Advanced Planning\r\n"] 255 | [2.874834, "o", "📗|978-1-4419-6646-9|Title|Survival Analysis\r\n📗|978-94-017-7242-6|Title|Sustainability Science\r\n"] 256 | [2.874933, "o", "📗|978-3-319-29791-0|Title|Sustainable Supply Chains\r\n"] 257 | [2.875058, "o", "📗|978-981-10-2045-2|Title|System Dynamics\r\n📗|978-3-319-92429-8|Title|Systems Programming in Unix/Linux\r\n"] 258 | [2.875148, "o", "📗|978-3-319-53919-5|Title|Taxation in European Union\r\n📗|978-3-319-65451-5|Title|Teaching Medicine and Medical Ethics Using Popular Culture\r\n"] 259 | [2.875259, "o", "📗|978-3-319-77425-1|Title|The A-Z of the PhD Trajectory\r\n📗|978-3-319-25970-3|Title|The ASCRS Textbook of Colon and Rectal Surgery\r\n📗|978-981-4560-67-2|Title|The Action Research Planner\r\n"] 260 | [2.875394, "o", "📗|978-1-84800-070-4|Title|The Algorithm Design Manual\r\n📗|978-3-319-55444-0|Title|The Data Science Design Manual\r\n📗|978-0-387-84858-7|Title|The Elements of Statistical Learning\r\n"] 261 | [2.875473, "o", "📗|978-1-4899-7550-8|Title|The Finite Element Method and Applications in Engineering Using ANSYS®\r\n"] 262 | [2.875556, "o", "📗|978-3-319-16874-6|Title|The Finite Volume Method in Computational Fluid Dynamics\r\n"] 263 | [2.875639, "o", "📗|978-94-017-8771-0|Title|The Gastrointestinal System\r\n"] 264 | [2.875729, "o", "📗|978-1-4020-6099-1|Title|The Joy of Science\r\n📗|978-3-319-33405-9|Title|The Nature of Scientific Knowledge\r\n"] 265 | [2.875806, "o", "📗|978-3-319-23880-7|Title|The Physics of Semiconductors\r\n"] 266 | [2.875931, "o", "📗|978-1-4939-0867-7|Title|The Psychology of Social Status\r\n📗|978-3-319-14240-1|Title|The Python Workbook\r\n"] 267 | [2.87602, "o", "📗|978-3-319-51412-3|Title|The Sea Floor\r\n"] 268 | [2.876104, "o", "📗|978-3-662-43715-5|Title|Thermodynamics and Energy Conversion\r\n📗|978-0-387-75959-3|Title|Time Series Analysis\r\n"] 269 | [2.876222, "o", "📗|978-3-319-32862-1|Title|Time Series Econometrics\r\n📗|978-0-387-76501-3|Title|Transmission Electron Microscopy\r\n"] 270 | [2.876333, "o", "📗|978-1-4757-2519-3|Title|Transmission Electron Microscopy\r\n"] 271 | [2.876449, "o", "📗|978-3-319-49849-2|Title|Travel Marketing, Tourism Economics and the Airline Product\r\n"] 272 | [2.876552, "o", "📗|978-3-319-12742-2|Title|UML @ Classroom\r\n"] 273 | [2.876638, "o", "📗|978-1-4939-2712-8|Title|Understanding Analysis\r\n"] 274 | [2.876747, "o", "📗|978-3-642-04101-3|Title|Understanding Cryptography\r\n"] 275 | [2.876838, "o", "📗|978-1-4614-6227-9|Title|Understanding Statistics Using R\r\n"] 276 | [2.876921, "o", "📗|978-3-319-74965-5|Title|Witnessing Torture\r\n"] 277 | [2.877029, "o", "📗|978-3-319-31650-5|Title|Writing for Publication\r\n"] 278 | [2.9318, "o", "$ "] 279 | [4.688864, "o", "e"] 280 | [4.761725, "o", "x"] 281 | [4.943073, "o", "i"] 282 | [4.951018, "o", "t"] 283 | [5.14592, "o", "\r\n"] 284 | [5.146163, "o", "exit\r\n"] 285 | -------------------------------------------------------------------------------- /demo/animations/list-catalog-long.cast: -------------------------------------------------------------------------------- 1 | {"version": 2, "width": 103, "height": 66, "timestamp": 1587519839, "idle_time_limit": 0.5, "env": {"SHELL": "/bin/bash", "TERM": "xterm-256color"}} 2 | [0.010452, "o", "\u001b[?1034h$ "] 3 | [0.330455, "o", "s"] 4 | [0.470243, "o", "p"] 5 | [0.608813, "o", "r"] 6 | [0.787408, "o", "i"] 7 | [0.971357, "o", "n"] 8 | [1.066947, "o", "g"] 9 | [1.219184, "o", "e"] 10 | [1.385961, "o", "r"] 11 | [1.576948, "o", " "] 12 | [1.682957, "o", "l"] 13 | [1.71113, "o", "i"] 14 | [1.793562, "o", "s"] 15 | [1.799309, "o", "t"] 16 | [2.003217, "o", " "] 17 | [2.052328, "o", "c"] 18 | [2.245369, "o", "a"] 19 | [2.300611, "o", "t"] 20 | [2.33407, "o", "a"] 21 | [2.346806, "o", "l"] 22 | [2.355233, "o", "o"] 23 | [2.504606, "o", "g"] 24 | [2.520253, "o", " "] 25 | [2.552611, "o", "-"] 26 | [2.600561, "o", "l"] 27 | [2.803251, "o", "\r\n"] 28 | [3.414723, "o", "📚|en-all|URL|https://resource-cms.springernature.com/springer-cms/rest/v1/content/17858272/data/v4\r\n"] 29 | [3.415032, "o", "📚|en-all|Default|True\r\n📚|en-all|Cache|/Users/ejo/Library/Application Support/springer/catalog-en-all.csv\r\n"] 30 | [3.435026, "o", "📚|en-all|Packages|21\r\n📚|en-all|Books|407\r\n"] 31 | [3.435156, "o", "📦|11640|Name|Behavioral Science\r\n"] 32 | [3.43692, "o", "📗|978-1-4614-5538-7|Title|A Clinical Guide to the Treatment of the Human Stress Response\r\n"] 33 | [3.437014, "o", "📗|978-0-387-37575-5|Title|Acquired Brain Injury\r\n📗|978-0-387-88963-4|Title|Child Neuropsychology\r\n"] 34 | [3.437139, "o", "📗|978-1-4419-0641-0|Title|Clinical Assessment of Child and Adolescent Personality and Behavior\r\n📗|978-0-387-36601-2|Title|Clinical Neuroanatomy\r\n"] 35 | [3.437267, "o", "📗|978-1-4614-7807-2|Title|Evidence-Based Interventions for Children with Challenging Behavior\r\n📗|978-1-4614-2197-9|Title|MATLAB for Psychologists\r\n📗|978-1-4939-1911-6|Title|Psychoeducational Assessment and Report Writing\r\n"] 36 | [3.437356, "o", "📗|978-0-387-87573-6|Title|Psychology, Religion, and Spirituality\r\n"] 37 | [3.437444, "o", "📗|978-0-387-22592-0|Title|Social Anxiety and Social Phobia in Youth\r\n"] 38 | [3.437541, "o", "📗|978-1-4939-0867-7|Title|The Psychology of Social Status\r\n"] 39 | [3.437678, "o", "📦|41168|Name|Behavioral Science and Psychology\r\n"] 40 | [3.439013, "o", "📗|978-3-319-44794-0|Title|Applied Behavior Analysis\r\n"] 41 | [3.439122, "o", "📗|978-3-319-68834-3|Title|Clinical Methods in Medical Family Therapy\r\n📗|978-3-030-15224-6|Title|Evidence-Based Practice in Clinical Social Work\r\n"] 42 | [3.439257, "o", "📗|978-3-030-18435-3|Title|Foundations of Behavioral Health\r\n📗|978-3-319-28887-1|Title|Handbook of Consumer Finance Research\r\n"] 43 | [3.439344, "o", "📗|978-3-319-56194-3|Title|International Perspectives on Psychotherapy\r\n📗|978-3-319-65094-4|Title|Motivation and Action \r\n"] 44 | [3.43944, "o", "📗|978-3-319-96337-2|Title|Perceptual Organization\r\n"] 45 | [3.439537, "o", "📗|978-3-319-31791-5|Title|Psychology of Perception\r\n"] 46 | [3.439611, "o", "📗|978-3-030-13788-5|Title|Social Psychology in Action\r\n"] 47 | [3.43975, "o", "📦|11642|Name|Biomedical and Life Sciences\r\n"] 48 | [3.441069, "o", "📗|978-1-4939-2623-7|Title|An Introduction to Biomechanics\r\n"] 49 | [3.44117, "o", "📗|978-3-319-68301-0|Title|Applied Bioinformatics\r\n📗|978-3-319-67395-0|Title|Bioinformatics for Evolutionary Biologists\r\n"] 50 | [3.441257, "o", "📗|978-3-319-27104-0|Title|Clinical Data Analysis on a Pocket Calculator\r\n📗|978-0-387-28117-9|Title|Developmental Neurobiology\r\n"] 51 | [3.441335, "o", "📗|978-981-13-0785-0|Title|ENZYMES: Catalysis, Kinetics and Mechanisms\r\n"] 52 | [3.441458, "o", "📗|978-94-007-1171-6|Title|Epidemiological Research: Terms and Concepts\r\n📗|978-3-319-24551-5|Title|Essentials of Cerebellum and Cerebellar Disorders\r\n📗|978-1-4939-9621-6|Title|Food Fraud Prevention\r\n"] 53 | [3.441572, "o", "📗|978-0-387-49312-1|Title|Fundamentals of Biomechanics\r\n📗|978-3-319-44738-4|Title|Fundamentals of Biomechanics\r\n📗|978-0-387-45524-2|Title|Handbook of Biological Confocal Microscopy\r\n"] 54 | [3.441717, "o", "📗|978-3-319-19464-6|Title|Handbook of Cardiac Anatomy, Physiology, and Devices\r\n📗|978-1-4613-0139-4|Title|Human Chromosomes\r\n📗|978-1-4615-1077-2|Title|Integrated Neuroscience\r\n"] 55 | [3.441805, "o", "📗|978-1-4939-3058-6|Title|Integrative Human Biochemistry\r\n📗|978-1-4939-6374-4|Title|Learning Landscape Ecology\r\n"] 56 | [3.441893, "o", "📗|978-3-319-73123-0|Title|Lessons on Synthetic Bioarchitectures\r\n📗|978-3-319-15195-3|Title|Machine Learning in Medicine - a Complete Overview\r\n"] 57 | [3.441987, "o", "📗|978-3-7091-0715-7|Title|Metabolism of Human Diseases\r\n"] 58 | [3.442019, "o", "📗|978-1-4614-6486-0|Title|Pharmaceutical Biotechnology\r\n"] 59 | [3.442185, "o", "📗|978-3-030-00710-2|Title|Pharmaceutical Biotechnology\r\n📗|978-3-319-54064-1|Title|Phylogenomics\r\n📗|978-3-319-77315-5|Title|Plant Anatomy\r\n📗|978-3-662-56233-8|Title|Plant Ecology\r\n"] 60 | [3.442265, "o", "📗|978-0-387-78341-3|Title|Plant Physiological Ecology\r\n📗|978-981-13-2023-1|Title|Plant Physiology, Development and Metabolism\r\n"] 61 | [3.442355, "o", "📗|978-1-4419-9504-9|Title|Principles of Terrestrial Ecosystem Ecology\r\n"] 62 | [3.442444, "o", "📗|978-3-319-20600-4|Title|SPSS for Starters and 2nd Levelers\r\n📗|978-94-007-1211-9|Title|Statistical Analysis of Clinical Data on a Pocket Calculator\r\n"] 63 | [3.442532, "o", "📗|978-94-017-8771-0|Title|The Gastrointestinal System\r\n📗|978-1-4020-6099-1|Title|The Joy of Science\r\n"] 64 | [3.442658, "o", "📦|11643|Name|Business and Economics\r\n"] 65 | [3.444086, "o", "📗|978-3-642-40975-2|Title|Corporate Social Responsibility\r\n"] 66 | [3.444118, "o", "📗|978-0-387-72579-6|Title|Database Marketing\r\n"] 67 | [3.444187, "o", "📗|978-1-4419-5653-8|Title|Design Research in Information Systems\r\n"] 68 | [3.444321, "o", "📗|978-3-642-20059-5|Title|Econometrics\r\n📗|978-3-319-10091-3|Title|Electronic Commerce\r\n📗|978-3-662-46950-7|Title|Game Theory\r\n"] 69 | [3.444392, "o", "📗|978-3-642-37314-5|Title|International Trade Theory and Policy\r\n"] 70 | [3.444463, "o", "📗|978-1-4614-7630-6|Title|Linear Programming\r\n📗|978-3-319-01769-3|Title|Logistics\r\n"] 71 | [3.44457, "o", "📗|978-3-642-37434-0|Title|Microeconomics\r\n📗|978-3-540-27752-1|Title|New Introduction to Multiple Time Series Analysis\r\n📗|978-3-319-14777-2|Title|Physical Asset Management\r\n"] 72 | [3.444672, "o", "📗|978-1-4614-6940-7|Title|Search Methodologies\r\n📗|978-3-8349-6331-4|Title|Strategic International Management\r\n"] 73 | [3.444756, "o", "📗|978-3-658-07884-3|Title|Strategic International Management\r\n📗|978-3-642-55309-7|Title|Supply Chain Management and Advanced Planning\r\n"] 74 | [3.444927, "o", "📦|41169|Name|Business and Management\r\n"] 75 | [3.446254, "o", "📗|978-3-662-56707-4|Title|A Concise Guide to Market Research\r\n"] 76 | [3.446356, "o", "📗|978-3-319-95762-3|Title|Analytical Corporate Finance\r\n📗|978-3-319-58307-5|Title|Business Process Management Cases\r\n"] 77 | [3.446437, "o", "📗|978-3-662-55381-7|Title|Customer Relationship Management\r\n📗|978-3-030-13005-3|Title|Digital Business Models\r\n"] 78 | [3.446558, "o", "📗|978-3-319-58715-8|Title|Electronic Commerce 2018\r\n📗|978-3-662-53785-5|Title|Enterprise Risk Management Models\r\n📗|978-3-319-89292-4|Title|Entertainment Science\r\n"] 79 | [3.446665, "o", "📗|978-3-319-68837-4|Title|Essentials of Business Analytics\r\n📗|978-3-030-01279-3|Title|Excel Data Analysis\r\n📗|978-3-319-94313-8|Title|Global Supply Chain and Operations Management\r\n"] 80 | [3.446743, "o", "📗|978-3-319-96622-9|Title|International Business Management\r\n"] 81 | [3.446827, "o", "📗|978-3-319-50091-1|Title|Introduction to Electronic Commerce and Social Commerce\r\n📗|978-3-319-59978-6|Title|Knowledge Management\r\n"] 82 | [3.446929, "o", "📗|978-3-319-31036-7|Title|Leadership Today\r\n"] 83 | [3.447023, "o", "📗|978-3-319-18842-3|Title|Linear and Nonlinear Programming\r\n📗|978-94-024-1144-7|Title|Managing Sustainable Business\r\n"] 84 | [3.447132, "o", "📗|978-981-10-5218-7|Title|Market Research\r\n📗|978-3-319-23012-2|Title|Multinational Management\r\n"] 85 | [3.447259, "o", "📗|978-3-030-13020-6|Title|Social Marketing in Action\r\n📗|978-3-319-21990-5|Title|Social Media Management\r\n📗|978-981-13-0399-9|Title|Strategic Human Resource Management and Employment Relations\r\n"] 86 | [3.44737, "o", "📗|978-3-658-10183-1|Title|Strategic Retail Management\r\n📗|978-3-319-29791-0|Title|Sustainable Supply Chains\r\n📗|978-3-319-49849-2|Title|Travel Marketing, Tourism Economics and the Airline Product\r\n"] 87 | [3.447507, "o", "📦|11644|Name|Chemistry and Materials Science\r\n"] 88 | [3.448814, "o", "📗|978-3-642-37902-4|Title|Acid-Base Diagrams\r\n"] 89 | [3.448843, "o", "📗|978-0-387-44899-2|Title|Advanced Organic Chemistry\r\n"] 90 | [3.448955, "o", "📗|978-0-387-71481-3|Title|Advanced Organic Chemistry\r\n📗|978-1-4614-4262-2|Title|Applied Chemistry\r\n"] 91 | [3.449111, "o", "📗|978-3-319-46394-0|Title|Brewing Science: A Multidisciplinary Approach\r\n"] 92 | [3.449249, "o", "📗|978-0-387-46271-4|Title|Ceramic Materials\r\n📗|978-1-4614-3523-5|Title|Ceramic Materials\r\n"] 93 | [3.449357, "o", "📗|978-3-642-19864-9|Title|Chemical Thermodynamics\r\n📗|978-1-4614-9126-2|Title|Chemical and Bioprocess Engineering\r\n"] 94 | [3.449454, "o", "📗|978-0-387-74365-3|Title|Composite Materials\r\n"] 95 | [3.449526, "o", "📗|978-1-4614-8933-7|Title|Electrochemical Impedance Spectroscopy and its Applications\r\n📗|978-3-642-30250-3|Title|Electrochemistry\r\n"] 96 | [3.44961, "o", "📗|978-1-4899-7454-9|Title|Engineering Flow and Heat Exchange\r\n"] 97 | [3.449674, "o", "📗|978-1-4614-9138-5|Title|Essentials of Food Science\r\n"] 98 | [3.449755, "o", "📗|978-3-319-49810-2|Title|Exam Survival Guide: Physical Chemistry\r\n"] 99 | [3.449819, "o", "📗|978-3-319-45776-5|Title|Food Analysis\r\n"] 100 | [3.449882, "o", "📗|978-3-319-44127-6|Title|Food Analysis Laboratory Manual\r\n"] 101 | [3.449944, "o", "📗|978-3-540-69934-7|Title|Food Chemistry\r\n"] 102 | [3.450022, "o", "📗|978-3-319-62872-1|Title|Foundations of Analytical Chemistry\r\n"] 103 | [3.450093, "o", "📗|978-94-007-6863-5|Title|Group Theory Applied to Chemistry\r\n"] 104 | [3.450165, "o", "📗|978-3-319-22951-5|Title|Magnetic Interactions in Molecules and Solids\r\n"] 105 | [3.450228, "o", "📗|978-3-319-54398-7|Title|Mass Spectrometry\r\n"] 106 | [3.450306, "o", "📗|978-3-319-09171-6|Title|Nanotechnology: Principles and Practices\r\n"] 107 | [3.450369, "o", "📗|978-3-319-15666-8|Title|Physical Chemistry from a Different Angle\r\n"] 108 | [3.450453, "o", "📗|978-3-662-49279-6|Title|Polymer Chemistry\r\n"] 109 | [3.450513, "o", "📗|978-3-642-28980-4|Title|Polymer Synthesis: Theory and Practice\r\n"] 110 | [3.450572, "o", "📗|978-0-387-46312-4|Title|Principles of Fluorescence Spectroscopy\r\n"] 111 | [3.450645, "o", "📗|978-1-4614-2212-9|Title|Principles of Polymer Chemistry\r\n"] 112 | [3.45072, "o", "📗|978-1-4939-6676-9|Title|Scanning Electron Microscopy and X-Ray Microanalysis\r\n"] 113 | [3.450781, "o", "📗|978-1-4419-6488-5|Title|Sensory Evaluation of Food\r\n"] 114 | [3.450841, "o", "📗|978-3-319-15018-5|Title|Statistical Mechanics for Engineers\r\n"] 115 | [3.4509, "o", "📗|978-1-4614-3954-7|Title|Structure Determination by X-ray Crystallography\r\n"] 116 | [3.450959, "o", "📗|978-0-387-76501-3|Title|Transmission Electron Microscopy\r\n"] 117 | [3.451183, "o", "📦|11645|Name|Computer Science\r\n"] 118 | [3.452926, "o", "📗|978-3-319-75771-1|Title|A Beginner's Guide to Scala, Object Orientation and Functional Programming\r\n📗|978-3-030-20290-3|Title|A Beginners Guide to Python 3 Programming\r\n📗|978-3-030-25943-3|Title|Advanced Guide to Python 3 Programming\r\n📗|978-3-319-63913-0|Title|An Introduction to Machine Learning\r\n📗|978-3-319-91155-7|Title|Analysis for Computer Scientists\r\n📗|978-1-4612-1844-9|Title|Automata and Computability\r\n📗|978-3-540-77974-2|Title|Computational Geometry\r\n"] 119 | [3.452976, "o", "📗|978-1-84882-935-0|Title|Computer Vision\r\n"] 120 | [3.45312, "o", "📗|978-1-4471-5601-7|Title|Concise Guide to Databases\r\n📗|978-3-319-57750-0|Title|Concise Guide to Software Engineering\r\n"] 121 | [3.453208, "o", "📗|978-3-319-21936-3|Title|Cryptography Made Simple\r\n"] 122 | [3.453277, "o", "📗|978-3-319-14142-8|Title|Data Mining\r\n"] 123 | [3.453344, "o", "📗|978-3-319-72347-1|Title|Data Science and Predictive Analytics\r\n"] 124 | [3.453409, "o", "📗|978-3-319-13072-9|Title|Data Structures and Algorithms with Python\r\n"] 125 | [3.453503, "o", "📗|978-1-4471-6684-9|Title|Digital Image Processing\r\n"] 126 | [3.453595, "o", "📗|978-3-319-57883-5|Title|Eye Tracking Methodology\r\n"] 127 | [3.453691, "o", "📗|978-1-4471-5134-0|Title|Foundations for Designing User-Centered Systems\r\n"] 128 | [3.453841, "o", "📗|978-3-319-70790-7|Title|Foundations of Programming Languages\r\n📗|978-3-642-33143-5|Title|Fundamentals of Business Process Management\r\n"] 129 | [3.453931, "o", "📗|978-3-662-56509-4|Title|Fundamentals of Business Process Management\r\n📗|978-3-319-89491-1|Title|Fundamentals of Java Programming\r\n"] 130 | [3.453998, "o", "📗|978-3-319-05290-8|Title|Fundamentals of Multimedia\r\n"] 131 | [3.454061, "o", "📗|978-3-319-72547-5|Title|Guide to Competitive Programming\r\n"] 132 | [3.454123, "o", "📗|978-3-319-55606-2|Title|Guide to Computer Network Security\r\n"] 133 | [3.454204, "o", "📗|978-3-319-44561-8|Title|Guide to Discrete Mathematics\r\n"] 134 | [3.454288, "o", "📗|978-3-319-73132-2|Title|Guide to Scientific Computing in C++\r\n"] 135 | [3.454352, "o", "📗|978-3-319-58487-4|Title|Introduction to Artificial Intelligence\r\n"] 136 | [3.454413, "o", "📗|978-3-319-50017-1|Title|Introduction to Data Science\r\n"] 137 | [3.454475, "o", "📗|978-3-319-73004-2|Title|Introduction to Deep Learning\r\n"] 138 | [3.454536, "o", "📗|978-3-662-44874-8|Title|Introduction to Evolutionary Computing\r\n"] 139 | [3.454596, "o", "📗|978-3-319-98833-7|Title|Introduction to Parallel Computing\r\n"] 140 | [3.454662, "o", "📗|978-3-319-75502-1|Title|Introduction to Programming with Fortran\r\n"] 141 | [3.45474, "o", "📗|978-3-030-00581-8|Title|Introductory Computer Forensics\r\n"] 142 | [3.454811, "o", "📗|978-3-319-99420-8|Title|Java in Two Semesters\r\n"] 143 | [3.454873, "o", "📗|978-3-319-47831-9|Title|LaTeX in 24 Hours\r\n"] 144 | [3.454934, "o", "📗|978-3-319-63588-0|Title|Logical Foundations of Cyber-Physical Systems\r\n"] 145 | [3.454995, "o", "📗|978-1-84800-322-4|Title|Modelling Computing Systems\r\n"] 146 | [3.455076, "o", "📗|978-3-319-94463-0|Title|Neural Networks and Deep Learning\r\n"] 147 | [3.45516, "o", "📗|978-3-319-24280-4|Title|Object-Oriented Analysis, Design and Implementation\r\n"] 148 | [3.455223, "o", "📗|978-1-4471-7307-6|Title|Principles of Data Mining\r\n"] 149 | [3.455285, "o", "📗|978-3-319-64410-3|Title|Probability and Statistics for Computer Science\r\n"] 150 | [3.455346, "o", "📗|978-1-4471-6642-9|Title|Python Programming Fundamentals\r\n"] 151 | [3.455406, "o", "📗|978-3-319-29659-3|Title|Recommender Systems\r\n"] 152 | [3.455466, "o", "📗|978-3-319-92429-8|Title|Systems Programming in Unix/Linux\r\n"] 153 | [3.455528, "o", "📗|978-1-84800-070-4|Title|The Algorithm Design Manual\r\n"] 154 | [3.455608, "o", "📗|978-3-319-55444-0|Title|The Data Science Design Manual\r\n"] 155 | [3.455689, "o", "📗|978-3-319-14240-1|Title|The Python Workbook\r\n"] 156 | [3.455784, "o", "📗|978-3-319-12742-2|Title|UML @ Classroom\r\n📗|978-3-642-04101-3|Title|Understanding Cryptography\r\n"] 157 | [3.455993, "o", "📦|11646|Name|Earth and Environmental Science\r\n"] 158 | [3.457449, "o", "📗|978-3-319-61185-3|Title|An Introduction to Soil Mechanics\r\n"] 159 | [3.457532, "o", "📗|978-3-319-61158-7|Title|ArcGIS for Environmental and Water Issues\r\n📗|978-94-007-5757-8|Title|Climate Change Science: A Modern Synthesis\r\n"] 160 | [3.4576, "o", "📗|978-1-4020-5719-9|Title|Geomorphology of Desert Environments\r\n"] 161 | [3.457708, "o", "📗|978-3-319-05699-9|Title|Irrigation and Drainage Engineering\r\n"] 162 | [3.457813, "o", "📗|978-3-642-34132-8|Title|Petroleum Geoscience\r\n📗|978-3-540-76504-2|Title|Plate Tectonics\r\n"] 163 | [3.457911, "o", "📗|978-3-319-18398-5|Title|Python For ArcGIS\r\n"] 164 | [3.45798, "o", "📗|978-94-017-7242-6|Title|Sustainability Science\r\n"] 165 | [3.458044, "o", "📗|978-3-319-51412-3|Title|The Sea Floor\r\n"] 166 | [3.45818, "o", "📦|41170|Name|Economics and Finance\r\n"] 167 | [3.459795, "o", "📗|978-3-319-50319-6|Title|Economics as Applied Ethics\r\n"] 168 | [3.459881, "o", "📗|978-3-319-57589-6|Title|Principles of Microeconomics\r\n"] 169 | [3.459948, "o", "📗|978-3-319-23428-1|Title|Stochastic Processes and Calculus\r\n"] 170 | [3.46002, "o", "📗|978-981-10-2045-2|Title|System Dynamics\r\n"] 171 | [3.460084, "o", "📗|978-3-319-32862-1|Title|Time Series Econometrics\r\n"] 172 | [3.460231, "o", "📦|41171|Name|Education\r\n"] 173 | [3.461646, "o", "📗|978-981-13-7496-8|Title|A Course in Rasch Measurement Theory\r\n"] 174 | [3.461729, "o", "📗|978-981-13-2475-8|Title|Conferencing and Presentation English for Young Academics\r\n"] 175 | [3.461798, "o", "📗|978-981-13-6643-7|Title|Educational Technology\r\n"] 176 | [3.461865, "o", "📗|978-3-319-33916-0|Title|Grammar for Teachers\r\n"] 177 | [3.461928, "o", "📗|978-981-10-1802-2|Title|Language Across the Curriculum & CLIL in English as an Additional Language (EAL) Contexts\r\n"] 178 | [3.461992, "o", "📗|978-3-030-05900-2|Title|Research Methods for Social Justice and Equity in Education\r\n"] 179 | [3.462061, "o", "📗|978-3-319-74746-0|Title|School Leadership and Educational Change in Singapore\r\n"] 180 | [3.462126, "o", "📗|978-3-319-77425-1|Title|The A-Z of the PhD Trajectory\r\n"] 181 | [3.462187, "o", "📗|978-3-319-31650-5|Title|Writing for Publication\r\n"] 182 | [3.462353, "o", "📦|40367|Name|Energy\r\n"] 183 | [3.463775, "o", "📗|978-981-287-212-8|Title|Air Pollution and Greenhouse Gases\r\n"] 184 | [3.463867, "o", "📗|978-3-319-77809-9|Title|Building Energy Modeling with OpenStudio\r\n"] 185 | [3.463959, "o", "📗|978-1-4614-0400-2|Title|Electrical Machines\r\n"] 186 | [3.464087, "o", "📗|978-3-662-53022-1|Title|Energy Economics\r\n"] 187 | [3.464212, "o", "📗|978-3-319-49875-1|Title|Energy Harvesting and Energy Efficiency\r\n"] 188 | [3.464304, "o", "📗|978-3-319-21239-5|Title|Energy Storage\r\n"] 189 | [3.464471, "o", "📗|978-3-319-66219-0|Title|Energy and the Wealth of Nations\r\n"] 190 | [3.464574, "o", "📗|978-3-319-91890-7|Title|Off-Grid Electrical Systems in Developing Countries\r\n📗|978-3-319-51118-4|Title|Reactive Power Control in AC Power Systems\r\n"] 191 | [3.464688, "o", "📗|978-3-319-14941-7|Title|Solar PV and Wind Energy Conversion Systems\r\n"] 192 | [3.464799, "o", "📦|11647|Name|Engineering\r\n"] 193 | [3.466147, "o", "📗|978-1-4939-2113-3|Title|Additive Manufacturing Technologies\r\n"] 194 | [3.466184, "o", "📗|978-1-4419-1120-9|Title|Additive Manufacturing Technologies\r\n"] 195 | [3.466279, "o", "📗|978-3-642-20951-2|Title|Alternative Energy Sources\r\n📗|978-3-319-74373-8|Title|Astronautics\r\n"] 196 | [3.466381, "o", "📗|978-3-319-39439-8|Title|Electronics for Embedded Systems\r\n📗|978-3-319-07806-9|Title|Engineering Electromagnetics\r\n"] 197 | [3.466473, "o", "📗|978-3-642-30319-7|Title|Engineering Mechanics 1\r\n📗|978-3-662-56272-7|Title|Engineering Mechanics 2\r\n"] 198 | [3.466595, "o", "📗|978-1-4020-6808-9|Title|Fatigue of Structures and Materials\r\n📗|978-0-306-48048-5|Title|Fundamentals of Power Electronics\r\n"] 199 | [3.466692, "o", "📗|978-3-319-01851-5|Title|Fundamentals of Robotic Mechanical Systems\r\n📗|978-3-319-75708-7|Title|Fundamentals of Solid State Engineering\r\n"] 200 | [3.466769, "o", "📗|978-3-319-24331-3|Title|Fundamentals of Structural Engineering\r\n📗|978-3-319-99516-8|Title|Internet of Things From Hype to Reality\r\n"] 201 | [3.46685, "o", "📗|978-3-319-92804-3|Title|Introduction to Digital Systems Design\r\n📗|978-1-4614-3143-5|Title|Introduction to Embedded Systems\r\n"] 202 | [3.46694, "o", "📗|978-3-319-34195-8|Title|Introduction to Logic Circuits & Logic Design with VHDL \r\n📗|978-3-030-12489-2|Title|Introduction to Logic Circuits & Logic Design with VHDL \r\n"] 203 | [3.467036, "o", "📗|978-3-319-53883-9|Title|Introduction to Logic Circuits & Logic Design with Verilog\r\n📗|978-3-030-13605-5|Title|Introduction to Logic Circuits & Logic Design with Verilog\r\n"] 204 | [3.467137, "o", "📗|978-0-387-24158-6|Title|Intuitive Probability and Random Processes using MATLAB®\r\n📗|978-3-319-56475-3|Title|Life Cycle Assessment\r\n"] 205 | [3.467213, "o", "📗|978-1-4939-1151-6|Title|Physics of Semiconductor Devices\r\n📗|978-3-319-21173-2|Title|Practical Electrical Engineering\r\n"] 206 | [3.467298, "o", "📗|978-3-319-55615-4|Title|Principles of Mobile Communication\r\n📗|978-3-030-04516-6|Title|Quick Start Guide to VHDL\r\n"] 207 | [3.467397, "o", "📗|978-3-030-10552-5|Title|Quick Start Guide to Verilog\r\n📗|978-1-84628-642-1|Title|Robotics\r\n"] 208 | [3.467507, "o", "📗|978-3-319-54413-7|Title|Robotics, Vision and Control\r\n📗|978-3-642-20144-8|Title|Robotics, Vision and Control\r\n📗|978-94-007-6113-1|Title|Statics and Mechanics of Structures\r\n"] 209 | [3.467615, "o", "📗|978-90-481-2516-6|Title|Structural Analysis\r\n📗|978-3-319-94743-3|Title|Structural Dynamics\r\n"] 210 | [3.467763, "o", "📗|978-1-4899-7550-8|Title|The Finite Element Method and Applications in Engineering Using ANSYS®\r\n📗|978-3-319-16874-6|Title|The Finite Volume Method in Computational Fluid Dynamics\r\n📗|978-3-662-43715-5|Title|Thermodynamics and Energy Conversion\r\n"] 211 | [3.467886, "o", "📦|11648|Name|Humanities, Social Sciences and Law\r\n"] 212 | [3.469499, "o", "📗|978-0-387-32353-4|Title|Handbook of Disaster Research\r\n"] 213 | [3.469614, "o", "📗|978-1-4614-3987-5|Title|Handbook of Marriage and the Family\r\n📗|978-0-387-77650-7|Title|Handbook of Quantitative Criminology\r\n"] 214 | [3.469725, "o", "📗|978-0-387-36274-8|Title|Handbook of Sociological Theory\r\n📗|978-0-306-48247-2|Title|Handbook of the Life Course\r\n"] 215 | [3.469829, "o", "📗|978-0-387-36218-2|Title|Handbook of the Sociology of Gender\r\n"] 216 | [3.469923, "o", "📗|978-0-387-72071-5|Title|International Handbook of Historical Archaeology\r\n"] 217 | [3.470032, "o", "📗|978-1-4614-4556-2|Title|LGBT-Parent Families\r\n📗|978-1-4614-9170-5|Title|Statistics in Criminal Justice\r\n"] 218 | [3.470111, "o", "📗|978-981-4560-67-2|Title|The Action Research Planner\r\n"] 219 | [3.470402, "o", "📦|42732|Name|Intelligent Technologies and Robotics\r\n"] 220 | [3.4721, "o", "📗|978-3-319-75804-6|Title|Automatic Control with Experiments\r\n"] 221 | [3.472166, "o", "📗|978-981-10-8297-9|Title|Control Engineering\r\n"] 222 | [3.472299, "o", "📗|978-981-10-8321-1|Title|Control Engineering: MATLAB Exercises\r\n"] 223 | [3.472402, "o", "📗|978-981-13-8759-3|Title|Multimedia Big Data Computing for IoT Applications\r\n📗|978-3-319-91722-1|Title|Optimization of Process Flowsheets through Metaheuristic Techniques \r\n"] 224 | [3.472498, "o", "📗|978-3-319-72911-4|Title|Robotics\r\n"] 225 | [3.472634, "o", "📗|978-3-030-02405-5|Title|Stability and Control of Linear Systems\r\n"] 226 | [3.472802, "o", "📦|41177|Name|Law and Criminology\r\n"] 227 | [3.474635, "o", "📗|978-3-319-54349-9|Title|Correctional Counseling and Treatment\r\n"] 228 | [3.47473, "o", "📗|978-3-319-76442-9|Title|Criminal Justice and Mental Health\r\n📗|978-3-319-92333-8|Title|Fraud and Corruption\r\n"] 229 | [3.474806, "o", "📗|978-3-319-14454-2|Title|International Humanitarian Action\r\n"] 230 | [3.474884, "o", "📗|978-3-319-57252-9|Title|Introduction to Law\r\n"] 231 | [3.474981, "o", "📗|978-3-662-54817-2|Title|Legal Dynamics of EU External Relations\r\n"] 232 | [3.475074, "o", "📗|978-3-319-72682-3|Title|Perspectives on Elderly Crime and Victimization\r\n"] 233 | [3.475182, "o", "📗|978-3-030-19182-5|Title|Policing and Minority Communities\r\n"] 234 | [3.475278, "o", "📗|978-3-319-53919-5|Title|Taxation in European Union\r\n"] 235 | [3.475461, "o", "📦|41173|Name|Literature, Cultural and Media Studies\r\n"] 236 | [3.476852, "o", "📗|978-3-030-05609-4|Title|An Anthology of London in Literature, 1558-1914\r\n"] 237 | [3.476948, "o", "📗|978-3-319-66772-0|Title|Empathetic Space on Screen\r\n📗|978-3-319-71288-8|Title|Managing Media and Digital Organizations\r\n"] 238 | [3.477027, "o", "📗|978-3-030-12727-5|Title|Mapping Global Theatre Histories\r\n"] 239 | [3.477124, "o", "📗|978-3-319-72000-5|Title|Media and Digital Management\r\n"] 240 | [3.477209, "o", "📗|978-1-349-95348-6|Title|Of Cigarettes, High Heels, and Other Interesting Things\r\n"] 241 | [3.477311, "o", "📗|978-3-319-96713-4|Title|Research Methods for the Digital Humanities\r\n📗|978-3-319-65451-5|Title|Teaching Medicine and Medical Ethics Using Popular Culture\r\n📗|978-3-319-74965-5|Title|Witnessing Torture\r\n"] 242 | [3.477468, "o", "📦|11649|Name|Mathematics and Statistics\r\n"] 243 | [3.47886, "o", "📗|978-0-387-93837-0|Title|A Beginner's Guide to R\r\n"] 244 | [3.478955, "o", "📗|978-1-84628-168-6|Title|A Modern Introduction to Probability and Statistics\r\n📗|978-3-662-49887-3|Title|A Primer on Scientific Programming with Python\r\n"] 245 | [3.479071, "o", "📗|978-3-030-02604-2|Title|A Pythagorean Introduction to Number Theory\r\n📗|978-3-319-77649-1|Title|Abstract Algebra\r\n"] 246 | [3.479164, "o", "📗|978-1-4613-0041-0|Title|Algebra\r\n📗|978-0-387-21736-9|Title|All of Statistics\r\n"] 247 | [3.479252, "o", "📗|978-1-4614-7138-7|Title|An Introduction to Statistical Learning\r\n"] 248 | [3.479364, "o", "📗|978-3-319-91041-3|Title|Applied Linear Algebra\r\n📗|978-3-662-45171-7|Title|Applied Multivariate Statistical Analysis\r\n"] 249 | [3.479468, "o", "📗|978-3-319-12493-3|Title|Applied Partial Differential Equations\r\n📗|978-1-4614-6849-3|Title|Applied Predictive Modeling\r\n📗|978-3-662-54486-0|Title|Applied Quantitative Finance\r\n"] 250 | [3.479559, "o", "📗|978-1-4614-8687-9|Title|Bayesian Essentials with R\r\n📗|978-1-4419-0925-1|Title|Bayesian and Frequentist Regression Methods\r\n"] 251 | [3.479636, "o", "📗|978-3-319-31089-3|Title|Brownian Motion, Martingales, and Stochastic Calculus \r\n"] 252 | [3.479719, "o", "📗|978-1-4614-7946-8|Title|Calculus With Applications\r\n📗|978-1-4939-1194-3|Title|Classical Fourier Analysis\r\n"] 253 | [3.479837, "o", "📗|978-1-4419-7288-0|Title|Complex Analysis\r\n📗|978-3-319-52250-0|Title|Design and Analysis of Experiments\r\n"] 254 | [3.479931, "o", "📗|978-1-4612-4360-1|Title|Differential Equations and Their Applications\r\n📗|978-0-387-21777-2|Title|Discrete Mathematics\r\n"] 255 | [3.480023, "o", "📗|978-1-4614-6271-2|Title|Elementary Analysis\r\n📗|978-3-319-18539-2|Title|Fundamentals of Clinical Trials\r\n"] 256 | [3.480121, "o", "📗|978-3-319-48936-0|Title|Introduction to Partial Differential Equations\r\n📗|978-3-319-02099-0|Title|Introduction to Partial Differential Equations\r\n"] 257 | [3.480211, "o", "📗|978-1-4419-9982-5|Title|Introduction to Smooth Manifolds\r\n📗|978-3-319-46162-5|Title|Introduction to Statistics and Data Analysis \r\n"] 258 | [3.480311, "o", "📗|978-3-319-29854-2|Title|Introduction to Time Series and Forecasting\r\n📗|978-0-387-79054-1|Title|Introductory Statistics with R\r\n"] 259 | [3.480398, "o", "📗|978-0-387-88698-5|Title|Introductory Time Series with R\r\n📗|978-3-319-24346-7|Title|Linear Algebra\r\n"] 260 | [3.480457, "o", "📗|978-3-319-11080-6|Title|Linear Algebra Done Right\r\n"] 261 | [3.480533, "o", "📗|978-3-319-23042-9|Title|Methods of Mathematical Modelling\r\n"] 262 | [3.480628, "o", "📗|978-3-319-59731-7|Title|Modeling Life\r\n📗|978-1-4471-6419-7|Title|Multivariate Calculus and Geometry\r\n"] 263 | [3.480649, "o", "📗|978-0-387-40065-5|Title|Numerical Optimization\r\n"] 264 | [3.480741, "o", "📗|978-1-4614-3618-8|Title|Ordinary Differential Equations\r\n📗|978-1-4614-4809-9|Title|Partial Differential Equations\r\n"] 265 | [3.480835, "o", "📗|978-1-4612-4374-8|Title|Probability\r\n📗|978-1-4471-5361-0|Title|Probability Theory\r\n"] 266 | [3.480934, "o", "📗|978-1-4471-5201-9|Title|Probability Theory\r\n📗|978-3-662-57265-8|Title|Proofs from THE BOOK\r\n"] 267 | [3.48103, "o", "📗|978-1-4614-7116-5|Title|Quantum Theory for Mathematicians\r\n📗|978-1-4419-9479-0|Title|Reading, Writing, and Proving\r\n"] 268 | [3.481135, "o", "📗|978-1-4939-2766-1|Title|Real Analysis\r\n📗|978-3-319-19425-7|Title|Regression Modeling Strategies\r\n📗|978-1-4612-0979-9|Title|Representation Theory\r\n"] 269 | [3.481224, "o", "📗|978-1-4939-2122-5|Title|Statistical Analysis and Data Display\r\n📗|978-3-319-44048-4|Title|Statistical Learning from a Regression Perspective\r\n"] 270 | [3.481312, "o", "📗|978-1-4939-2614-5|Title|Statistics and Data Analysis for Financial Engineering\r\n📗|978-1-4419-6646-9|Title|Survival Analysis\r\n"] 271 | [3.481404, "o", "📗|978-0-387-84858-7|Title|The Elements of Statistical Learning\r\n📗|978-0-387-75959-3|Title|Time Series Analysis\r\n"] 272 | [3.481484, "o", "📗|978-1-4939-2712-8|Title|Understanding Analysis\r\n📗|978-1-4614-6227-9|Title|Understanding Statistics Using R\r\n"] 273 | [3.481667, "o", "📦|11650|Name|Medicine\r\n"] 274 | [3.482976, "o", "📗|978-1-4471-4474-8|Title|Biomedical Informatics\r\n"] 275 | [3.483072, "o", "📗|978-3-319-48848-6|Title|Breast Cancer\r\n📗|978-3-319-46407-7|Title|Cardiovascular Biomechanics\r\n"] 276 | [3.483156, "o", "📗|978-3-319-43341-7|Title|Evidence-Based Critical Care\r\n📗|978-3-319-29716-3|Title|Evolutionary Thinking in Medicine\r\n"] 277 | [3.483274, "o", "📗|978-0-387-68566-3|Title|Primer on the Rheumatic Diseases\r\n📗|978-3-319-98875-7|Title|Spine Surgery\r\n"] 278 | [3.483431, "o", "📗|978-3-319-25970-3|Title|The ASCRS Textbook of Colon and Rectal Surgery\r\n"] 279 | [3.483529, "o", "📦|11651|Name|Physics and Astronomy\r\n"] 280 | [3.484867, "o", "📗|978-3-319-92207-2|Title|A First Introduction to Quantum Physics\r\n"] 281 | [3.484962, "o", "📗|978-3-319-25675-7|Title|Advanced Quantum Mechanics\r\n📗|978-3-319-27265-8|Title|Basic Concepts in Computational Physics\r\n"] 282 | [3.485066, "o", "📗|978-3-319-50651-7|Title|Basics of Laser Physics\r\n"] 283 | [3.485204, "o", "📗|978-3-319-61088-7|Title|Computational Physics\r\n"] 284 | [3.485287, "o", "📗|978-3-319-00401-3|Title|Computational Physics\r\n"] 285 | [3.485376, "o", "📗|978-3-319-57040-2|Title|Cosmology for the Curious\r\n"] 286 | [3.485478, "o", "📗|978-3-319-03762-2|Title|Data Analysis\r\n"] 287 | [3.485588, "o", "📗|978-4-431-54526-2|Title|Electricity and Magnetism\r\n"] 288 | [3.485717, "o", "📗|978-3-319-19587-2|Title|Elementary Mechanics Using Matlab\r\n📗|978-3-319-19596-4|Title|Elementary Mechanics Using Python\r\n"] 289 | [3.48581, "o", "📗|978-3-642-35963-7|Title|Essential Astrophysics\r\n"] 290 | [3.4859, "o", "📗|978-3-642-54083-7|Title|Extragalactic Astronomy and Cosmology\r\n"] 291 | [3.485987, "o", "📗|978-3-319-09351-2|Title|Fluid Dynamics\r\n"] 292 | [3.486089, "o", "📗|978-3-319-65867-4|Title|Foundations of Quantum Mechanics\r\n📗|978-3-662-53045-0|Title|Fundamental Astronomy\r\n"] 293 | [3.486203, "o", "📗|978-3-540-32899-5|Title|Group Theory\r\n"] 294 | [3.486303, "o", "📗|978-3-319-12682-1|Title|Intermediate Physics for Medicine and Biology\r\n📗|978-981-13-1090-4|Title|Introduction to General Relativity\r\n📗|978-3-319-00894-3|Title|Introduction to Mathematica® for Physicists\r\n"] 295 | [3.486391, "o", "📗|978-3-319-78181-5|Title|Introduction to Particle and Astroparticle Physics\r\n📗|978-3-319-22309-4|Title|Introduction to Plasma Physics and Controlled Fusion\r\n"] 296 | [3.486478, "o", "📗|978-3-319-68598-4|Title|Introductory Quantum Mechanics\r\n📗|978-3-319-78361-1|Title|Linear Algebra and Analytic Geometry for Physical Sciences\r\n"] 297 | [3.486573, "o", "📗|978-3-319-01195-0|Title|Mathematical Physics\r\n"] 298 | [3.486694, "o", "📗|978-3-319-27877-3|Title|Mechanics and Thermodynamics\r\n"] 299 | [3.486817, "o", "📗|978-3-662-46321-5|Title|Particles and Nuclei\r\n"] 300 | [3.486919, "o", "📗|978-3-319-66631-0|Title|Physics from Symmetry\r\n📗|978-3-319-72314-3|Title|Physics of Oscillations and Waves\r\n"] 301 | [3.487042, "o", "📗|978-1-4614-9236-8|Title|Principles of Astrophysics\r\n📗|978-1-4614-6786-1|Title|Principles of Musical Acoustics\r\n📗|978-3-642-23026-4|Title|Principles of Physics\r\n"] 302 | [3.487154, "o", "📗|978-1-4757-0576-8|Title|Principles of Quantum Mechanics\r\n📗|978-3-319-63133-2|Title|Problems in Classical Electromagnetism\r\n"] 303 | [3.487247, "o", "📗|978-3-642-20556-9|Title|Quantum Mechanics\r\n📗|978-1-4612-1272-0|Title|Quantum Mechanics\r\n"] 304 | [3.487355, "o", "📗|978-3-030-00464-4|Title|Quantum Mechanics for Pedestrians 1\r\n📗|978-3-030-00467-5|Title|Quantum Mechanics for Pedestrians 2\r\n📗|978-3-540-93804-0|Title|Solid-State Physics\r\n"] 305 | [3.487452, "o", "📗|978-1-4939-6572-4|Title|Statistics and Analysis of Scientific Data\r\n📗|978-3-642-30304-3|Title|Stellar Structure and Evolution\r\n"] 306 | [3.487525, "o", "📗|978-3-319-23880-7|Title|The Physics of Semiconductors\r\n"] 307 | [3.487628, "o", "📗|978-1-4757-2519-3|Title|Transmission Electron Microscopy\r\n"] 308 | [3.487743, "o", "📦|41175|Name|Religion and Philosophy\r\n"] 309 | [3.489083, "o", "📗|978-3-319-95381-6|Title|Argumentation Theory: A Pragma-Dialectical Perspective\r\n"] 310 | [3.489119, "o", "📗|978-3-319-91575-3|Title|Business Ethics - A Philosophical and Behavioral Approach\r\n"] 311 | [3.489204, "o", "📗|978-3-319-70920-8|Title|Communication and Bioethics at the End of Life\r\n📗|978-3-319-77434-3|Title|Introduction to Formal Philosophy\r\n"] 312 | [3.489274, "o", "📗|978-3-319-97298-5|Title|Mathematical Logic\r\n"] 313 | [3.489369, "o", "📗|978-3-030-03255-5|Title|Philosophical and Mathematical Logic\r\n📗|978-3-319-78729-9|Title|Philosophy of Race\r\n"] 314 | [3.489467, "o", "📗|978-3-319-26551-3|Title|Philosophy of Science for Scientists\r\n📗|978-3-319-20451-2|Title|Readings in Formal Epistemology\r\n"] 315 | [3.489563, "o", "📗|978-3-319-33405-9|Title|The Nature of Scientific Knowledge\r\n"] 316 | [3.489693, "o", "📦|41176|Name|Social Sciences\r\n"] 317 | [3.491171, "o", "📗|978-3-319-65682-3|Title|An Introduction to Zooarchaeology\r\n"] 318 | [3.491199, "o", "📗|978-3-030-15671-8|Title|Analyzing Qualitative Data with MAXQDA\r\n"] 319 | [3.49126, "o", "📗|978-3-319-65439-3|Title|Concepts, Methods and Practical Applications in Applied Demography\r\n"] 320 | [3.49138, "o", "📗|978-3-319-64786-9|Title|Disability and Vocational Rehabilitation in Rural Settings\r\n"] 321 | [3.491477, "o", "📗|978-3-030-11117-5|Title|Handbook of Evolutionary Research in Archaeology\r\n"] 322 | [3.491589, "o", "📗|978-3-319-03623-6|Title|Handbook of LGBT Elders\r\n📗|978-3-319-68588-5|Title|Political Social Work\r\n"] 323 | [3.491684, "o", "📗|978-3-319-99118-4|Title|Quantitative Methods for the Social Sciences\r\n📗|978-981-13-3621-8|Title|Social Justice Theory and Practice for Social Work\r\n"] 324 | [3.49178, "o", "🛑|en-all\r\n"] 325 | [3.542572, "o", "$ "] 326 | [5.310303, "o", "e"] 327 | [5.345466, "o", "x"] 328 | [5.500309, "o", "i"] 329 | [5.555156, "o", "t"] 330 | [5.706113, "o", "\r\n"] 331 | [5.706408, "o", "exit\r\n"] 332 | -------------------------------------------------------------------------------- /demo/animations/list-packages-long.cast: -------------------------------------------------------------------------------- 1 | {"version": 2, "width": 103, "height": 66, "timestamp": 1587524884, "idle_time_limit": 0.5, "env": {"SHELL": "/bin/bash", "TERM": "xterm-256color"}} 2 | [0.013978, "o", "\u001b[?1034h$ "] 3 | [0.337694, "o", "s"] 4 | [0.456524, "o", "p"] 5 | [0.461193, "o", "r"] 6 | [0.484003, "o", "i"] 7 | [0.627539, "o", "n"] 8 | [0.78689, "o", "g"] 9 | [0.855583, "o", "e"] 10 | [0.936504, "o", "r"] 11 | [0.976452, "o", " "] 12 | [1.073095, "o", "l"] 13 | [1.195048, "o", "i"] 14 | [1.286924, "o", "s"] 15 | [1.457187, "o", "t"] 16 | [1.579012, "o", " "] 17 | [1.727812, "o", "p"] 18 | [1.789834, "o", "a"] 19 | [1.970453, "o", "c"] 20 | [2.012049, "o", "k"] 21 | [2.014114, "o", "a"] 22 | [2.170514, "o", "g"] 23 | [2.212296, "o", "e"] 24 | [2.272268, "o", "s"] 25 | [2.466379, "o", " "] 26 | [2.512182, "o", "-"] 27 | [2.598447, "o", "l"] 28 | [2.744593, "o", "\r\n"] 29 | [3.843356, "o", "📦|11640|Name|Behavioral Science\r\n📦|11640|Books|11\r\n"] 30 | [3.845011, "o", "📗|978-1-4614-5538-7|Title|A Clinical Guide to the Treatment of the Human Stress Response\r\n"] 31 | [3.845134, "o", "📗|978-0-387-37575-5|Title|Acquired Brain Injury\r\n📗|978-0-387-88963-4|Title|Child Neuropsychology\r\n📗|978-1-4419-0641-0|Title|Clinical Assessment of Child and Adolescent Personality and Behavior\r\n"] 32 | [3.845286, "o", "📗|978-0-387-36601-2|Title|Clinical Neuroanatomy\r\n📗|978-1-4614-7807-2|Title|Evidence-Based Interventions for Children with Challenging Behavior\r\n"] 33 | [3.84539, "o", "📗|978-1-4614-2197-9|Title|MATLAB for Psychologists\r\n📗|978-1-4939-1911-6|Title|Psychoeducational Assessment and Report Writing\r\n📗|978-0-387-87573-6|Title|Psychology, Religion, and Spirituality\r\n"] 34 | [3.845501, "o", "📗|978-0-387-22592-0|Title|Social Anxiety and Social Phobia in Youth\r\n📗|978-1-4939-0867-7|Title|The Psychology of Social Status\r\n🛑|11640|Name|Behavioral Science\r\n"] 35 | [3.84566, "o", "📦|41168|Name|Behavioral Science and Psychology\r\n📦|41168|Books|10\r\n"] 36 | [3.846983, "o", "📗|978-3-319-44794-0|Title|Applied Behavior Analysis\r\n"] 37 | [3.847082, "o", "📗|978-3-319-68834-3|Title|Clinical Methods in Medical Family Therapy\r\n📗|978-3-030-15224-6|Title|Evidence-Based Practice in Clinical Social Work\r\n"] 38 | [3.847158, "o", "📗|978-3-030-18435-3|Title|Foundations of Behavioral Health\r\n📗|978-3-319-28887-1|Title|Handbook of Consumer Finance Research\r\n"] 39 | [3.847241, "o", "📗|978-3-319-56194-3|Title|International Perspectives on Psychotherapy\r\n📗|978-3-319-65094-4|Title|Motivation and Action \r\n"] 40 | [3.847334, "o", "📗|978-3-319-96337-2|Title|Perceptual Organization\r\n"] 41 | [3.84743, "o", "📗|978-3-319-31791-5|Title|Psychology of Perception\r\n📗|978-3-030-13788-5|Title|Social Psychology in Action\r\n🛑|41168|Name|Behavioral Science and Psychology\r\n"] 42 | [3.847542, "o", "📦|11642|Name|Biomedical and Life Sciences\r\n📦|11642|Books|32\r\n"] 43 | [3.848899, "o", "📗|978-1-4939-2623-7|Title|An Introduction to Biomechanics\r\n"] 44 | [3.849007, "o", "📗|978-3-319-68301-0|Title|Applied Bioinformatics\r\n📗|978-3-319-67395-0|Title|Bioinformatics for Evolutionary Biologists\r\n"] 45 | [3.8491, "o", "📗|978-3-319-27104-0|Title|Clinical Data Analysis on a Pocket Calculator\r\n📗|978-0-387-28117-9|Title|Developmental Neurobiology\r\n📗|978-981-13-0785-0|Title|ENZYMES: Catalysis, Kinetics and Mechanisms\r\n"] 46 | [3.849221, "o", "📗|978-94-007-1171-6|Title|Epidemiological Research: Terms and Concepts\r\n📗|978-3-319-24551-5|Title|Essentials of Cerebellum and Cerebellar Disorders\r\n📗|978-1-4939-9621-6|Title|Food Fraud Prevention\r\n"] 47 | [3.849318, "o", "📗|978-0-387-49312-1|Title|Fundamentals of Biomechanics\r\n📗|978-3-319-44738-4|Title|Fundamentals of Biomechanics\r\n"] 48 | [3.849393, "o", "📗|978-0-387-45524-2|Title|Handbook of Biological Confocal Microscopy\r\n📗|978-3-319-19464-6|Title|Handbook of Cardiac Anatomy, Physiology, and Devices\r\n"] 49 | [3.849491, "o", "📗|978-1-4613-0139-4|Title|Human Chromosomes\r\n📗|978-1-4615-1077-2|Title|Integrated Neuroscience\r\n"] 50 | [3.849589, "o", "📗|978-1-4939-3058-6|Title|Integrative Human Biochemistry\r\n📗|978-1-4939-6374-4|Title|Learning Landscape Ecology\r\n"] 51 | [3.849673, "o", "📗|978-3-319-73123-0|Title|Lessons on Synthetic Bioarchitectures\r\n📗|978-3-319-15195-3|Title|Machine Learning in Medicine - a Complete Overview\r\n"] 52 | [3.849767, "o", "📗|978-3-7091-0715-7|Title|Metabolism of Human Diseases\r\n📗|978-1-4614-6486-0|Title|Pharmaceutical Biotechnology\r\n"] 53 | [3.849855, "o", "📗|978-3-030-00710-2|Title|Pharmaceutical Biotechnology\r\n📗|978-3-319-54064-1|Title|Phylogenomics\r\n"] 54 | [3.849951, "o", "📗|978-3-319-77315-5|Title|Plant Anatomy\r\n📗|978-3-662-56233-8|Title|Plant Ecology\r\n"] 55 | [3.850054, "o", "📗|978-0-387-78341-3|Title|Plant Physiological Ecology\r\n📗|978-981-13-2023-1|Title|Plant Physiology, Development and Metabolism\r\n📗|978-1-4419-9504-9|Title|Principles of Terrestrial Ecosystem Ecology\r\n"] 56 | [3.850152, "o", "📗|978-3-319-20600-4|Title|SPSS for Starters and 2nd Levelers\r\n📗|978-94-007-1211-9|Title|Statistical Analysis of Clinical Data on a Pocket Calculator\r\n"] 57 | [3.850245, "o", "📗|978-94-017-8771-0|Title|The Gastrointestinal System\r\n📗|978-1-4020-6099-1|Title|The Joy of Science\r\n🛑|11642|Name|Biomedical and Life Sciences\r\n"] 58 | [3.850344, "o", "📦|11643|Name|Business and Economics\r\n📦|11643|Books|16\r\n"] 59 | [3.851808, "o", "📗|978-3-642-40975-2|Title|Corporate Social Responsibility\r\n"] 60 | [3.851837, "o", "📗|978-0-387-72579-6|Title|Database Marketing\r\n"] 61 | [3.851953, "o", "📗|978-1-4419-5653-8|Title|Design Research in Information Systems\r\n📗|978-3-642-20059-5|Title|Econometrics\r\n"] 62 | [3.852025, "o", "📗|978-3-319-10091-3|Title|Electronic Commerce\r\n"] 63 | [3.852107, "o", "📗|978-3-662-46950-7|Title|Game Theory\r\n📗|978-3-642-37314-5|Title|International Trade Theory and Policy\r\n"] 64 | [3.85221, "o", "📗|978-1-4614-7630-6|Title|Linear Programming\r\n"] 65 | [3.852302, "o", "📗|978-3-319-01769-3|Title|Logistics\r\n"] 66 | [3.852414, "o", "📗|978-3-642-37434-0|Title|Microeconomics\r\n"] 67 | [3.852489, "o", "📗|978-3-540-27752-1|Title|New Introduction to Multiple Time Series Analysis\r\n"] 68 | [3.852568, "o", "📗|978-3-319-14777-2|Title|Physical Asset Management\r\n"] 69 | [3.85266, "o", "📗|978-1-4614-6940-7|Title|Search Methodologies\r\n"] 70 | [3.852769, "o", "📗|978-3-8349-6331-4|Title|Strategic International Management\r\n📗|978-3-658-07884-3|Title|Strategic International Management\r\n"] 71 | [3.852847, "o", "📗|978-3-642-55309-7|Title|Supply Chain Management and Advanced Planning\r\n🛑|11643|Name|Business and Economics\r\n"] 72 | [3.852986, "o", "📦|41169|Name|Business and Management\r\n📦|41169|Books|25\r\n"] 73 | [3.854405, "o", "📗|978-3-662-56707-4|Title|A Concise Guide to Market Research\r\n"] 74 | [3.854508, "o", "📗|978-3-319-95762-3|Title|Analytical Corporate Finance\r\n📗|978-3-319-58307-5|Title|Business Process Management Cases\r\n"] 75 | [3.854584, "o", "📗|978-3-662-55381-7|Title|Customer Relationship Management\r\n"] 76 | [3.854671, "o", "📗|978-3-030-13005-3|Title|Digital Business Models\r\n📗|978-3-319-58715-8|Title|Electronic Commerce 2018\r\n"] 77 | [3.854763, "o", "📗|978-3-662-53785-5|Title|Enterprise Risk Management Models\r\n"] 78 | [3.854849, "o", "📗|978-3-319-89292-4|Title|Entertainment Science\r\n📗|978-3-319-68837-4|Title|Essentials of Business Analytics\r\n"] 79 | [3.854945, "o", "📗|978-3-030-01279-3|Title|Excel Data Analysis\r\n📗|978-3-319-94313-8|Title|Global Supply Chain and Operations Management\r\n"] 80 | [3.855077, "o", "📗|978-3-319-96622-9|Title|International Business Management\r\n"] 81 | [3.855165, "o", "📗|978-3-319-50091-1|Title|Introduction to Electronic Commerce and Social Commerce\r\n📗|978-3-319-59978-6|Title|Knowledge Management\r\n"] 82 | [3.855248, "o", "📗|978-3-319-31036-7|Title|Leadership Today\r\n📗|978-3-319-18842-3|Title|Linear and Nonlinear Programming\r\n"] 83 | [3.855338, "o", "📗|978-94-024-1144-7|Title|Managing Sustainable Business\r\n📗|978-981-10-5218-7|Title|Market Research\r\n"] 84 | [3.855446, "o", "📗|978-3-319-23012-2|Title|Multinational Management\r\n📗|978-3-030-13020-6|Title|Social Marketing in Action\r\n"] 85 | [3.855516, "o", "📗|978-3-319-21990-5|Title|Social Media Management\r\n📗|978-981-13-0399-9|Title|Strategic Human Resource Management and Employment Relations\r\n"] 86 | [3.855627, "o", "📗|978-3-658-10183-1|Title|Strategic Retail Management\r\n📗|978-3-319-29791-0|Title|Sustainable Supply Chains\r\n📗|978-3-319-49849-2|Title|Travel Marketing, Tourism Economics and the Airline Product\r\n🛑|41169|Name|Business and Management\r\n"] 87 | [3.8558, "o", "📦|11644|Name|Chemistry and Materials Science\r\n📦|11644|Books|33\r\n"] 88 | [3.857129, "o", "📗|978-3-642-37902-4|Title|Acid-Base Diagrams\r\n"] 89 | [3.857224, "o", "📗|978-0-387-44899-2|Title|Advanced Organic Chemistry\r\n📗|978-0-387-71481-3|Title|Advanced Organic Chemistry\r\n"] 90 | [3.857317, "o", "📗|978-1-4614-4262-2|Title|Applied Chemistry\r\n📗|978-3-319-46394-0|Title|Brewing Science: A Multidisciplinary Approach\r\n"] 91 | [3.857405, "o", "📗|978-0-387-46271-4|Title|Ceramic Materials\r\n📗|978-1-4614-3523-5|Title|Ceramic Materials\r\n"] 92 | [3.857496, "o", "📗|978-3-642-19864-9|Title|Chemical Thermodynamics\r\n📗|978-1-4614-9126-2|Title|Chemical and Bioprocess Engineering\r\n"] 93 | [3.857598, "o", "📗|978-0-387-74365-3|Title|Composite Materials\r\n📗|978-1-4614-8933-7|Title|Electrochemical Impedance Spectroscopy and its Applications\r\n"] 94 | [3.857679, "o", "📗|978-3-642-30250-3|Title|Electrochemistry\r\n📗|978-1-4899-7454-9|Title|Engineering Flow and Heat Exchange\r\n"] 95 | [3.857772, "o", "📗|978-1-4614-9138-5|Title|Essentials of Food Science\r\n📗|978-3-319-49810-2|Title|Exam Survival Guide: Physical Chemistry\r\n"] 96 | [3.857848, "o", "📗|978-3-319-45776-5|Title|Food Analysis\r\n📗|978-3-319-44127-6|Title|Food Analysis Laboratory Manual\r\n"] 97 | [3.857939, "o", "📗|978-3-540-69934-7|Title|Food Chemistry\r\n📗|978-3-319-62872-1|Title|Foundations of Analytical Chemistry\r\n"] 98 | [3.858021, "o", "📗|978-94-007-6863-5|Title|Group Theory Applied to Chemistry\r\n📗|978-3-319-22951-5|Title|Magnetic Interactions in Molecules and Solids\r\n"] 99 | [3.858102, "o", "📗|978-3-319-54398-7|Title|Mass Spectrometry\r\n📗|978-3-319-09171-6|Title|Nanotechnology: Principles and Practices\r\n"] 100 | [3.858183, "o", "📗|978-3-319-15666-8|Title|Physical Chemistry from a Different Angle\r\n📗|978-3-662-49279-6|Title|Polymer Chemistry\r\n"] 101 | [3.85827, "o", "📗|978-3-642-28980-4|Title|Polymer Synthesis: Theory and Practice\r\n"] 102 | [3.85834, "o", "📗|978-0-387-46312-4|Title|Principles of Fluorescence Spectroscopy\r\n"] 103 | [3.858445, "o", "📗|978-1-4614-2212-9|Title|Principles of Polymer Chemistry\r\n📗|978-1-4939-6676-9|Title|Scanning Electron Microscopy and X-Ray Microanalysis\r\n📗|978-1-4419-6488-5|Title|Sensory Evaluation of Food\r\n"] 104 | [3.858531, "o", "📗|978-3-319-15018-5|Title|Statistical Mechanics for Engineers\r\n📗|978-1-4614-3954-7|Title|Structure Determination by X-ray Crystallography\r\n"] 105 | [3.858635, "o", "📗|978-0-387-76501-3|Title|Transmission Electron Microscopy\r\n🛑|11644|Name|Chemistry and Materials Science\r\n"] 106 | [3.858727, "o", "📦|11645|Name|Computer Science\r\n📦|11645|Books|49\r\n"] 107 | [3.860115, "o", "📗|978-3-319-75771-1|Title|A Beginner's Guide to Scala, Object Orientation and Functional Programming\r\n"] 108 | [3.860144, "o", "📗|978-3-030-20290-3|Title|A Beginners Guide to Python 3 Programming\r\n"] 109 | [3.860259, "o", "📗|978-3-030-25943-3|Title|Advanced Guide to Python 3 Programming\r\n📗|978-3-319-63913-0|Title|An Introduction to Machine Learning\r\n"] 110 | [3.860357, "o", "📗|978-3-319-91155-7|Title|Analysis for Computer Scientists\r\n📗|978-1-4612-1844-9|Title|Automata and Computability\r\n"] 111 | [3.860467, "o", "📗|978-3-540-77974-2|Title|Computational Geometry\r\n📗|978-1-84882-935-0|Title|Computer Vision\r\n📗|978-1-4471-5601-7|Title|Concise Guide to Databases\r\n"] 112 | [3.860558, "o", "📗|978-3-319-57750-0|Title|Concise Guide to Software Engineering\r\n📗|978-3-319-21936-3|Title|Cryptography Made Simple\r\n"] 113 | [3.860658, "o", "📗|978-3-319-14142-8|Title|Data Mining\r\n📗|978-3-319-72347-1|Title|Data Science and Predictive Analytics\r\n"] 114 | [3.860753, "o", "📗|978-3-319-13072-9|Title|Data Structures and Algorithms with Python\r\n"] 115 | [3.86086, "o", "📗|978-1-4471-6684-9|Title|Digital Image Processing\r\n📗|978-3-319-57883-5|Title|Eye Tracking Methodology\r\n"] 116 | [3.860962, "o", "📗|978-1-4471-5134-0|Title|Foundations for Designing User-Centered Systems\r\n📗|978-3-319-70790-7|Title|Foundations of Programming Languages\r\n"] 117 | [3.861088, "o", "📗|978-3-642-33143-5|Title|Fundamentals of Business Process Management\r\n📗|978-3-662-56509-4|Title|Fundamentals of Business Process Management\r\n"] 118 | [3.861213, "o", "📗|978-3-319-89491-1|Title|Fundamentals of Java Programming\r\n📗|978-3-319-05290-8|Title|Fundamentals of Multimedia\r\n"] 119 | [3.861327, "o", "📗|978-3-319-72547-5|Title|Guide to Competitive Programming\r\n📗|978-3-319-55606-2|Title|Guide to Computer Network Security\r\n"] 120 | [3.861416, "o", "📗|978-3-319-44561-8|Title|Guide to Discrete Mathematics\r\n📗|978-3-319-73132-2|Title|Guide to Scientific Computing in C++\r\n"] 121 | [3.861527, "o", "📗|978-3-319-58487-4|Title|Introduction to Artificial Intelligence\r\n📗|978-3-319-50017-1|Title|Introduction to Data Science\r\n"] 122 | [3.861607, "o", "📗|978-3-319-73004-2|Title|Introduction to Deep Learning\r\n📗|978-3-662-44874-8|Title|Introduction to Evolutionary Computing\r\n"] 123 | [3.861703, "o", "📗|978-3-319-98833-7|Title|Introduction to Parallel Computing\r\n📗|978-3-319-75502-1|Title|Introduction to Programming with Fortran\r\n"] 124 | [3.861795, "o", "📗|978-3-030-00581-8|Title|Introductory Computer Forensics\r\n📗|978-3-319-99420-8|Title|Java in Two Semesters\r\n"] 125 | [3.861895, "o", "📗|978-3-319-47831-9|Title|LaTeX in 24 Hours\r\n📗|978-3-319-63588-0|Title|Logical Foundations of Cyber-Physical Systems\r\n📗|978-1-84800-322-4|Title|Modelling Computing Systems\r\n"] 126 | [3.861997, "o", "📗|978-3-319-94463-0|Title|Neural Networks and Deep Learning\r\n📗|978-3-319-24280-4|Title|Object-Oriented Analysis, Design and Implementation\r\n"] 127 | [3.862144, "o", "📗|978-1-4471-7307-6|Title|Principles of Data Mining\r\n"] 128 | [3.86227, "o", "📗|978-3-319-64410-3|Title|Probability and Statistics for Computer Science\r\n"] 129 | [3.862383, "o", "📗|978-1-4471-6642-9|Title|Python Programming Fundamentals\r\n"] 130 | [3.86247, "o", "📗|978-3-319-29659-3|Title|Recommender Systems\r\n"] 131 | [3.86254, "o", "📗|978-3-319-92429-8|Title|Systems Programming in Unix/Linux\r\n"] 132 | [3.862622, "o", "📗|978-1-84800-070-4|Title|The Algorithm Design Manual\r\n"] 133 | [3.862731, "o", "📗|978-3-319-55444-0|Title|The Data Science Design Manual\r\n"] 134 | [3.862778, "o", "📗|978-3-319-14240-1|Title|The Python Workbook\r\n"] 135 | [3.862863, "o", "📗|978-3-319-12742-2|Title|UML @ Classroom\r\n"] 136 | [3.862965, "o", "📗|978-3-642-04101-3|Title|Understanding Cryptography\r\n🛑|11645|Name|Computer Science\r\n"] 137 | [3.863174, "o", "📦|11646|Name|Earth and Environmental Science\r\n📦|11646|Books|10\r\n"] 138 | [3.864553, "o", "📗|978-3-319-61185-3|Title|An Introduction to Soil Mechanics\r\n"] 139 | [3.864582, "o", "📗|978-3-319-61158-7|Title|ArcGIS for Environmental and Water Issues\r\n"] 140 | [3.864643, "o", "📗|978-94-007-5757-8|Title|Climate Change Science: A Modern Synthesis\r\n"] 141 | [3.864771, "o", "📗|978-1-4020-5719-9|Title|Geomorphology of Desert Environments\r\n📗|978-3-319-05699-9|Title|Irrigation and Drainage Engineering\r\n"] 142 | [3.864859, "o", "📗|978-3-642-34132-8|Title|Petroleum Geoscience\r\n"] 143 | [3.86494, "o", "📗|978-3-540-76504-2|Title|Plate Tectonics\r\n"] 144 | [3.865031, "o", "📗|978-3-319-18398-5|Title|Python For ArcGIS\r\n"] 145 | [3.86509, "o", "📗|978-94-017-7242-6|Title|Sustainability Science\r\n"] 146 | [3.865207, "o", "📗|978-3-319-51412-3|Title|The Sea Floor\r\n🛑|11646|Name|Earth and Environmental Science\r\n"] 147 | [3.865341, "o", "📦|41170|Name|Economics and Finance\r\n📦|41170|Books|5\r\n"] 148 | [3.866756, "o", "📗|978-3-319-50319-6|Title|Economics as Applied Ethics\r\n"] 149 | [3.866785, "o", "📗|978-3-319-57589-6|Title|Principles of Microeconomics\r\n"] 150 | [3.866884, "o", "📗|978-3-319-23428-1|Title|Stochastic Processes and Calculus\r\n📗|978-981-10-2045-2|Title|System Dynamics\r\n"] 151 | [3.86695, "o", "📗|978-3-319-32862-1|Title|Time Series Econometrics\r\n"] 152 | [3.867028, "o", "🛑|41170|Name|Economics and Finance\r\n"] 153 | [3.867134, "o", "📦|41171|Name|Education\r\n📦|41171|Books|9\r\n"] 154 | [3.868435, "o", "📗|978-981-13-7496-8|Title|A Course in Rasch Measurement Theory\r\n"] 155 | [3.868466, "o", "📗|978-981-13-2475-8|Title|Conferencing and Presentation English for Young Academics\r\n"] 156 | [3.868557, "o", "📗|978-981-13-6643-7|Title|Educational Technology\r\n📗|978-3-319-33916-0|Title|Grammar for Teachers\r\n"] 157 | [3.86868, "o", "📗|978-981-10-1802-2|Title|Language Across the Curriculum & CLIL in English as an Additional Language (EAL) Contexts\r\n📗|978-3-030-05900-2|Title|Research Methods for Social Justice and Equity in Education\r\n"] 158 | [3.868734, "o", "📗|978-3-319-74746-0|Title|School Leadership and Educational Change in Singapore\r\n"] 159 | [3.868881, "o", "📗|978-3-319-77425-1|Title|The A-Z of the PhD Trajectory\r\n📗|978-3-319-31650-5|Title|Writing for Publication\r\n🛑|41171|Name|Education\r\n"] 160 | [3.869004, "o", "📦|40367|Name|Energy\r\n📦|40367|Books|10\r\n"] 161 | [3.870357, "o", "📗|978-981-287-212-8|Title|Air Pollution and Greenhouse Gases\r\n"] 162 | [3.870389, "o", "📗|978-3-319-77809-9|Title|Building Energy Modeling with OpenStudio\r\n"] 163 | [3.87054, "o", "📗|978-1-4614-0400-2|Title|Electrical Machines\r\n📗|978-3-662-53022-1|Title|Energy Economics\r\n📗|978-3-319-49875-1|Title|Energy Harvesting and Energy Efficiency\r\n"] 164 | [3.870632, "o", "📗|978-3-319-21239-5|Title|Energy Storage\r\n📗|978-3-319-66219-0|Title|Energy and the Wealth of Nations\r\n"] 165 | [3.87073, "o", "📗|978-3-319-91890-7|Title|Off-Grid Electrical Systems in Developing Countries\r\n📗|978-3-319-51118-4|Title|Reactive Power Control in AC Power Systems\r\n"] 166 | [3.870812, "o", "📗|978-3-319-14941-7|Title|Solar PV and Wind Energy Conversion Systems\r\n🛑|40367|Name|Energy\r\n"] 167 | [3.870956, "o", "📦|11647|Name|Engineering\r\n📦|11647|Books|36\r\n"] 168 | [3.872424, "o", "📗|978-1-4939-2113-3|Title|Additive Manufacturing Technologies\r\n"] 169 | [3.872455, "o", "📗|978-1-4419-1120-9|Title|Additive Manufacturing Technologies\r\n"] 170 | [3.872549, "o", "📗|978-3-642-20951-2|Title|Alternative Energy Sources\r\n"] 171 | [3.872655, "o", "📗|978-3-319-74373-8|Title|Astronautics\r\n"] 172 | [3.872743, "o", "📗|978-3-319-39439-8|Title|Electronics for Embedded Systems\r\n📗|978-3-319-07806-9|Title|Engineering Electromagnetics\r\n"] 173 | [3.872837, "o", "📗|978-3-642-30319-7|Title|Engineering Mechanics 1\r\n📗|978-3-662-56272-7|Title|Engineering Mechanics 2\r\n"] 174 | [3.872872, "o", "📗|978-1-4020-6808-9|Title|Fatigue of Structures and Materials\r\n"] 175 | [3.873001, "o", "📗|978-0-306-48048-5|Title|Fundamentals of Power Electronics\r\n📗|978-3-319-01851-5|Title|Fundamentals of Robotic Mechanical Systems\r\n"] 176 | [3.873136, "o", "📗|978-3-319-75708-7|Title|Fundamentals of Solid State Engineering\r\n📗|978-3-319-24331-3|Title|Fundamentals of Structural Engineering\r\n📗|978-3-319-99516-8|Title|Internet of Things From Hype to Reality\r\n"] 177 | [3.873168, "o", "📗|978-3-319-92804-3|Title|Introduction to Digital Systems Design\r\n"] 178 | [3.873302, "o", "📗|978-1-4614-3143-5|Title|Introduction to Embedded Systems\r\n📗|978-3-319-34195-8|Title|Introduction to Logic Circuits & Logic Design with VHDL \r\n📗|978-3-030-12489-2|Title|Introduction to Logic Circuits & Logic Design with VHDL \r\n"] 179 | [3.873387, "o", "📗|978-3-319-53883-9|Title|Introduction to Logic Circuits & Logic Design with Verilog\r\n📗|978-3-030-13605-5|Title|Introduction to Logic Circuits & Logic Design with Verilog\r\n"] 180 | [3.87352, "o", "📗|978-0-387-24158-6|Title|Intuitive Probability and Random Processes using MATLAB®\r\n📗|978-3-319-56475-3|Title|Life Cycle Assessment\r\n"] 181 | [3.87361, "o", "📗|978-1-4939-1151-6|Title|Physics of Semiconductor Devices\r\n📗|978-3-319-21173-2|Title|Practical Electrical Engineering\r\n"] 182 | [3.873695, "o", "📗|978-3-319-55615-4|Title|Principles of Mobile Communication\r\n📗|978-3-030-04516-6|Title|Quick Start Guide to VHDL\r\n"] 183 | [3.873813, "o", "📗|978-3-030-10552-5|Title|Quick Start Guide to Verilog\r\n📗|978-1-84628-642-1|Title|Robotics\r\n"] 184 | [3.873915, "o", "📗|978-3-319-54413-7|Title|Robotics, Vision and Control\r\n📗|978-3-642-20144-8|Title|Robotics, Vision and Control\r\n📗|978-94-007-6113-1|Title|Statics and Mechanics of Structures\r\n"] 185 | [3.874012, "o", "📗|978-90-481-2516-6|Title|Structural Analysis\r\n📗|978-3-319-94743-3|Title|Structural Dynamics\r\n"] 186 | [3.874102, "o", "📗|978-1-4899-7550-8|Title|The Finite Element Method and Applications in Engineering Using ANSYS®\r\n"] 187 | [3.874197, "o", "📗|978-3-319-16874-6|Title|The Finite Volume Method in Computational Fluid Dynamics\r\n📗|978-3-662-43715-5|Title|Thermodynamics and Energy Conversion\r\n🛑|11647|Name|Engineering\r\n"] 188 | [3.874325, "o", "📦|11648|Name|Humanities, Social Sciences and Law\r\n📦|11648|Books|10\r\n"] 189 | [3.875654, "o", "📗|978-0-387-32353-4|Title|Handbook of Disaster Research\r\n"] 190 | [3.875683, "o", "📗|978-1-4614-3987-5|Title|Handbook of Marriage and the Family\r\n"] 191 | [3.875766, "o", "📗|978-0-387-77650-7|Title|Handbook of Quantitative Criminology\r\n📗|978-0-387-36274-8|Title|Handbook of Sociological Theory\r\n"] 192 | [3.87585, "o", "📗|978-0-306-48247-2|Title|Handbook of the Life Course\r\n"] 193 | [3.875944, "o", "📗|978-0-387-36218-2|Title|Handbook of the Sociology of Gender\r\n"] 194 | [3.876021, "o", "📗|978-0-387-72071-5|Title|International Handbook of Historical Archaeology\r\n📗|978-1-4614-4556-2|Title|LGBT-Parent Families\r\n"] 195 | [3.876095, "o", "📗|978-1-4614-9170-5|Title|Statistics in Criminal Justice\r\n📗|978-981-4560-67-2|Title|The Action Research Planner\r\n🛑|11648|Name|Humanities, Social Sciences and Law\r\n"] 196 | [3.876231, "o", "📦|42732|Name|Intelligent Technologies and Robotics\r\n📦|42732|Books|7\r\n"] 197 | [3.877564, "o", "📗|978-3-319-75804-6|Title|Automatic Control with Experiments\r\n"] 198 | [3.877593, "o", "📗|978-981-10-8297-9|Title|Control Engineering\r\n"] 199 | [3.877654, "o", "📗|978-981-10-8321-1|Title|Control Engineering: MATLAB Exercises\r\n"] 200 | [3.87777, "o", "📗|978-981-13-8759-3|Title|Multimedia Big Data Computing for IoT Applications\r\n📗|978-3-319-91722-1|Title|Optimization of Process Flowsheets through Metaheuristic Techniques \r\n"] 201 | [3.877858, "o", "📗|978-3-319-72911-4|Title|Robotics\r\n"] 202 | [3.877936, "o", "📗|978-3-030-02405-5|Title|Stability and Control of Linear Systems\r\n🛑|42732|Name|Intelligent Technologies and Robotics\r\n"] 203 | [3.878085, "o", "📦|41177|Name|Law and Criminology\r\n📦|41177|Books|9\r\n"] 204 | [3.879682, "o", "📗|978-3-319-54349-9|Title|Correctional Counseling and Treatment\r\n"] 205 | [3.879822, "o", "📗|978-3-319-76442-9|Title|Criminal Justice and Mental Health\r\n📗|978-3-319-92333-8|Title|Fraud and Corruption\r\n📗|978-3-319-14454-2|Title|International Humanitarian Action\r\n"] 206 | [3.8799, "o", "📗|978-3-319-57252-9|Title|Introduction to Law\r\n"] 207 | [3.879964, "o", "📗|978-3-662-54817-2|Title|Legal Dynamics of EU External Relations\r\n"] 208 | [3.880053, "o", "📗|978-3-319-72682-3|Title|Perspectives on Elderly Crime and Victimization\r\n"] 209 | [3.880151, "o", "📗|978-3-030-19182-5|Title|Policing and Minority Communities\r\n"] 210 | [3.880242, "o", "📗|978-3-319-53919-5|Title|Taxation in European Union\r\n🛑|41177|Name|Law and Criminology\r\n"] 211 | [3.880452, "o", "📦|41173|Name|Literature, Cultural and Media Studies\r\n📦|41173|Books|9\r\n"] 212 | [3.881954, "o", "📗|978-3-030-05609-4|Title|An Anthology of London in Literature, 1558-1914\r\n"] 213 | [3.882094, "o", "📗|978-3-319-66772-0|Title|Empathetic Space on Screen\r\n📗|978-3-319-71288-8|Title|Managing Media and Digital Organizations\r\n📗|978-3-030-12727-5|Title|Mapping Global Theatre Histories\r\n"] 214 | [3.882174, "o", "📗|978-3-319-72000-5|Title|Media and Digital Management\r\n"] 215 | [3.882238, "o", "📗|978-1-349-95348-6|Title|Of Cigarettes, High Heels, and Other Interesting Things\r\n"] 216 | [3.882331, "o", "📗|978-3-319-96713-4|Title|Research Methods for the Digital Humanities\r\n"] 217 | [3.882417, "o", "📗|978-3-319-65451-5|Title|Teaching Medicine and Medical Ethics Using Popular Culture\r\n"] 218 | [3.882517, "o", "📗|978-3-319-74965-5|Title|Witnessing Torture\r\n🛑|41173|Name|Literature, Cultural and Media Studies\r\n"] 219 | [3.882708, "o", "📦|11649|Name|Mathematics and Statistics\r\n📦|11649|Books|56\r\n"] 220 | [3.884247, "o", "📗|978-0-387-93837-0|Title|A Beginner's Guide to R\r\n"] 221 | [3.884332, "o", "📗|978-1-84628-168-6|Title|A Modern Introduction to Probability and Statistics\r\n📗|978-3-662-49887-3|Title|A Primer on Scientific Programming with Python\r\n"] 222 | [3.884428, "o", "📗|978-3-030-02604-2|Title|A Pythagorean Introduction to Number Theory\r\n"] 223 | [3.884515, "o", "📗|978-3-319-77649-1|Title|Abstract Algebra\r\n"] 224 | [3.884611, "o", "📗|978-1-4613-0041-0|Title|Algebra\r\n"] 225 | [3.88468, "o", "📗|978-0-387-21736-9|Title|All of Statistics\r\n"] 226 | [3.884745, "o", "📗|978-1-4614-7138-7|Title|An Introduction to Statistical Learning\r\n"] 227 | [3.884809, "o", "📗|978-3-319-91041-3|Title|Applied Linear Algebra\r\n"] 228 | [3.884871, "o", "📗|978-3-662-45171-7|Title|Applied Multivariate Statistical Analysis\r\n"] 229 | [3.884933, "o", "📗|978-3-319-12493-3|Title|Applied Partial Differential Equations\r\n"] 230 | [3.884995, "o", "📗|978-1-4614-6849-3|Title|Applied Predictive Modeling\r\n"] 231 | [3.885064, "o", "📗|978-3-662-54486-0|Title|Applied Quantitative Finance\r\n"] 232 | [3.885143, "o", "📗|978-1-4614-8687-9|Title|Bayesian Essentials with R\r\n"] 233 | [3.885207, "o", "📗|978-1-4419-0925-1|Title|Bayesian and Frequentist Regression Methods\r\n"] 234 | [3.88527, "o", "📗|978-3-319-31089-3|Title|Brownian Motion, Martingales, and Stochastic Calculus \r\n"] 235 | [3.885333, "o", "📗|978-1-4614-7946-8|Title|Calculus With Applications\r\n"] 236 | [3.885396, "o", "📗|978-1-4939-1194-3|Title|Classical Fourier Analysis\r\n"] 237 | [3.885457, "o", "📗|978-1-4419-7288-0|Title|Complex Analysis\r\n"] 238 | [3.885519, "o", "📗|978-3-319-52250-0|Title|Design and Analysis of Experiments\r\n"] 239 | [3.885584, "o", "📗|978-1-4612-4360-1|Title|Differential Equations and Their Applications\r\n"] 240 | [3.885648, "o", "📗|978-0-387-21777-2|Title|Discrete Mathematics\r\n"] 241 | [3.885728, "o", "📗|978-1-4614-6271-2|Title|Elementary Analysis\r\n"] 242 | [3.88581, "o", "📗|978-3-319-18539-2|Title|Fundamentals of Clinical Trials\r\n"] 243 | [3.885874, "o", "📗|978-3-319-48936-0|Title|Introduction to Partial Differential Equations\r\n"] 244 | [3.885937, "o", "📗|978-3-319-02099-0|Title|Introduction to Partial Differential Equations\r\n"] 245 | [3.885999, "o", "📗|978-1-4419-9982-5|Title|Introduction to Smooth Manifolds\r\n"] 246 | [3.886062, "o", "📗|978-3-319-46162-5|Title|Introduction to Statistics and Data Analysis \r\n"] 247 | [3.886124, "o", "📗|978-3-319-29854-2|Title|Introduction to Time Series and Forecasting\r\n"] 248 | [3.886188, "o", "📗|978-0-387-79054-1|Title|Introductory Statistics with R\r\n"] 249 | [3.886249, "o", "📗|978-0-387-88698-5|Title|Introductory Time Series with R\r\n"] 250 | [3.886316, "o", "📗|978-3-319-24346-7|Title|Linear Algebra\r\n"] 251 | [3.88638, "o", "📗|978-3-319-11080-6|Title|Linear Algebra Done Right\r\n"] 252 | [3.886447, "o", "📗|978-3-319-23042-9|Title|Methods of Mathematical Modelling\r\n"] 253 | [3.886527, "o", "📗|978-3-319-59731-7|Title|Modeling Life\r\n"] 254 | [3.886591, "o", "📗|978-1-4471-6419-7|Title|Multivariate Calculus and Geometry\r\n"] 255 | [3.886654, "o", "📗|978-0-387-40065-5|Title|Numerical Optimization\r\n"] 256 | [3.886717, "o", "📗|978-1-4614-3618-8|Title|Ordinary Differential Equations\r\n"] 257 | [3.886779, "o", "📗|978-1-4614-4809-9|Title|Partial Differential Equations\r\n"] 258 | [3.886845, "o", "📗|978-1-4612-4374-8|Title|Probability\r\n"] 259 | [3.886924, "o", "📗|978-1-4471-5361-0|Title|Probability Theory\r\n"] 260 | [3.886988, "o", "📗|978-1-4471-5201-9|Title|Probability Theory\r\n"] 261 | [3.88705, "o", "📗|978-3-662-57265-8|Title|Proofs from THE BOOK\r\n"] 262 | [3.887113, "o", "📗|978-1-4614-7116-5|Title|Quantum Theory for Mathematicians\r\n"] 263 | [3.887175, "o", "📗|978-1-4419-9479-0|Title|Reading, Writing, and Proving\r\n"] 264 | [3.887236, "o", "📗|978-1-4939-2766-1|Title|Real Analysis\r\n"] 265 | [3.887298, "o", "📗|978-3-319-19425-7|Title|Regression Modeling Strategies\r\n"] 266 | [3.887364, "o", "📗|978-1-4612-0979-9|Title|Representation Theory\r\n"] 267 | [3.887521, "o", "📗|978-1-4939-2122-5|Title|Statistical Analysis and Data Display\r\n"] 268 | [3.887607, "o", "📗|978-3-319-44048-4|Title|Statistical Learning from a Regression Perspective\r\n"] 269 | [3.887762, "o", "📗|978-1-4939-2614-5|Title|Statistics and Data Analysis for Financial Engineering\r\n"] 270 | [3.887905, "o", "📗|978-1-4419-6646-9|Title|Survival Analysis\r\n"] 271 | [3.888014, "o", "📗|978-0-387-84858-7|Title|The Elements of Statistical Learning\r\n📗|978-0-387-75959-3|Title|Time Series Analysis\r\n"] 272 | [3.888103, "o", "📗|978-1-4939-2712-8|Title|Understanding Analysis\r\n"] 273 | [3.888185, "o", "📗|978-1-4614-6227-9|Title|Understanding Statistics Using R\r\n🛑|11649|Name|Mathematics and Statistics\r\n"] 274 | [3.88838, "o", "📦|11650|Name|Medicine\r\n📦|11650|Books|8\r\n"] 275 | [3.889881, "o", "📗|978-1-4471-4474-8|Title|Biomedical Informatics\r\n"] 276 | [3.88998, "o", "📗|978-3-319-48848-6|Title|Breast Cancer\r\n📗|978-3-319-46407-7|Title|Cardiovascular Biomechanics\r\n"] 277 | [3.890069, "o", "📗|978-3-319-43341-7|Title|Evidence-Based Critical Care\r\n"] 278 | [3.890182, "o", "📗|978-3-319-29716-3|Title|Evolutionary Thinking in Medicine\r\n📗|978-0-387-68566-3|Title|Primer on the Rheumatic Diseases\r\n"] 279 | [3.890274, "o", "📗|978-3-319-98875-7|Title|Spine Surgery\r\n"] 280 | [3.890364, "o", "📗|978-3-319-25970-3|Title|The ASCRS Textbook of Colon and Rectal Surgery\r\n🛑|11650|Name|Medicine\r\n"] 281 | [3.890545, "o", "📦|11651|Name|Physics and Astronomy\r\n📦|11651|Books|43\r\n"] 282 | [3.89195, "o", "📗|978-3-319-92207-2|Title|A First Introduction to Quantum Physics\r\n"] 283 | [3.892048, "o", "📗|978-3-319-25675-7|Title|Advanced Quantum Mechanics\r\n📗|978-3-319-27265-8|Title|Basic Concepts in Computational Physics\r\n"] 284 | [3.892138, "o", "📗|978-3-319-50651-7|Title|Basics of Laser Physics\r\n"] 285 | [3.892251, "o", "📗|978-3-319-61088-7|Title|Computational Physics\r\n📗|978-3-319-00401-3|Title|Computational Physics\r\n"] 286 | [3.892342, "o", "📗|978-3-319-57040-2|Title|Cosmology for the Curious\r\n"] 287 | [3.892431, "o", "📗|978-3-319-03762-2|Title|Data Analysis\r\n"] 288 | [3.892509, "o", "📗|978-4-431-54526-2|Title|Electricity and Magnetism\r\n"] 289 | [3.892591, "o", "📗|978-3-319-19587-2|Title|Elementary Mechanics Using Matlab\r\n"] 290 | [3.89267, "o", "📗|978-3-319-19596-4|Title|Elementary Mechanics Using Python\r\n"] 291 | [3.892748, "o", "📗|978-3-642-35963-7|Title|Essential Astrophysics\r\n"] 292 | [3.892819, "o", "📗|978-3-642-54083-7|Title|Extragalactic Astronomy and Cosmology\r\n"] 293 | [3.892915, "o", "📗|978-3-319-09351-2|Title|Fluid Dynamics\r\n"] 294 | [3.89297, "o", "📗|978-3-319-65867-4|Title|Foundations of Quantum Mechanics\r\n"] 295 | [3.893069, "o", "📗|978-3-662-53045-0|Title|Fundamental Astronomy\r\n"] 296 | [3.893158, "o", "📗|978-3-540-32899-5|Title|Group Theory\r\n"] 297 | [3.893267, "o", "📗|978-3-319-12682-1|Title|Intermediate Physics for Medicine and Biology\r\n"] 298 | [3.893366, "o", "📗|978-981-13-1090-4|Title|Introduction to General Relativity\r\n"] 299 | [3.893446, "o", "📗|978-3-319-00894-3|Title|Introduction to Mathematica® for Physicists\r\n"] 300 | [3.893536, "o", "📗|978-3-319-78181-5|Title|Introduction to Particle and Astroparticle Physics\r\n"] 301 | [3.893624, "o", "📗|978-3-319-22309-4|Title|Introduction to Plasma Physics and Controlled Fusion\r\n📗|978-3-319-68598-4|Title|Introductory Quantum Mechanics\r\n"] 302 | [3.893716, "o", "📗|978-3-319-78361-1|Title|Linear Algebra and Analytic Geometry for Physical Sciences\r\n"] 303 | [3.893799, "o", "📗|978-3-319-01195-0|Title|Mathematical Physics\r\n"] 304 | [3.893891, "o", "📗|978-3-319-27877-3|Title|Mechanics and Thermodynamics\r\n"] 305 | [3.89399, "o", "📗|978-3-662-46321-5|Title|Particles and Nuclei\r\n📗|978-3-319-66631-0|Title|Physics from Symmetry\r\n"] 306 | [3.894096, "o", "📗|978-3-319-72314-3|Title|Physics of Oscillations and Waves\r\n"] 307 | [3.89417, "o", "📗|978-1-4614-9236-8|Title|Principles of Astrophysics\r\n"] 308 | [3.894297, "o", "📗|978-1-4614-6786-1|Title|Principles of Musical Acoustics\r\n📗|978-3-642-23026-4|Title|Principles of Physics\r\n"] 309 | [3.894373, "o", "📗|978-1-4757-0576-8|Title|Principles of Quantum Mechanics\r\n"] 310 | [3.894453, "o", "📗|978-3-319-63133-2|Title|Problems in Classical Electromagnetism\r\n📗|978-3-642-20556-9|Title|Quantum Mechanics\r\n"] 311 | [3.894555, "o", "📗|978-1-4612-1272-0|Title|Quantum Mechanics\r\n📗|978-3-030-00464-4|Title|Quantum Mechanics for Pedestrians 1\r\n"] 312 | [3.894648, "o", "📗|978-3-030-00467-5|Title|Quantum Mechanics for Pedestrians 2\r\n📗|978-3-540-93804-0|Title|Solid-State Physics\r\n"] 313 | [3.894747, "o", "📗|978-1-4939-6572-4|Title|Statistics and Analysis of Scientific Data\r\n📗|978-3-642-30304-3|Title|Stellar Structure and Evolution\r\n"] 314 | [3.894841, "o", "📗|978-3-319-23880-7|Title|The Physics of Semiconductors\r\n📗|978-1-4757-2519-3|Title|Transmission Electron Microscopy\r\n🛑|11651|Name|Physics and Astronomy\r\n"] 315 | [3.894998, "o", "📦|41175|Name|Religion and Philosophy\r\n📦|41175|Books|10\r\n"] 316 | [3.896354, "o", "📗|978-3-319-95381-6|Title|Argumentation Theory: A Pragma-Dialectical Perspective\r\n"] 317 | [3.89647, "o", "📗|978-3-319-91575-3|Title|Business Ethics - A Philosophical and Behavioral Approach\r\n📗|978-3-319-70920-8|Title|Communication and Bioethics at the End of Life\r\n"] 318 | [3.896602, "o", "📗|978-3-319-77434-3|Title|Introduction to Formal Philosophy\r\n📗|978-3-319-97298-5|Title|Mathematical Logic\r\n📗|978-3-030-03255-5|Title|Philosophical and Mathematical Logic\r\n"] 319 | [3.896688, "o", "📗|978-3-319-78729-9|Title|Philosophy of Race\r\n"] 320 | [3.896791, "o", "📗|978-3-319-26551-3|Title|Philosophy of Science for Scientists\r\n"] 321 | [3.896886, "o", "📗|978-3-319-20451-2|Title|Readings in Formal Epistemology\r\n📗|978-3-319-33405-9|Title|The Nature of Scientific Knowledge\r\n🛑|41175|Name|Religion and Philosophy\r\n"] 322 | [3.897059, "o", "📦|41176|Name|Social Sciences\r\n📦|41176|Books|9\r\n"] 323 | [3.898429, "o", "📗|978-3-319-65682-3|Title|An Introduction to Zooarchaeology\r\n"] 324 | [3.898527, "o", "📗|978-3-030-15671-8|Title|Analyzing Qualitative Data with MAXQDA\r\n📗|978-3-319-65439-3|Title|Concepts, Methods and Practical Applications in Applied Demography\r\n"] 325 | [3.898617, "o", "📗|978-3-319-64786-9|Title|Disability and Vocational Rehabilitation in Rural Settings\r\n📗|978-3-030-11117-5|Title|Handbook of Evolutionary Research in Archaeology\r\n"] 326 | [3.898707, "o", "📗|978-3-319-03623-6|Title|Handbook of LGBT Elders\r\n"] 327 | [3.898791, "o", "📗|978-3-319-68588-5|Title|Political Social Work\r\n"] 328 | [3.898893, "o", "📗|978-3-319-99118-4|Title|Quantitative Methods for the Social Sciences\r\n📗|978-981-13-3621-8|Title|Social Justice Theory and Practice for Social Work\r\n🛑|41176|Name|Social Sciences\r\n"] 329 | [3.950446, "o", "$ "] 330 | [5.25374, "o", "e"] 331 | [5.303386, "o", "x"] 332 | [5.455318, "o", "i"] 333 | [5.57679, "o", "t"] 334 | [5.671306, "o", "\r\n"] 335 | [5.67155, "o", "exit\r\n"] 336 | --------------------------------------------------------------------------------