mirror of
https://github.com/Benexl/FastAnime.git
synced 2025-12-12 07:40:41 -08:00
successfully completed search page
This commit is contained in:
174
.gitignore
vendored
174
.gitignore
vendored
@@ -1,7 +1,169 @@
|
||||
# mine
|
||||
*.mp4
|
||||
*.mp3
|
||||
*.ass
|
||||
user_data.json
|
||||
yt_cache.json
|
||||
vids/*
|
||||
# Byte-compiled / optimized / DLL files
|
||||
__pycache__/
|
||||
*.py[cod]
|
||||
*$py.class
|
||||
|
||||
# C extensions
|
||||
*.so
|
||||
|
||||
# Distribution / packaging
|
||||
.Python
|
||||
build/
|
||||
develop-eggs/
|
||||
dist/
|
||||
downloads/
|
||||
eggs/
|
||||
.eggs/
|
||||
lib/
|
||||
lib64/
|
||||
parts/
|
||||
sdist/
|
||||
var/
|
||||
wheels/
|
||||
share/python-wheels/
|
||||
*.egg-info/
|
||||
.installed.cfg
|
||||
*.egg
|
||||
MANIFEST
|
||||
|
||||
# PyInstaller
|
||||
# Usually these files are written by a python script from a template
|
||||
# before PyInstaller builds the exe, so as to inject date/other infos into it.
|
||||
*.manifest
|
||||
# *.spec
|
||||
|
||||
# Installer logs
|
||||
pip-log.txt
|
||||
pip-delete-this-directory.txt
|
||||
|
||||
# Unit test / coverage reports
|
||||
htmlcov/
|
||||
.tox/
|
||||
.nox/
|
||||
.coverage
|
||||
.coverage.*
|
||||
.cache
|
||||
nosetests.xml
|
||||
coverage.xml
|
||||
*.cover
|
||||
*.py,cover
|
||||
.hypothesis/
|
||||
.pytest_cache/
|
||||
cover/
|
||||
|
||||
# Translations
|
||||
*.mo
|
||||
*.pot
|
||||
|
||||
# Django stuff:
|
||||
*.log
|
||||
local_settings.py
|
||||
db.sqlite3
|
||||
db.sqlite3-journal
|
||||
|
||||
# Flask stuff:
|
||||
instance/
|
||||
.webassets-cache
|
||||
|
||||
# Scrapy stuff:
|
||||
.scrapy
|
||||
|
||||
# Sphinx documentation
|
||||
docs/_build/
|
||||
|
||||
# PyBuilder
|
||||
.pybuilder/
|
||||
target/
|
||||
|
||||
# Jupyter Notebook
|
||||
.ipynb_checkpoints
|
||||
|
||||
# IPython
|
||||
profile_default/
|
||||
ipython_config.py
|
||||
|
||||
# pyenv
|
||||
# For a library or package, you might want to ignore these files since the code is
|
||||
# intended to run in multiple environments; otherwise, check them in:
|
||||
# .python-version
|
||||
|
||||
# pipenv
|
||||
# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control.
|
||||
# However, in case of collaboration, if having platform-specific dependencies or dependencies
|
||||
# having no cross-platform support, pipenv may install dependencies that don't work, or not
|
||||
# install all needed dependencies.
|
||||
#Pipfile.lock
|
||||
|
||||
# poetry
|
||||
# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control.
|
||||
# This is especially recommended for binary packages to ensure reproducibility, and is more
|
||||
# commonly ignored for libraries.
|
||||
# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control
|
||||
#poetry.lock
|
||||
|
||||
# pdm
|
||||
# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control.
|
||||
#pdm.lock
|
||||
# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it
|
||||
# in version control.
|
||||
# https://pdm.fming.dev/latest/usage/project/#working-with-version-control
|
||||
.pdm.toml
|
||||
.pdm-python
|
||||
.pdm-build/
|
||||
|
||||
# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm
|
||||
__pypackages__/
|
||||
|
||||
# Celery stuff
|
||||
celerybeat-schedule
|
||||
celerybeat.pid
|
||||
|
||||
# SageMath parsed files
|
||||
*.sage.py
|
||||
|
||||
# Environments
|
||||
.env
|
||||
.venv
|
||||
.idea
|
||||
.vscode
|
||||
build
|
||||
dist
|
||||
__pycache__
|
||||
temp
|
||||
env/
|
||||
venv/
|
||||
ENV/
|
||||
env.bak/
|
||||
venv.bak/
|
||||
|
||||
# Spyder project settings
|
||||
.spyderproject
|
||||
.spyproject
|
||||
|
||||
# Rope project settings
|
||||
.ropeproject
|
||||
|
||||
# mkdocs documentation
|
||||
/site
|
||||
|
||||
# mypy
|
||||
.mypy_cache/
|
||||
.dmypy.json
|
||||
dmypy.json
|
||||
|
||||
# Pyre type checker
|
||||
.pyre/
|
||||
|
||||
# pytype static type analyzer
|
||||
.pytype/
|
||||
|
||||
# Cython debug symbols
|
||||
cython_debug/
|
||||
|
||||
# PyCharm
|
||||
# JetBrains specific template is maintained in a separate JetBrains.gitignore that can
|
||||
# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore
|
||||
# and can be added to the global gitignore or merged into this file. For a more nuclear
|
||||
# option (not recommended) you can uncomment the following to ignore the entire idea folder.
|
||||
#.idea/
|
||||
|
||||
@@ -1 +1 @@
|
||||
3.12
|
||||
3.10
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
from .main_screen import MainScreenController
|
||||
from .home_screen import HomeScreenController
|
||||
from .search_screen import SearchScreenController
|
||||
from .my_list_screen import MyListScreenController
|
||||
from .my_list_screen import MyListScreenController
|
||||
from .anime_screen import AnimeScreenController
|
||||
23
app/Controller/anime_screen.py
Normal file
23
app/Controller/anime_screen.py
Normal file
@@ -0,0 +1,23 @@
|
||||
|
||||
from inspect import isgenerator
|
||||
from View import AnimeScreenView
|
||||
from Model import AnimeScreenModel
|
||||
from View.components import MediaCardsContainer
|
||||
from Utility import show_notification
|
||||
from kivy.clock import Clock
|
||||
class AnimeScreenController:
|
||||
def __init__(self, model:AnimeScreenModel):
|
||||
self.model = model
|
||||
self.view = AnimeScreenView(controller=self, model=self.model)
|
||||
# self.update_anime_view()
|
||||
|
||||
def get_view(self) -> AnimeScreenView:
|
||||
return self.view
|
||||
|
||||
def update_anime_view(self,id):
|
||||
data = self.model.get_anime_data(id)
|
||||
if data[0]:
|
||||
Clock.schedule_once(lambda _:self.view.update_layout(data[1]["data"]["Page"]["media"][0]))
|
||||
def update_my_list(self,*args):
|
||||
self.model.update_user_anime_list(*args)
|
||||
|
||||
@@ -1,27 +1,28 @@
|
||||
|
||||
from inspect import isgenerator
|
||||
from View.MainScreen.main_screen import MainScreenView
|
||||
from Model.main_screen import MainScreenModel
|
||||
from View.HomeScreen.home_screen import HomeScreenView
|
||||
from Model.home_screen import HomeScreenModel
|
||||
from View.components.media_card.media_card import MediaCardsContainer
|
||||
from Utility import show_notification
|
||||
from kivy.clock import Clock
|
||||
|
||||
class MainScreenController:
|
||||
class HomeScreenController:
|
||||
"""
|
||||
The `MainScreenController` class represents a controller implementation.
|
||||
Coordinates work of the view with the model.
|
||||
The controller implements the strategy pattern. The controller connects to
|
||||
the view to control its actions.
|
||||
"""
|
||||
populate_errors = []
|
||||
|
||||
def __init__(self, model:MainScreenModel):
|
||||
def __init__(self, model:HomeScreenModel):
|
||||
self.model = model # Model.main_screen.MainScreenModel
|
||||
self.view = MainScreenView(controller=self, model=self.model)
|
||||
self.populate_home_screen()
|
||||
def get_view(self) -> MainScreenView:
|
||||
self.view = HomeScreenView(controller=self, model=self.model)
|
||||
Clock.schedule_once(lambda _:self.populate_home_screen())
|
||||
def get_view(self) -> HomeScreenView:
|
||||
return self.view
|
||||
|
||||
def populate_home_screen(self):
|
||||
errors = []
|
||||
def popular_anime(self):
|
||||
most_popular_cards_container = MediaCardsContainer()
|
||||
most_popular_cards_container.list_name = "Most Popular"
|
||||
most_popular_cards_generator = self.model.get_most_popular_anime()
|
||||
@@ -31,8 +32,9 @@ class MainScreenController:
|
||||
most_popular_cards_container.container.add_widget(card)
|
||||
self.view.main_container.add_widget(most_popular_cards_container)
|
||||
else:
|
||||
errors.append("Most Popular Anime")
|
||||
self.populate_errors.append("Most Popular Anime")
|
||||
|
||||
def favourite_anime(self):
|
||||
most_favourite_cards_container = MediaCardsContainer()
|
||||
most_favourite_cards_container.list_name = "Most Favourites"
|
||||
most_favourite_cards_generator = self.model.get_most_favourite_anime()
|
||||
@@ -42,8 +44,9 @@ class MainScreenController:
|
||||
most_favourite_cards_container.container.add_widget(card)
|
||||
self.view.main_container.add_widget(most_favourite_cards_container)
|
||||
else:
|
||||
errors.append("Most favourite Anime")
|
||||
self.populate_errors.append("Most favourite Anime")
|
||||
|
||||
def trending_anime(self):
|
||||
trending_cards_container = MediaCardsContainer()
|
||||
trending_cards_container.list_name = "Trending"
|
||||
trending_cards_generator = self.model.get_trending_anime()
|
||||
@@ -53,8 +56,9 @@ class MainScreenController:
|
||||
trending_cards_container.container.add_widget(card)
|
||||
self.view.main_container.add_widget(trending_cards_container)
|
||||
else:
|
||||
errors.append("trending Anime")
|
||||
self.populate_errors.append("trending Anime")
|
||||
|
||||
def highest_scored_anime(self):
|
||||
most_scored_cards_container = MediaCardsContainer()
|
||||
most_scored_cards_container.list_name = "Most Scored"
|
||||
most_scored_cards_generator = self.model.get_most_scored_anime()
|
||||
@@ -64,8 +68,10 @@ class MainScreenController:
|
||||
most_scored_cards_container.container.add_widget(card)
|
||||
self.view.main_container.add_widget(most_scored_cards_container)
|
||||
else:
|
||||
errors.append("Most scored Anime")
|
||||
self.populate_errors.append("Most scored Anime")
|
||||
|
||||
def recently_updated_anime(self):
|
||||
|
||||
most_recently_updated_cards_container = MediaCardsContainer()
|
||||
most_recently_updated_cards_container.list_name = "Most Recently Updated"
|
||||
most_recently_updated_cards_generator = self.model.get_most_recently_updated_anime()
|
||||
@@ -75,8 +81,9 @@ class MainScreenController:
|
||||
most_recently_updated_cards_container.container.add_widget(card)
|
||||
self.view.main_container.add_widget(most_recently_updated_cards_container)
|
||||
else:
|
||||
errors.append("Most recently updated Anime")
|
||||
self.populate_errors.append("Most recently updated Anime")
|
||||
|
||||
def upcoming_anime(self):
|
||||
upcoming_cards_container = MediaCardsContainer()
|
||||
upcoming_cards_container.list_name = "Upcoming Anime"
|
||||
upcoming_cards_generator = self.model.get_upcoming_anime()
|
||||
@@ -86,10 +93,21 @@ class MainScreenController:
|
||||
upcoming_cards_container.container.add_widget(card)
|
||||
self.view.main_container.add_widget(upcoming_cards_container)
|
||||
else:
|
||||
errors.append("upcoming Anime")
|
||||
self.populate_errors.append("upcoming Anime")
|
||||
|
||||
def populate_home_screen(self):
|
||||
self.populate_errors = []
|
||||
self.trending_anime()
|
||||
self.highest_scored_anime()
|
||||
self.popular_anime()
|
||||
self.favourite_anime()
|
||||
self.recently_updated_anime()
|
||||
self.upcoming_anime()
|
||||
|
||||
if self.populate_errors:
|
||||
show_notification(f"Failed to fetch all home screen data",f"Theres probably a problem with your internet connection or anilist servers are down.\nFailed include:{', '.join(self.populate_errors)}")
|
||||
|
||||
|
||||
if errors:
|
||||
show_notification(f"Failed to get the following {', '.join(errors)}","Theres probably a problem with your internet connection or anilist servers are down")
|
||||
def update_my_list(self,*args):
|
||||
self.model.update_user_anime_list(*args)
|
||||
|
||||
@@ -1,7 +1,9 @@
|
||||
|
||||
from inspect import isgenerator
|
||||
from Utility import show_notification
|
||||
from View import SearchScreenView
|
||||
from Model import SearchScreenModel
|
||||
from kivy.clock import Clock
|
||||
|
||||
class SearchScreenController:
|
||||
|
||||
@@ -10,14 +12,26 @@ class SearchScreenController:
|
||||
self.view = SearchScreenView(controller=self, model=self.model)
|
||||
def get_view(self) -> SearchScreenView:
|
||||
return self.view
|
||||
|
||||
def update_trending_anime(self):
|
||||
trending_cards_generator = self.model.get_trending_anime()
|
||||
if isgenerator(trending_cards_generator):
|
||||
self.view.trending_anime_sidebar.clear_widgets()
|
||||
for card in trending_cards_generator:
|
||||
card.screen = self.view
|
||||
card.pos_hint = {'center_x': 0.5}
|
||||
self.view.update_trending_sidebar(card)
|
||||
else:
|
||||
self.populate_errors.append("trending Anime")
|
||||
|
||||
def requested_search_for_anime(self,anime_title,**kwargs):
|
||||
self.view.is_searching = True
|
||||
data = self.model.search_for_anime(anime_title,**kwargs)
|
||||
if isgenerator(data):
|
||||
for result_card in data:
|
||||
search_Results = self.model.search_for_anime(anime_title,**kwargs)
|
||||
if isgenerator(search_Results):
|
||||
for result_card in search_Results:
|
||||
result_card.screen = self.view
|
||||
self.view.update_layout(result_card)
|
||||
Clock.schedule_once(lambda _:self.view.update_pagination(self.model.pagination_info))
|
||||
Clock.schedule_once(lambda _:self.update_trending_anime())
|
||||
else:
|
||||
print(data)
|
||||
# self.view.add_pagination()
|
||||
show_notification("Failed to search",f"{search_Results.get('Error')}")
|
||||
self.view.is_searching = False
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
from .main_screen import MainScreenModel
|
||||
from .home_screen import HomeScreenModel
|
||||
from .search_screen import SearchScreenModel
|
||||
from .my_list_screen import MyListScreenModel
|
||||
from .my_list_screen import MyListScreenModel
|
||||
from .anime_screen import AnimeScreenModel
|
||||
26
app/Model/anime_screen.py
Normal file
26
app/Model/anime_screen.py
Normal file
@@ -0,0 +1,26 @@
|
||||
import json
|
||||
import os
|
||||
from Model.base_model import BaseScreenModel
|
||||
from Utility import show_notification
|
||||
from libs.anilist import AniList
|
||||
from Utility.media_card_loader import MediaCardLoader
|
||||
from kivy.storage.jsonstore import JsonStore
|
||||
|
||||
user_data= JsonStore("user_data.json")
|
||||
class AnimeScreenModel(BaseScreenModel):
|
||||
data = {}
|
||||
id = 0
|
||||
|
||||
def media_card_generator(self):
|
||||
for anime_item in self.data["data"]["Page"]["media"]:
|
||||
yield MediaCardLoader.media_card(anime_item)
|
||||
self.pagination_info = self.extract_pagination_info()
|
||||
|
||||
def get_anime_data(self,id:int):
|
||||
return AniList.get_anime(id)
|
||||
|
||||
def get_anime_data_(self):
|
||||
with open("anime.json","r") as file:
|
||||
|
||||
return json.load(file)
|
||||
|
||||
@@ -5,7 +5,7 @@ from Utility.media_card_loader import MediaCardLoader
|
||||
from kivy.storage.jsonstore import JsonStore
|
||||
|
||||
user_data= JsonStore("user_data.json")
|
||||
class MainScreenModel(BaseScreenModel):
|
||||
class HomeScreenModel(BaseScreenModel):
|
||||
|
||||
def get_trending_anime(self):
|
||||
success,data = AniList.get_trending()
|
||||
@@ -8,6 +8,17 @@ from kivy.storage.jsonstore import JsonStore
|
||||
user_data= JsonStore("user_data.json")
|
||||
class SearchScreenModel(BaseScreenModel):
|
||||
data = {}
|
||||
|
||||
def get_trending_anime(self):
|
||||
success,data = AniList.get_trending()
|
||||
if success:
|
||||
def _data_generator():
|
||||
for anime_item in data["data"]["Page"]["media"]:
|
||||
yield MediaCardLoader.media_card(anime_item)
|
||||
return _data_generator()
|
||||
else:
|
||||
return data
|
||||
|
||||
def search_for_anime(self,anime_title,**kwargs):
|
||||
success,self.data = AniList.search(query=anime_title,**kwargs)
|
||||
if success:
|
||||
@@ -18,8 +29,8 @@ class SearchScreenModel(BaseScreenModel):
|
||||
def media_card_generator(self):
|
||||
for anime_item in self.data["data"]["Page"]["media"]:
|
||||
yield MediaCardLoader.media_card(anime_item)
|
||||
self.pagination_info = self.extract_pagination_info()
|
||||
self.pagination_info = self.data["data"]["Page"]["pageInfo"]
|
||||
|
||||
def extract_pagination_info(self):
|
||||
pagination_info = None
|
||||
return pagination_info
|
||||
# def extract_pagination_info(self):
|
||||
# pagination_info = None
|
||||
# return pagination_info
|
||||
|
||||
@@ -1,2 +1,3 @@
|
||||
from .media_card_loader import MediaCardLoader
|
||||
from .show_notification import show_notification
|
||||
from .show_notification import show_notification
|
||||
from .data import themes_available
|
||||
1
app/Utility/data.py
Normal file
1
app/Utility/data.py
Normal file
@@ -0,0 +1 @@
|
||||
themes_available = ['Aliceblue', 'Antiquewhite', 'Aqua', 'Aquamarine', 'Azure', 'Beige', 'Bisque', 'Black', 'Blanchedalmond', 'Blue', 'Blueviolet', 'Brown', 'Burlywood', 'Cadetblue', 'Chartreuse', 'Chocolate', 'Coral', 'Cornflowerblue', 'Cornsilk', 'Crimson', 'Cyan', 'Darkblue', 'Darkcyan', 'Darkgoldenrod', 'Darkgray', 'Darkgrey', 'Darkgreen', 'Darkkhaki', 'Darkmagenta', 'Darkolivegreen', 'Darkorange', 'Darkorchid', 'Darkred', 'Darksalmon', 'Darkseagreen', 'Darkslateblue', 'Darkslategray', 'Darkslategrey', 'Darkturquoise', 'Darkviolet', 'Deeppink', 'Deepskyblue', 'Dimgray', 'Dimgrey', 'Dodgerblue', 'Firebrick', 'Floralwhite', 'Forestgreen', 'Fuchsia', 'Gainsboro', 'Ghostwhite', 'Gold', 'Goldenrod', 'Gray', 'Grey', 'Green', 'Greenyellow', 'Honeydew', 'Hotpink', 'Indianred', 'Indigo', 'Ivory', 'Khaki', 'Lavender', 'Lavenderblush', 'Lawngreen', 'Lemonchiffon', 'Lightblue', 'Lightcoral', 'Lightcyan', 'Lightgoldenrodyellow', 'Lightgreen', 'Lightgray', 'Lightgrey', 'Lightpink', 'Lightsalmon', 'Lightseagreen', 'Lightskyblue', 'Lightslategray', 'Lightslategrey', 'Lightsteelblue', 'Lightyellow', 'Lime', 'Limegreen', 'Linen', 'Magenta', 'Maroon', 'Mediumaquamarine', 'Mediumblue', 'Mediumorchid', 'Mediumpurple', 'Mediumseagreen', 'Mediumslateblue', 'Mediumspringgreen', 'Mediumturquoise', 'Mediumvioletred', 'Midnightblue', 'Mintcream', 'Mistyrose', 'Moccasin', 'Navajowhite', 'Navy', 'Oldlace', 'Olive', 'Olivedrab', 'Orange', 'Orangered', 'Orchid', 'Palegoldenrod', 'Palegreen', 'Paleturquoise', 'Palevioletred', 'Papayawhip', 'Peachpuff', 'Peru', 'Pink', 'Plum', 'Powderblue', 'Purple', 'Red', 'Rosybrown', 'Royalblue', 'Saddlebrown', 'Salmon', 'Sandybrown', 'Seagreen', 'Seashell', 'Sienna', 'Silver', 'Skyblue', 'Slateblue', 'Slategray', 'Slategrey', 'Snow', 'Springgreen', 'Steelblue', 'Tan', 'Teal', 'Thistle', 'Tomato', 'Turquoise', 'Violet', 'Wheat', 'White', 'Whitesmoke', 'Yellow', 'Yellowgreen']
|
||||
@@ -9,52 +9,16 @@ from pytube import YouTube
|
||||
from kivy.loader import _ThreadPool
|
||||
from kivy.clock import Clock
|
||||
from kivy.cache import Cache
|
||||
|
||||
from datetime import date
|
||||
|
||||
Cache.register("anime")
|
||||
|
||||
"""
|
||||
gotta learn how this works :)
|
||||
"""
|
||||
# class _Worker(Thread):
|
||||
# def __init__(self, pool, tasks):
|
||||
# Thread.__init__(self)
|
||||
# self.tasks = tasks
|
||||
# self.daemon = True
|
||||
# self.pool = pool
|
||||
# self.start()
|
||||
|
||||
# def run(self):
|
||||
# while self.pool.running:
|
||||
# func, args, kwargs = self.tasks.get()
|
||||
# try:
|
||||
# func(*args, **kwargs)
|
||||
# except Exception as e:
|
||||
# print(e)
|
||||
# self.tasks.task_done()
|
||||
|
||||
# class _ThreadPool(object):
|
||||
# '''Pool of threads consuming tasks from a queue
|
||||
# '''
|
||||
# def __init__(self, num_threads):
|
||||
# super(_ThreadPool, self).__init__()
|
||||
# self.running = True
|
||||
# self.tasks = queue.Queue()
|
||||
# for _ in range(num_threads):
|
||||
# _Worker(self, self.tasks)
|
||||
|
||||
# def add_task(self, func, *args, **kargs):
|
||||
# '''Add a task to the queue
|
||||
# '''
|
||||
# self.tasks.put((func, args, kargs))
|
||||
|
||||
# def stop(self):
|
||||
# self.running = False
|
||||
# self.tasks.join()
|
||||
|
||||
user_data = JsonStore("user_data.json")
|
||||
my_list = user_data.get("my_list")["list"] # returns a list of anime ids
|
||||
yt_stream_links = user_data.get("yt_stream_links")["links"]
|
||||
|
||||
yt_cache = JsonStore("yt_cache.json")
|
||||
today = date.today()
|
||||
yt_stream_links = yt_cache.get("yt_stream_links")[f"{today}"]
|
||||
|
||||
if yt_stream_links:
|
||||
for link in yt_stream_links:
|
||||
@@ -118,7 +82,7 @@ class MediaCardDataLoader(object):
|
||||
# sleep(0.5)
|
||||
data = preview_image,video_stream_url
|
||||
yt_stream_links.append((yt_watch_url,data))
|
||||
user_data.put("yt_stream_links",links=yt_stream_links)
|
||||
yt_cache.put("yt_stream_links",**{f"{today}":yt_stream_links})
|
||||
except:
|
||||
data = preview_image,None
|
||||
return data
|
||||
|
||||
58
app/View/AnimeScreen/anime_screen.kv
Normal file
58
app/View/AnimeScreen/anime_screen.kv
Normal file
@@ -0,0 +1,58 @@
|
||||
<AnimeScreenView>:
|
||||
md_bg_color: self.theme_cls.backgroundColor
|
||||
header:header
|
||||
side_bar:side_bar
|
||||
rankings_bar:rankings_bar
|
||||
anime_description:anime_description
|
||||
anime_characters:anime_characters
|
||||
anime_reviews:anime_reviews
|
||||
MDBoxLayout:
|
||||
orientation: 'vertical'
|
||||
MDBoxLayout:
|
||||
orientation: 'vertical'
|
||||
size_hint_y:None
|
||||
height: self.minimum_height
|
||||
MDBoxLayout:
|
||||
adaptive_height:True
|
||||
MDIconButton:
|
||||
icon: "arrow-left"
|
||||
on_release:
|
||||
root.manager_screens.current = root.manager_screens.previous()
|
||||
MDScrollView:
|
||||
size_hint:1,1
|
||||
MDBoxLayout:
|
||||
id:main_container
|
||||
size_hint_y:None
|
||||
padding:"10dp"
|
||||
spacing:"10dp"
|
||||
height: self.minimum_height
|
||||
orientation:"vertical"
|
||||
AnimeHeader:
|
||||
id:header
|
||||
MDBoxLayout:
|
||||
size_hint_y:None
|
||||
height: self.minimum_height
|
||||
AnimeSideBar:
|
||||
id:side_bar
|
||||
size_hint_y:None
|
||||
height:max(self.parent.height,self.minimum_height)
|
||||
|
||||
MDBoxLayout:
|
||||
spacing:"10dp"
|
||||
orientation:"vertical"
|
||||
size_hint_y:None
|
||||
height: max(self.parent.height,self.minimum_height)
|
||||
RankingsBar:
|
||||
id:rankings_bar
|
||||
Controls:
|
||||
MDBoxLayout:
|
||||
adaptive_height:True
|
||||
padding:"20dp"
|
||||
orientation:"vertical"
|
||||
AnimeDescription:
|
||||
id:anime_description
|
||||
AnimeCharacters:
|
||||
id:anime_characters
|
||||
AnimeReviews:
|
||||
id:anime_reviews
|
||||
MDBoxLayout:
|
||||
267
app/View/AnimeScreen/anime_screen.py
Normal file
267
app/View/AnimeScreen/anime_screen.py
Normal file
@@ -0,0 +1,267 @@
|
||||
from kivy.properties import ObjectProperty,StringProperty,DictProperty,ListProperty
|
||||
from datetime import datetime
|
||||
from View.base_screen import BaseScreenView
|
||||
from kivymd.uix.boxlayout import MDBoxLayout
|
||||
from kivymd.uix.label import MDLabel
|
||||
from kivy.utils import QueryDict,get_hex_from_color
|
||||
from collections import defaultdict
|
||||
|
||||
|
||||
|
||||
|
||||
class RankingsBar(MDBoxLayout):
|
||||
rankings = DictProperty(
|
||||
{
|
||||
"Popularity":0,
|
||||
"Favourites":0,
|
||||
"AverageScore":0,
|
||||
}
|
||||
)
|
||||
|
||||
|
||||
class AnimeDescription(MDBoxLayout):
|
||||
description = StringProperty()
|
||||
|
||||
class AnimeCharacter(MDBoxLayout):
|
||||
voice_actors = ObjectProperty({
|
||||
"name":"",
|
||||
"image":""
|
||||
})
|
||||
character = ObjectProperty({
|
||||
"name":"",
|
||||
"gender":"",
|
||||
"dateOfBirth":"",
|
||||
"image":"",
|
||||
"age":"",
|
||||
"description":""
|
||||
})
|
||||
|
||||
class AnimeCharacters(MDBoxLayout):
|
||||
container = ObjectProperty()
|
||||
characters = ListProperty()
|
||||
def on_characters(self,instance,characters):
|
||||
format_date = lambda date_: f"{date_['day']}/{date_['month']}/{date_['year']}" if date_ else ""
|
||||
self.container.clear_widgets()
|
||||
for character_ in characters: # character (character,actor)
|
||||
character = character_[0]
|
||||
actors = character_[1]
|
||||
|
||||
anime_character = AnimeCharacter()
|
||||
anime_character.character = {
|
||||
"name":character["name"]["full"],
|
||||
"gender":character["gender"],
|
||||
"dateOfBirth":format_date(character["dateOfBirth"]),
|
||||
"image":character["image"]["medium"],
|
||||
"age":character["age"],
|
||||
"description":character["description"]
|
||||
}
|
||||
anime_character.voice_actors = {
|
||||
"name":", ".join([actor["name"]["full"] for actor in actors])
|
||||
}
|
||||
|
||||
# anime_character.voice_actor =
|
||||
self.container.add_widget(anime_character)
|
||||
|
||||
class AnimeReview(MDBoxLayout):
|
||||
review = ObjectProperty({
|
||||
"username":"",
|
||||
"avatar":"",
|
||||
"summary":""
|
||||
})
|
||||
|
||||
class AnimeReviews(MDBoxLayout):
|
||||
reviews = ListProperty()
|
||||
container = ObjectProperty()
|
||||
def on_reviews(self,instance,reviews):
|
||||
self.container.clear_widgets()
|
||||
for review in reviews:
|
||||
review_ = AnimeReview()
|
||||
review_.review = {
|
||||
"username":review["user"]["name"],
|
||||
"avatar":review["user"]["avatar"]["medium"],
|
||||
"summary":review["summary"]
|
||||
}
|
||||
self.container.add_widget(review_)
|
||||
|
||||
class AnimeHeader(MDBoxLayout):
|
||||
titles = StringProperty()
|
||||
banner_image = StringProperty()
|
||||
|
||||
class SideBarLabel(MDLabel):
|
||||
pass
|
||||
class SideBarHeaderLabel(MDLabel):
|
||||
pass
|
||||
|
||||
class AnimeSideBar(MDBoxLayout):
|
||||
image = StringProperty()
|
||||
alternative_titles = DictProperty({
|
||||
"synonyms":"",
|
||||
"english":"",
|
||||
"japanese":"",
|
||||
})
|
||||
information = DictProperty({
|
||||
"episodes":"",
|
||||
"status":"",
|
||||
"aired":"",
|
||||
"nextAiringEpisode":"",
|
||||
"premiered":"",
|
||||
"broadcast":"",
|
||||
"countryOfOrigin":"",
|
||||
"hashtag":"",
|
||||
"studios":"", # { "name": "Sunrise", "isAnimationStudio": true }
|
||||
"source":"",
|
||||
"genres":"",
|
||||
"duration":"",
|
||||
"producers":"",
|
||||
})
|
||||
statistics = ListProperty()
|
||||
statistics_container = ObjectProperty()
|
||||
external_links = ListProperty()
|
||||
external_links_container = ObjectProperty()
|
||||
tags = ListProperty()
|
||||
tags_container = ObjectProperty()
|
||||
|
||||
def on_statistics(self,instance,value):
|
||||
self.statistics_container.clear_widgets()
|
||||
header = SideBarHeaderLabel()
|
||||
header.text = "Rankings"
|
||||
self.statistics_container.add_widget(header)
|
||||
for stat in value:
|
||||
# stat (rank,context)
|
||||
label = SideBarLabel()
|
||||
label.text = "[color={}]{}:[/color] {}".format(
|
||||
get_hex_from_color(label.theme_cls.primaryColor),
|
||||
stat[0].capitalize(),
|
||||
f"{stat[1]}")
|
||||
self.statistics_container.add_widget(label)
|
||||
|
||||
def on_tags(self,instance,value):
|
||||
self.tags_container.clear_widgets()
|
||||
header = SideBarHeaderLabel()
|
||||
header.text = "Tags"
|
||||
self.tags_container.add_widget(header)
|
||||
for tag in value:
|
||||
label = SideBarLabel()
|
||||
label.text = "[color={}]{}:[/color] {}".format(
|
||||
get_hex_from_color(label.theme_cls.primaryColor),
|
||||
tag[0].capitalize(),
|
||||
f"{tag[1]} %")
|
||||
self.tags_container.add_widget(label)
|
||||
|
||||
|
||||
def on_external_links(self,instance,value):
|
||||
self.external_links_container.clear_widgets()
|
||||
header = SideBarHeaderLabel()
|
||||
header.text = "External Links"
|
||||
self.external_links_container.add_widget(header)
|
||||
for site in value:
|
||||
# stat (rank,context)
|
||||
label = SideBarLabel()
|
||||
label.text = "[color={}]{}:[/color] {}".format(
|
||||
get_hex_from_color(label.theme_cls.primaryColor),
|
||||
site[0].capitalize(),
|
||||
site[1])
|
||||
self.external_links_container.add_widget(label)
|
||||
|
||||
class AnimeScreenView(BaseScreenView):
|
||||
header:AnimeHeader = ObjectProperty()
|
||||
side_bar:AnimeSideBar = ObjectProperty()
|
||||
rankings_bar:RankingsBar = ObjectProperty()
|
||||
anime_description:AnimeDescription = ObjectProperty()
|
||||
anime_characters:AnimeCharacters = ObjectProperty()
|
||||
anime_reviews:AnimeReviews = ObjectProperty()
|
||||
|
||||
def model_is_changed(self) -> None:
|
||||
"""
|
||||
Called whenever any change has occurred in the data model.
|
||||
The view in this method tracks these changes and updates the UI
|
||||
according to these changes.
|
||||
"""
|
||||
|
||||
def update_layout(self,data):
|
||||
# uitlity functions
|
||||
format_date = lambda date_: f"{date_['day']}/{date_['month']}/{date_['year']}" if date_ else ""
|
||||
format_list_with_comma = lambda list_: ", ".join(list_) if list_ else ""
|
||||
to_human_date = lambda utc_date: datetime.fromtimestamp(utc_date).strftime("%d/%m/%Y %H:%M:%S")
|
||||
extract_next_airing_episode = lambda airing_episode: f"Episode: {airing_episode['episode']} on {to_human_date(airing_episode['airingAt'])}" if airing_episode else "Completed"
|
||||
|
||||
# variables
|
||||
english_title = data["title"]["english"]
|
||||
jp_title = data["title"]["romaji"]
|
||||
studios = data["studios"]["nodes"]
|
||||
|
||||
# update header
|
||||
self.header.titles = f"{english_title}\n{jp_title}"
|
||||
if banner_image:=data["bannerImage"]:
|
||||
self.header.banner_image = banner_image
|
||||
|
||||
|
||||
# -----side bar-----
|
||||
|
||||
# update image
|
||||
self.side_bar.image = data["coverImage"]["extraLarge"]
|
||||
|
||||
# update alternative titles
|
||||
alternative_titles = {
|
||||
"synonyms":format_list_with_comma(data["synonyms"]), # list
|
||||
"japanese":jp_title,
|
||||
"english":english_title,
|
||||
}
|
||||
self.side_bar.alternative_titles = alternative_titles
|
||||
|
||||
# update information
|
||||
information = {
|
||||
"episodes":data["episodes"],
|
||||
"status":data["status"],
|
||||
"nextAiringEpisode":extract_next_airing_episode(data["nextAiringEpisode"]),
|
||||
"aired":f"{format_date(data['startDate'])} to {format_date(data['endDate'])}",
|
||||
"premiered":f"{data['season']} {data['seasonYear']}",
|
||||
"broadcast":data["format"],
|
||||
"countryOfOrigin":data["countryOfOrigin"],
|
||||
"hashtag":data["hashtag"],
|
||||
"studios": format_list_with_comma([studio["name"] for studio in studios if studio["isAnimationStudio"]]), # { "name": "Sunrise", "isAnimationStudio": true }
|
||||
"producers": format_list_with_comma([studio["name"] for studio in studios if not studio["isAnimationStudio"]]), # { "name": "Sunrise", "isAnimationStudio": true }
|
||||
"source":data["source"],
|
||||
"genres": format_list_with_comma(data["genres"]),
|
||||
"duration":data["duration"],
|
||||
# "rating":data["rating"],
|
||||
}
|
||||
self.side_bar.information = information
|
||||
|
||||
|
||||
# update statistics
|
||||
statistics = [
|
||||
# { "rank": 44, "context": "highest rated all time" }
|
||||
*[(stat["context"],stat["rank"]) for stat in data["rankings"]]
|
||||
]
|
||||
self.side_bar.statistics = statistics
|
||||
|
||||
# update tags
|
||||
self.side_bar.tags = [
|
||||
(tag["name"],tag["rank"])
|
||||
for tag in data["tags"]
|
||||
]
|
||||
|
||||
# update external links
|
||||
|
||||
external_links = [
|
||||
("AniList",data["siteUrl"]),
|
||||
*[(site["site"],site["url"]) for site in data["externalLinks"]]
|
||||
]
|
||||
self.side_bar.external_links = external_links
|
||||
|
||||
|
||||
self.rankings_bar.rankings = {
|
||||
"Popularity":data["popularity"],
|
||||
"Favourites":data["favourites"],
|
||||
"AverageScore":data["averageScore"] if data["averageScore"] else 0,
|
||||
}
|
||||
|
||||
self.anime_description.description = data["description"]
|
||||
|
||||
self.anime_characters.characters = [(character["node"],character["voiceActors"])for character in data["characters"]["edges"]] # list (character,actor)
|
||||
|
||||
self.anime_reviews.reviews = data["reviews"]["nodes"]
|
||||
|
||||
# for r in data["recommendation"]["nodes"]:
|
||||
# r["mediaRecommendation"]
|
||||
82
app/View/AnimeScreen/components/characters.kv
Normal file
82
app/View/AnimeScreen/components/characters.kv
Normal file
@@ -0,0 +1,82 @@
|
||||
#:import get_hex_from_color kivy.utils.get_hex_from_color
|
||||
|
||||
<CharactersHeaderText@MDLabel>
|
||||
adaptive_height:True
|
||||
# halign:"center"
|
||||
max_lines:0
|
||||
shorten:False
|
||||
md_bg_color:self.theme_cls.secondaryContainerColor
|
||||
bold:True
|
||||
markup:True
|
||||
font_style: "Body"
|
||||
role: "large"
|
||||
padding:"10dp"
|
||||
|
||||
<CharactersContainer@MDBoxLayout>:
|
||||
adaptive_height:True
|
||||
md_bg_color:self.theme_cls.surfaceContainerLowColor
|
||||
padding:"10dp"
|
||||
orientation:"vertical"
|
||||
|
||||
<CharacterText@MDLabel>:
|
||||
adaptive_height:True
|
||||
max_lines:0
|
||||
shorten:False
|
||||
markup:True
|
||||
font_style: "Body"
|
||||
role: "small"
|
||||
|
||||
<CharacterHeader@MDBoxLayout>:
|
||||
adaptive_height:True
|
||||
spacing:"10dp"
|
||||
<CharacterAvatar@FitImage>
|
||||
radius:50
|
||||
size_hint:None,None
|
||||
height:"50dp"
|
||||
width:"50dp"
|
||||
|
||||
<CharacterSecondaryContainer@MDBoxLayout>:
|
||||
adaptive_height:True
|
||||
orientation:"vertical"
|
||||
<AnimeCharacter>:
|
||||
spacing:"5dp"
|
||||
adaptive_height:True
|
||||
orientation:"vertical"
|
||||
CharacterHeader:
|
||||
padding:"10dp"
|
||||
CharacterAvatar:
|
||||
source:root.character["image"]
|
||||
CharacterText:
|
||||
text: root.character["name"]
|
||||
pos_hint:{"center_y":.5}
|
||||
|
||||
CharacterSecondaryContainer:
|
||||
spacing:"5dp"
|
||||
MDDivider:
|
||||
CharacterText:
|
||||
text: "Details"
|
||||
MDDivider:
|
||||
CharacterText:
|
||||
text:"[color={}]Gender:[/color] {}".format(get_hex_from_color(self.theme_cls.primaryColor),root.character["gender"])
|
||||
CharacterText:
|
||||
text:"[color={}]Date Of Birth:[/color] {}".format(get_hex_from_color(self.theme_cls.primaryColor),root.character["dateOfBirth"])
|
||||
CharacterText:
|
||||
text:"[color={}]Age:[/color] {}".format(get_hex_from_color(self.theme_cls.primaryColor),root.character["age"])
|
||||
CharacterText:
|
||||
text:"[color={}]Description:[/color] {}".format(get_hex_from_color(self.theme_cls.primaryColor),root.character["description"])
|
||||
max_lines:5
|
||||
CharacterText:
|
||||
text:"[color={}]Voice Actors:[/color] {}".format(get_hex_from_color(self.theme_cls.primaryColor),root.voice_actors["name"])
|
||||
MDDivider:
|
||||
|
||||
|
||||
<AnimeCharacters>:
|
||||
adaptive_height:True
|
||||
container:container
|
||||
orientation:"vertical"
|
||||
CharactersHeaderText:
|
||||
text:"Characters"
|
||||
CharactersContainer:
|
||||
id:container
|
||||
|
||||
|
||||
17
app/View/AnimeScreen/components/controls.kv
Normal file
17
app/View/AnimeScreen/components/controls.kv
Normal file
@@ -0,0 +1,17 @@
|
||||
<Controls@MDBoxLayout>
|
||||
adaptive_height:True
|
||||
padding:"10dp"
|
||||
spacing:"10dp"
|
||||
pos_hint: {'center_x': 0.5}
|
||||
MDButton:
|
||||
on_press: print("presed")
|
||||
MDButtonText:
|
||||
text:"Add to MyList"
|
||||
MDButton:
|
||||
on_press: print("presed")
|
||||
MDButtonText:
|
||||
text:"Watch on Animdl"
|
||||
MDButton:
|
||||
on_press: print("presed")
|
||||
MDButtonText:
|
||||
text:"Watch on AllAnime"
|
||||
34
app/View/AnimeScreen/components/description.kv
Normal file
34
app/View/AnimeScreen/components/description.kv
Normal file
@@ -0,0 +1,34 @@
|
||||
<DescriptionHeader@MDLabel>
|
||||
adaptive_height:True
|
||||
# halign:"center"
|
||||
max_lines:0
|
||||
shorten:False
|
||||
bold:True
|
||||
markup:True
|
||||
font_style: "Body"
|
||||
role: "large"
|
||||
md_bg_color:self.theme_cls.secondaryContainerColor
|
||||
padding:"10dp"
|
||||
|
||||
<DescriptionContainer@MDBoxLayout>:
|
||||
adaptive_height:True
|
||||
md_bg_color:self.theme_cls.surfaceContainerLowColor
|
||||
padding:"10dp"
|
||||
|
||||
<DescriptionText@MDLabel>:
|
||||
adaptive_height:True
|
||||
max_lines:0
|
||||
shorten:False
|
||||
markup:True
|
||||
font_style: "Body"
|
||||
role: "small"
|
||||
<AnimeDescription>:
|
||||
orientation:"vertical"
|
||||
adaptive_height:True
|
||||
DescriptionHeader:
|
||||
text:"Description"
|
||||
DescriptionContainer:
|
||||
DescriptionText:
|
||||
text:root.description
|
||||
|
||||
|
||||
19
app/View/AnimeScreen/components/header.kv
Normal file
19
app/View/AnimeScreen/components/header.kv
Normal file
@@ -0,0 +1,19 @@
|
||||
<AnimeHeader>:
|
||||
adaptive_height:True
|
||||
orientation: 'vertical'
|
||||
# padding:"10dp"
|
||||
MDLabel:
|
||||
text: root.titles
|
||||
adaptive_height:True
|
||||
md_bg_color:self.theme_cls.secondaryContainerColor
|
||||
padding:"5dp"
|
||||
bold:True
|
||||
shorten:False
|
||||
max_lines:2
|
||||
font_style:"Label"
|
||||
role:"large"
|
||||
FitImage:
|
||||
size_hint_y: None
|
||||
height: dp(250)
|
||||
source:root.banner_image
|
||||
|
||||
81
app/View/AnimeScreen/components/rankings_bar.kv
Normal file
81
app/View/AnimeScreen/components/rankings_bar.kv
Normal file
@@ -0,0 +1,81 @@
|
||||
#:set yellow [.9,.9,0,.9]
|
||||
|
||||
<RankingsLabel@MDLabel>:
|
||||
max_lines:0
|
||||
shorten:False
|
||||
# padding:"10dp"
|
||||
markup:True
|
||||
font_style: "Label"
|
||||
role: "medium"
|
||||
<RankingsHeaderLabel@MDLabel>:
|
||||
color:self.theme_cls.primaryColor
|
||||
bold:True
|
||||
# padding:"10dp"
|
||||
max_lines:0
|
||||
shorten:False
|
||||
markup:True
|
||||
font_style: "Label"
|
||||
role: "large"
|
||||
|
||||
|
||||
|
||||
<RankingsDivider@MDDivider>:
|
||||
orientation:"vertical"
|
||||
|
||||
<RankingsBoxLayout@MDBoxLayout>:
|
||||
orientation:"vertical"
|
||||
padding:"20dp"
|
||||
<RankingsBar>:
|
||||
size_hint_y:None
|
||||
height:dp(100)
|
||||
line_color:self.theme_cls.secondaryColor
|
||||
padding:"10dp"
|
||||
RankingsBoxLayout:
|
||||
size_hint_x:.4
|
||||
RankingsHeaderLabel:
|
||||
text:"Average Score"
|
||||
MDBoxLayout:
|
||||
adaptive_width:True
|
||||
MDBoxLayout:
|
||||
adaptive_size:True
|
||||
# spacing:"5dp"
|
||||
pos_hint: {'center_y': .5}
|
||||
MDIcon:
|
||||
icon: "star"
|
||||
color:yellow
|
||||
disabled: not((root.rankings["AverageScore"]/100)*6>=2)
|
||||
MDIcon:
|
||||
color:yellow
|
||||
disabled: not(root.rankings["AverageScore"]/100*6>=3)
|
||||
icon: "star"
|
||||
MDIcon:
|
||||
color:yellow
|
||||
disabled: not(root.rankings["AverageScore"]/100*6>=4)
|
||||
icon: "star"
|
||||
MDIcon:
|
||||
color:yellow
|
||||
disabled: not(root.rankings["AverageScore"]/100*6>=5)
|
||||
icon: "star"
|
||||
MDIcon:
|
||||
color:yellow
|
||||
icon: "star"
|
||||
disabled: not(root.rankings["AverageScore"]/100*6>=6)
|
||||
RankingsLabel:
|
||||
adaptive_width:True
|
||||
text: '{}'.format(root.rankings["AverageScore"]/10)
|
||||
RankingsDivider:
|
||||
RankingsBoxLayout:
|
||||
size_hint_x:.3
|
||||
RankingsHeaderLabel:
|
||||
text:"Popularity"
|
||||
RankingsLabel:
|
||||
text: '{}'.format(root.rankings["Popularity"])
|
||||
RankingsDivider:
|
||||
RankingsBoxLayout:
|
||||
size_hint_x:.3
|
||||
RankingsHeaderLabel:
|
||||
text:"Favourites"
|
||||
RankingsLabel:
|
||||
text: '{}'.format(root.rankings["Favourites"])
|
||||
|
||||
|
||||
60
app/View/AnimeScreen/components/review.kv
Normal file
60
app/View/AnimeScreen/components/review.kv
Normal file
@@ -0,0 +1,60 @@
|
||||
#:import get_hex_from_color kivy.utils.get_hex_from_color
|
||||
|
||||
<ReviewHeaderText@MDLabel>
|
||||
adaptive_height:True
|
||||
# halign:"center"
|
||||
max_lines:0
|
||||
shorten:False
|
||||
md_bg_color:self.theme_cls.secondaryContainerColor
|
||||
bold:True
|
||||
markup:True
|
||||
font_style: "Body"
|
||||
role: "large"
|
||||
padding:"10dp"
|
||||
|
||||
<ReviewContainer@MDBoxLayout>:
|
||||
adaptive_height:True
|
||||
md_bg_color:self.theme_cls.surfaceContainerLowColor
|
||||
padding:"10dp"
|
||||
orientation:"vertical"
|
||||
|
||||
<ReviewText@MDLabel>:
|
||||
adaptive_height:True
|
||||
max_lines:0
|
||||
shorten:False
|
||||
markup:True
|
||||
font_style: "Body"
|
||||
role: "small"
|
||||
|
||||
<ReviewHeader@MDBoxLayout>:
|
||||
adaptive_height:True
|
||||
spacing:"10dp"
|
||||
padding:"10dp"
|
||||
|
||||
<ReviewerAvatar@FitImage>
|
||||
radius:50
|
||||
size_hint:None,None
|
||||
height:"50dp"
|
||||
width:"50dp"
|
||||
|
||||
<AnimeReview>
|
||||
orientation:"vertical"
|
||||
adaptive_height:True
|
||||
ReviewHeader:
|
||||
ReviewerAvatar:
|
||||
source:root.review["avatar"]
|
||||
ReviewText:
|
||||
pos_hint: {'center_y': 0.5}
|
||||
text:root.review["username"]
|
||||
MDDivider:
|
||||
ReviewText:
|
||||
text:root.review["summary"]
|
||||
MDDivider:
|
||||
<AnimeReviews>:
|
||||
container:container
|
||||
adaptive_height:True
|
||||
orientation:"vertical"
|
||||
ReviewHeaderText:
|
||||
text:"reviews"
|
||||
ReviewContainer:
|
||||
id:container
|
||||
107
app/View/AnimeScreen/components/side_bar.kv
Normal file
107
app/View/AnimeScreen/components/side_bar.kv
Normal file
@@ -0,0 +1,107 @@
|
||||
#:import get_hex_from_color kivy.utils.get_hex_from_color
|
||||
|
||||
<FitBoxLayout@MDBoxLayout>:
|
||||
size_hint_y:None
|
||||
height:self.minimum_height
|
||||
padding:"10dp"
|
||||
spacing:"10dp"
|
||||
orientation: 'vertical'
|
||||
pos_hint: {'center_x': 0.5}
|
||||
|
||||
|
||||
<SideBarLabel>:
|
||||
adaptive_height:True
|
||||
max_lines:0
|
||||
shorten:False
|
||||
markup:True
|
||||
font_style: "Label"
|
||||
role: "medium"
|
||||
# pos_hint: {'center_x': 0.5}
|
||||
<SideBarHeaderLabel>:
|
||||
adaptive_height:True
|
||||
halign:"center"
|
||||
max_lines:0
|
||||
shorten:False
|
||||
bold:True
|
||||
markup:True
|
||||
font_style: "Label"
|
||||
role: "large"
|
||||
md_bg_color:self.theme_cls.secondaryContainerColor
|
||||
padding:"10dp"
|
||||
|
||||
|
||||
<AnimeSideBar>:
|
||||
size_hint_x: None
|
||||
width: dp(300)
|
||||
orientation: 'vertical'
|
||||
line_color:self.theme_cls.secondaryColor
|
||||
statistics_container:statistics_container
|
||||
tags_container:tags_container
|
||||
external_links_container:external_links_container
|
||||
FitBoxLayout:
|
||||
FitImage:
|
||||
source:root.image
|
||||
size_hint:None,None
|
||||
height:dp(250)
|
||||
width:dp(200)
|
||||
pos_hint: {'center_x': 0.5}
|
||||
MDButton:
|
||||
on_press:app.watch_on_animdl(root.alternative_titles)
|
||||
pos_hint: {'center_x': 0.5}
|
||||
|
||||
MDButtonText:
|
||||
text:"Watch on Animdl"
|
||||
|
||||
FitBoxLayout:
|
||||
SideBarHeaderLabel:
|
||||
text:"Alternative Titles"
|
||||
SideBarLabel:
|
||||
text: "[color={}]Synonyms:[/color] {}".format(get_hex_from_color(self.theme_cls.primaryColor),root.alternative_titles["synonyms"])
|
||||
SideBarLabel:
|
||||
text: "[color={}]English:[/color] {}".format(get_hex_from_color(self.theme_cls.primaryColor),root.alternative_titles["english"])
|
||||
SideBarLabel:
|
||||
text: "[color={}]Japanese:[/color] {}".format(get_hex_from_color(self.theme_cls.primaryColor),root.alternative_titles["japanese"])
|
||||
|
||||
FitBoxLayout:
|
||||
SideBarHeaderLabel:
|
||||
text:"Information"
|
||||
SideBarLabel:
|
||||
text: "[color={}]Episodes:[/color] {}".format(get_hex_from_color(self.theme_cls.primaryColor),root.information["episodes"])
|
||||
SideBarLabel:
|
||||
text: "[color={}]Status:[/color] {}".format(get_hex_from_color(self.theme_cls.primaryColor),root.information["status"])
|
||||
SideBarLabel:
|
||||
text: "[color={}]Next Airing Episode:[/color] {}".format(get_hex_from_color(self.theme_cls.primaryColor),root.information["nextAiringEpisode"])
|
||||
SideBarLabel:
|
||||
text: "[color={}]Aired:[/color] {}".format(get_hex_from_color(self.theme_cls.primaryColor),root.information["aired"])
|
||||
SideBarLabel:
|
||||
text: "[color={}]Premiered:[/color] {}".format(get_hex_from_color(self.theme_cls.primaryColor),root.information["premiered"])
|
||||
SideBarLabel:
|
||||
text: "[color={}]Broadcast:[/color] {}".format(get_hex_from_color(self.theme_cls.primaryColor),root.information["broadcast"])
|
||||
SideBarLabel:
|
||||
text: "[color={}]Country Of Origin:[/color] {}".format(get_hex_from_color(self.theme_cls.primaryColor),root.information["countryOfOrigin"])
|
||||
SideBarLabel:
|
||||
text: "[color={}]Hashtag:[/color] {}".format(get_hex_from_color(self.theme_cls.primaryColor),root.information["hashtag"])
|
||||
SideBarLabel:
|
||||
text: "[color={}]Studios:[/color] {}".format(get_hex_from_color(self.theme_cls.primaryColor),root.information["studios"])
|
||||
SideBarLabel:
|
||||
text: "[color={}]Producers:[/color] {}".format(get_hex_from_color(self.theme_cls.primaryColor),root.information["producers"])
|
||||
SideBarLabel:
|
||||
text: "[color={}]Source:[/color] {}".format(get_hex_from_color(self.theme_cls.primaryColor),root.information["source"])
|
||||
SideBarLabel:
|
||||
text: "[color={}]Genres:[/color] {}".format(get_hex_from_color(self.theme_cls.primaryColor),root.information["genres"])
|
||||
SideBarLabel:
|
||||
text: "[color={}]Duration:[/color] {}".format(get_hex_from_color(self.theme_cls.primaryColor),root.information["duration"])
|
||||
FitBoxLayout:
|
||||
id:statistics_container
|
||||
SideBarHeaderLabel:
|
||||
text:"Rankings"
|
||||
FitBoxLayout:
|
||||
id:tags_container
|
||||
SideBarHeaderLabel:
|
||||
text:"Tags"
|
||||
FitBoxLayout:
|
||||
id:external_links_container
|
||||
SideBarHeaderLabel:
|
||||
text:"External Links"
|
||||
BoxLayout:
|
||||
|
||||
0
app/View/HomeScreen/components/__init__.py
Normal file
0
app/View/HomeScreen/components/__init__.py
Normal file
35
app/View/HomeScreen/home_screen.kv
Normal file
35
app/View/HomeScreen/home_screen.kv
Normal file
@@ -0,0 +1,35 @@
|
||||
#:import get_color_from_hex kivy.utils.get_color_from_hex
|
||||
#:import StringProperty kivy.properties.StringProperty
|
||||
|
||||
# custom components
|
||||
|
||||
|
||||
<HomeScreenView>
|
||||
md_bg_color: self.theme_cls.backgroundColor
|
||||
main_container:main_container
|
||||
MDBoxLayout:
|
||||
NavRail:
|
||||
screen:root
|
||||
MDAnchorLayout:
|
||||
anchor_y: 'top'
|
||||
padding:"10dp"
|
||||
MDBoxLayout:
|
||||
orientation: 'vertical'
|
||||
id:p
|
||||
SearchBar:
|
||||
MDScrollView:
|
||||
size_hint:1,1
|
||||
MDBoxLayout:
|
||||
id:main_container
|
||||
padding:"50dp","5dp","50dp","150dp"
|
||||
spacing:"10dp"
|
||||
orientation: 'vertical'
|
||||
size_hint_y:None
|
||||
height:max(self.minimum_height,p.height,1800)
|
||||
|
||||
MDBoxLayout:
|
||||
size_hint_y:None
|
||||
height:self.minimum_height
|
||||
MDLabel:
|
||||
text: "By BeneX"
|
||||
|
||||
@@ -2,7 +2,7 @@ from kivy.properties import ObjectProperty
|
||||
from View.base_screen import BaseScreenView
|
||||
|
||||
|
||||
class MainScreenView(BaseScreenView):
|
||||
class HomeScreenView(BaseScreenView):
|
||||
main_container = ObjectProperty()
|
||||
def write_data(self):
|
||||
self.controller.write_data()
|
||||
@@ -1,96 +0,0 @@
|
||||
#:import get_color_from_hex kivy.utils.get_color_from_hex
|
||||
#:import StringProperty kivy.properties.StringProperty
|
||||
|
||||
# custom sets for existing
|
||||
<MDBoxLayout>
|
||||
size_hint: 1,1
|
||||
|
||||
|
||||
# custom components
|
||||
|
||||
<CommonNavigationRailItem@MDNavigationRailItem>
|
||||
icon:""
|
||||
text:""
|
||||
<CommonNavigationRailItem>
|
||||
MDNavigationRailItemIcon:
|
||||
icon:root.icon
|
||||
|
||||
MDNavigationRailItemLabel:
|
||||
text: root.text
|
||||
|
||||
|
||||
<MainScreenView>
|
||||
md_bg_color: self.theme_cls.backgroundColor
|
||||
main_container:main_container
|
||||
MDBoxLayout:
|
||||
MDNavigationRail:
|
||||
anchor:"top"
|
||||
type: "selected"
|
||||
md_bg_color: self.theme_cls.secondaryContainerColor
|
||||
|
||||
MDNavigationRailFabButton:
|
||||
icon: "home-outline"
|
||||
|
||||
CommonNavigationRailItem:
|
||||
icon: "magnify"
|
||||
text: "Search"
|
||||
on_release:
|
||||
# print("r")
|
||||
root.manager_screens.current = "search screen"
|
||||
|
||||
CommonNavigationRailItem:
|
||||
icon: "bookmark-outline"
|
||||
text: "Bookmark"
|
||||
|
||||
CommonNavigationRailItem:
|
||||
icon: "library-outline"
|
||||
text: "Library"
|
||||
|
||||
CommonNavigationRailItem:
|
||||
icon: "cog"
|
||||
text: "settings"
|
||||
|
||||
MDAnchorLayout:
|
||||
anchor_y: 'top'
|
||||
padding:"10dp"
|
||||
MDBoxLayout:
|
||||
orientation: 'vertical'
|
||||
id:p
|
||||
MDBoxLayout:
|
||||
pos_hint: {'center_x': 0.5,'top': 1}
|
||||
padding: "10dp"
|
||||
size_hint_y:None
|
||||
height: self.minimum_height
|
||||
size_hint_x:.75
|
||||
spacing: '20dp'
|
||||
MDTextField:
|
||||
size_hint_x:1
|
||||
MDTextFieldLeadingIcon:
|
||||
icon: "magnify"
|
||||
MDTextFieldHintText:
|
||||
text: "Search for anime"
|
||||
# MDTextFieldTrailingIcon:
|
||||
# icon: "filter"
|
||||
MDIconButton:
|
||||
pos_hint: {'center_y': 0.5}
|
||||
icon: "account-circle"
|
||||
# size: 32,32
|
||||
MDScrollView:
|
||||
# do_scroll_y:True
|
||||
# do_scroll_x:False
|
||||
size_hint:1,1
|
||||
# height:main_container.minimum_height
|
||||
MDBoxLayout:
|
||||
id:main_container
|
||||
padding:"50dp","5dp","50dp","150dp"
|
||||
spacing:"10dp"
|
||||
orientation: 'vertical'
|
||||
size_hint_y:None
|
||||
height:max(self.minimum_height,p.height,1800)
|
||||
adaptive_height:True
|
||||
# MDBoxLayout:
|
||||
# size_hint_y:None
|
||||
# height:self.minimum_height
|
||||
# MDLabel:
|
||||
# text: "By BeneX"
|
||||
|
||||
@@ -3,34 +3,8 @@
|
||||
my_list_container:my_list_container
|
||||
MDBoxLayout:
|
||||
size_hint:1,1
|
||||
MDNavigationRail:
|
||||
anchor:"top"
|
||||
type: "selected"
|
||||
md_bg_color: self.theme_cls.secondaryContainerColor
|
||||
MDNavigationRailFabButton:
|
||||
icon: "home"
|
||||
on_release:
|
||||
root.manager_screens.current = "main screen"
|
||||
CommonNavigationRailItem:
|
||||
icon: "magnify"
|
||||
text: "Search"
|
||||
# on_release:
|
||||
# root.manager_screens.current_screen = "search screen"
|
||||
CommonNavigationRailItem:
|
||||
icon: "bookmark-outline"
|
||||
text: "Bookmark"
|
||||
|
||||
CommonNavigationRailItem:
|
||||
icon: "library-outline"
|
||||
text: "Library"
|
||||
|
||||
CommonNavigationRailItem:
|
||||
icon: "cog"
|
||||
text: "settings"
|
||||
|
||||
# ScreenManager:
|
||||
# MDScreen:
|
||||
# name:"main"
|
||||
NavRail:
|
||||
screen:root
|
||||
MDAnchorLayout:
|
||||
anchor_y: 'top'
|
||||
padding:"10dp"
|
||||
@@ -40,29 +14,7 @@
|
||||
orientation: 'vertical'
|
||||
id:p
|
||||
size_hint:1,1
|
||||
MDBoxLayout:
|
||||
pos_hint: {'center_x': 0.5,'top': 1}
|
||||
padding: "10dp"
|
||||
size_hint_y:None
|
||||
height: self.minimum_height
|
||||
size_hint_x:.75
|
||||
spacing: '20dp'
|
||||
MDTextField:
|
||||
size_hint_x:1
|
||||
required:True
|
||||
on_text_validate:
|
||||
root.handle_search_for_anime(args[0])
|
||||
|
||||
MDTextFieldLeadingIcon:
|
||||
icon: "magnify"
|
||||
MDTextFieldHintText:
|
||||
text: "Search for anime"
|
||||
# MDTextFieldTrailingIcon:
|
||||
# icon: "filter"
|
||||
MDIconButton:
|
||||
pos_hint: {'center_y': 0.5}
|
||||
icon: "account-circle"
|
||||
# size: 32,32
|
||||
SearchBar:
|
||||
MDScrollView:
|
||||
size_hint:1,1
|
||||
MDGridLayout:
|
||||
|
||||
@@ -11,18 +11,8 @@ class MyListScreenView(BaseScreenView):
|
||||
according to these changes.
|
||||
"""
|
||||
|
||||
def handle_search_for_anime(self,search_widget):
|
||||
search_term = search_widget.text
|
||||
if search_term and not(self.is_searching):
|
||||
self.search_term = search_term
|
||||
self.search_results_container.clear_widgets()
|
||||
if self.filters:
|
||||
self.controller.requested_search_for_anime(search_term,**self.filters)
|
||||
else:
|
||||
self.controller.requested_search_for_anime(search_term)
|
||||
|
||||
|
||||
def update_layout(self,widget):
|
||||
self.search_results_container.add_widget(widget)
|
||||
|
||||
pass
|
||||
def add_pagination(self,pagination_info):
|
||||
pass
|
||||
27
app/View/SearchScreen/components/filters.kv
Normal file
27
app/View/SearchScreen/components/filters.kv
Normal file
@@ -0,0 +1,27 @@
|
||||
<FilterDropDown>:
|
||||
MDDropDownItemText:
|
||||
text: root.text
|
||||
|
||||
<FilterLabel@MDLabel>:
|
||||
adaptive_width:True
|
||||
|
||||
<Filters>:
|
||||
adaptive_height:True
|
||||
spacing:"10dp"
|
||||
size_hint_x:.95
|
||||
pos_hint:{"center_x":.5}
|
||||
padding:"10dp"
|
||||
md_bg_color:self.theme_cls.surfaceContainerLowColor
|
||||
|
||||
FilterLabel:
|
||||
text:"Sort By"
|
||||
FilterDropDown:
|
||||
id:sort_filter
|
||||
text:root.filters["sort"]
|
||||
on_release: root.open_filter_menu(self,"sort")
|
||||
FilterLabel:
|
||||
text:"Status"
|
||||
FilterDropDown:
|
||||
id:status_filter
|
||||
# text:root.filters["status"]
|
||||
on_release: root.open_filter_menu(self,"status")
|
||||
21
app/View/SearchScreen/components/pagination.kv
Normal file
21
app/View/SearchScreen/components/pagination.kv
Normal file
@@ -0,0 +1,21 @@
|
||||
<PaginationLabel@MDLabel>
|
||||
max_lines:0
|
||||
shorten:False
|
||||
markup:True
|
||||
adaptive_height:True
|
||||
font_style: "Label"
|
||||
pos_hint:{"center_y":.5}
|
||||
halign:"center"
|
||||
role: "medium"
|
||||
<SearchResultsPagination>:
|
||||
md_bg_color:self.theme_cls.surfaceContainerLowColor
|
||||
radius:8
|
||||
adaptive_height:True
|
||||
MDIconButton:
|
||||
icon:"arrow-left"
|
||||
on_release:root.search_view.previous_page()
|
||||
PaginationLabel:
|
||||
text:"Page {} of {}".format(root.current_page,root.total_pages)
|
||||
MDIconButton:
|
||||
icon:"arrow-right"
|
||||
on_release:root.search_view.next_page()
|
||||
6
app/View/SearchScreen/components/trending_sidebar.kv
Normal file
6
app/View/SearchScreen/components/trending_sidebar.kv
Normal file
@@ -0,0 +1,6 @@
|
||||
<TrendingAnimeSideBar>:
|
||||
orientation: 'vertical'
|
||||
adaptive_height:True
|
||||
md_bg_color:self.theme_cls.surfaceContainerLowColor
|
||||
pos_hint: {'center_x': 0.5}
|
||||
padding:"25dp","25dp","25dp","200dp"
|
||||
@@ -1,40 +1,13 @@
|
||||
<SearchScreenView>
|
||||
md_bg_color: self.theme_cls.backgroundColor
|
||||
search_results_container:search_results_container
|
||||
trending_anime_sidebar:trending_anime_sidebar
|
||||
search_results_pagination:search_results_pagination
|
||||
filters:filters
|
||||
MDBoxLayout:
|
||||
size_hint:1,1
|
||||
MDNavigationRail:
|
||||
anchor:"top"
|
||||
type: "selected"
|
||||
md_bg_color: self.theme_cls.secondaryContainerColor
|
||||
|
||||
MDNavigationRailFabButton:
|
||||
icon: "home"
|
||||
on_release:
|
||||
root.manager_screens.current = "main screen"
|
||||
|
||||
CommonNavigationRailItem:
|
||||
icon: "magnify"
|
||||
text: "Search"
|
||||
# on_release:
|
||||
# root.manager_screens.current_screen = "search screen"
|
||||
|
||||
CommonNavigationRailItem:
|
||||
icon: "bookmark-outline"
|
||||
text: "My Anime List"
|
||||
on_release:
|
||||
root.manager_screens.current = "my list screen"
|
||||
CommonNavigationRailItem:
|
||||
icon: "library-outline"
|
||||
text: "Library"
|
||||
|
||||
CommonNavigationRailItem:
|
||||
icon: "cog"
|
||||
text: "settings"
|
||||
|
||||
# ScreenManager:
|
||||
# MDScreen:
|
||||
# name:"main"
|
||||
NavRail:
|
||||
screen:root
|
||||
MDAnchorLayout:
|
||||
anchor_y: 'top'
|
||||
padding:"10dp"
|
||||
@@ -42,39 +15,53 @@
|
||||
|
||||
MDBoxLayout:
|
||||
orientation: 'vertical'
|
||||
id:p
|
||||
size_hint:1,1
|
||||
SearchBar:
|
||||
MDBoxLayout:
|
||||
pos_hint: {'center_x': 0.5,'top': 1}
|
||||
padding: "10dp"
|
||||
size_hint_y:None
|
||||
height: self.minimum_height
|
||||
size_hint_x:.75
|
||||
spacing: '20dp'
|
||||
MDTextField:
|
||||
size_hint_x:1
|
||||
required:True
|
||||
on_text_validate:
|
||||
root.handle_search_for_anime(args[0])
|
||||
|
||||
MDTextFieldLeadingIcon:
|
||||
icon: "magnify"
|
||||
MDTextFieldHintText:
|
||||
text: "Search for anime"
|
||||
# MDTextFieldTrailingIcon:
|
||||
# icon: "filter"
|
||||
MDIconButton:
|
||||
pos_hint: {'center_y': 0.5}
|
||||
icon: "account-circle"
|
||||
# size: 32,32
|
||||
MDScrollView:
|
||||
size_hint:1,1
|
||||
MDGridLayout:
|
||||
id:search_results_container
|
||||
spacing: '10dp'
|
||||
padding: "75dp","75dp","10dp","200dp"
|
||||
cols:5
|
||||
size_hint_y:None
|
||||
height:self.minimum_height
|
||||
|
||||
spacing:"20dp"
|
||||
padding:"75dp","10dp","100dp","0dp"
|
||||
MDBoxLayout:
|
||||
orientation: 'vertical'
|
||||
size_hint:1,1
|
||||
Filters:
|
||||
id:filters
|
||||
MDBoxLayout:
|
||||
spacing:"20dp"
|
||||
MDScrollView:
|
||||
size_hint:1,1
|
||||
MDBoxLayout:
|
||||
orientation: 'vertical'
|
||||
size_hint_y:None
|
||||
height:self.minimum_height
|
||||
MDGridLayout:
|
||||
pos_hint: {'center_x': 0.5}
|
||||
id:search_results_container
|
||||
spacing: '40dp'
|
||||
padding: "75dp","50dp","75dp","200dp"
|
||||
cols:5
|
||||
size_hint_y:None
|
||||
height:self.minimum_height
|
||||
SearchResultsPagination:
|
||||
id:search_results_pagination
|
||||
search_view:root
|
||||
MDBoxLayout:
|
||||
orientation:"vertical"
|
||||
size_hint_y:1
|
||||
size_hint_x:None
|
||||
width: dp(250)
|
||||
MDLabel:
|
||||
adaptive_height:True
|
||||
halign:"center"
|
||||
max_lines:0
|
||||
shorten:False
|
||||
bold:True
|
||||
markup:True
|
||||
font_style: "Label"
|
||||
role: "large"
|
||||
text:"Trending"
|
||||
md_bg_color:self.theme_cls.secondaryContainerColor
|
||||
padding:"10dp"
|
||||
MDScrollView:
|
||||
TrendingAnimeSideBar:
|
||||
id:trending_anime_sidebar
|
||||
|
||||
@@ -1,12 +1,64 @@
|
||||
from kivy.properties import ObjectProperty,StringProperty,DictProperty
|
||||
from kivy.properties import ObjectProperty,StringProperty,DictProperty,NumericProperty
|
||||
from View.base_screen import BaseScreenView
|
||||
from kivymd.uix.dropdownitem import MDDropDownItem
|
||||
from kivymd.uix.menu import MDDropdownMenu
|
||||
from kivymd.uix.boxlayout import MDBoxLayout
|
||||
from kivy.clock import Clock
|
||||
|
||||
|
||||
class SearchScreenView(BaseScreenView):
|
||||
class FilterDropDown(MDDropDownItem):
|
||||
text = StringProperty()
|
||||
|
||||
class Filters(MDBoxLayout):
|
||||
filters = DictProperty({
|
||||
"sort":"SEARCH_MATCH"
|
||||
})
|
||||
def open_filter_menu(self, menu_item,filter_name):
|
||||
items = []
|
||||
match filter_name:
|
||||
case "sort":
|
||||
items = ["ID","ID_DESC", "TITLE_ROMANJI", "TITLE_ROMANJI_DESC", "TITLE_ENGLISH", "TITLE_ENGLISH_DESC", "TITLE_NATIVE", "TITLE_NATIVE_DESC", "TYPE", "TYPE_DESC", "FORMAT", "FORMAT_DESC", "START_DATE", "START_DATE_DESC", "END_DATE", "END_DATE_DESC", "SCORE", "SCORE_DESC", "TRENDING", "TRENDING_DESC", "EPISODES", "EPISODES_DESC", "DURATION", "DURATION_DESC", "STATUS", "STATUS_DESC", "UPDATED_AT", "UPDATED_AT_DESC", "SEARCH_MATCH" "POPULARITY","POPULARITY_DESC","FAVOURITES","FAVOURITES_DESC"]
|
||||
case "status":
|
||||
items = ["FINISHED", "RELEASING", "NOT_YET_RELEASED", "CANCELLED", "HIATUS"]
|
||||
case _:
|
||||
items = []
|
||||
if items:
|
||||
menu_items = [
|
||||
{
|
||||
"text": f"{item}",
|
||||
"on_release": lambda filter_value=f"{item}": self.filter_menu_callback(filter_name,filter_value),
|
||||
} for item in items
|
||||
]
|
||||
MDDropdownMenu(caller=menu_item, items=menu_items).open()
|
||||
|
||||
def filter_menu_callback(self, filter_name,filter_value):
|
||||
match filter_name:
|
||||
case "sort":
|
||||
self.ids.sort_filter.text = filter_value
|
||||
self.filters["sort"] = filter_value
|
||||
case "status":
|
||||
self.ids.status_filter.text = filter_value
|
||||
self.filters["status"] = filter_value
|
||||
|
||||
|
||||
class SearchResultsPagination(MDBoxLayout):
|
||||
current_page = NumericProperty()
|
||||
total_pages = NumericProperty()
|
||||
search_view = ObjectProperty()
|
||||
|
||||
class TrendingAnimeSideBar(MDBoxLayout):
|
||||
pass
|
||||
|
||||
class SearchScreenView(BaseScreenView):
|
||||
search_results_container = ObjectProperty()
|
||||
trending_anime_sidebar = ObjectProperty()
|
||||
search_results_pagination = ObjectProperty()
|
||||
search_term = StringProperty()
|
||||
filters = DictProperty()
|
||||
filters = ObjectProperty()
|
||||
is_searching = False
|
||||
has_next_page = False
|
||||
current_page = 0
|
||||
total_pages = 0
|
||||
def model_is_changed(self) -> None:
|
||||
"""
|
||||
Called whenever any change has occurred in the data model.
|
||||
@@ -14,18 +66,39 @@ class SearchScreenView(BaseScreenView):
|
||||
according to these changes.
|
||||
"""
|
||||
|
||||
def handle_search_for_anime(self,search_widget):
|
||||
search_term = search_widget.text
|
||||
def handle_search_for_anime(self,search_widget=None,page=None):
|
||||
if search_widget:
|
||||
search_term = search_widget.text
|
||||
elif page:
|
||||
search_term = self.search_term
|
||||
else:
|
||||
return
|
||||
|
||||
if search_term and not(self.is_searching):
|
||||
self.search_term = search_term
|
||||
self.search_results_container.clear_widgets()
|
||||
if self.filters:
|
||||
self.controller.requested_search_for_anime(search_term,**self.filters)
|
||||
if filters:=self.filters.filters:
|
||||
Clock.schedule_once(lambda _:self.controller.requested_search_for_anime(search_term,**filters,page=page))
|
||||
else:
|
||||
self.controller.requested_search_for_anime(search_term)
|
||||
Clock.schedule_once(lambda _:self.controller.requested_search_for_anime(search_term,page=page))
|
||||
|
||||
def update_layout(self,widget):
|
||||
self.search_results_container.add_widget(widget)
|
||||
|
||||
def add_pagination(self,pagination_info):
|
||||
pass
|
||||
def update_pagination(self,pagination_info):
|
||||
self.search_results_pagination.current_page =self.current_page = pagination_info["currentPage"]
|
||||
self.search_results_pagination.total_pages = self.total_pages = pagination_info["total"]
|
||||
self.has_next_page = pagination_info["hasNextPage"]
|
||||
|
||||
def next_page(self):
|
||||
if self.has_next_page:
|
||||
page = self.current_page + 1
|
||||
self.handle_search_for_anime(page=page)
|
||||
|
||||
def previous_page(self):
|
||||
if self.current_page > 1:
|
||||
page = self.current_page - 1
|
||||
self.handle_search_for_anime(page=page)
|
||||
|
||||
def update_trending_sidebar(self,trending_anime):
|
||||
self.trending_anime_sidebar.add_widget(trending_anime)
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
from .MainScreen.main_screen import MainScreenView
|
||||
from .HomeScreen.home_screen import HomeScreenView
|
||||
from .SearchScreen.search_screen import SearchScreenView
|
||||
from .MylistScreen.my_list_screen import MyListScreenView
|
||||
from .MylistScreen.my_list_screen import MyListScreenView
|
||||
from .AnimeScreen.anime_screen import AnimeScreenView
|
||||
@@ -1,4 +1,6 @@
|
||||
from kivy.properties import ObjectProperty
|
||||
from kivymd.uix.navigationrail import MDNavigationRail
|
||||
from kivymd.uix.boxlayout import MDBoxLayout
|
||||
|
||||
from kivymd.app import MDApp
|
||||
from kivymd.uix.screen import MDScreen
|
||||
@@ -6,6 +8,14 @@ from kivymd.uix.screen import MDScreen
|
||||
from Utility.observer import Observer
|
||||
|
||||
|
||||
|
||||
class NavRail(MDNavigationRail):
|
||||
screen=ObjectProperty()
|
||||
|
||||
class SearchBar(MDBoxLayout):
|
||||
pass
|
||||
|
||||
|
||||
class BaseScreenView(MDScreen, Observer):
|
||||
"""
|
||||
A base class that implements a visual representation of the model data.
|
||||
|
||||
3
app/View/components/general.kv
Normal file
3
app/View/components/general.kv
Normal file
@@ -0,0 +1,3 @@
|
||||
<MDLabel>:
|
||||
allow_copy:True
|
||||
allow_selection:True
|
||||
@@ -0,0 +1,19 @@
|
||||
<MediaCardsContainer>
|
||||
size_hint:1,None
|
||||
height:max(self.minimum_height,dp(350),container.minimum_height)
|
||||
container:container
|
||||
orientation: 'vertical'
|
||||
padding:"10dp"
|
||||
spacing:"5dp"
|
||||
MDLabel:
|
||||
text:root.list_name
|
||||
MDScrollView:
|
||||
size_hint:1,None
|
||||
height:container.minimum_height
|
||||
MDBoxLayout:
|
||||
id:container
|
||||
spacing:"10dp"
|
||||
padding:"0dp","10dp","100dp","10dp"
|
||||
size_hint:None,None
|
||||
height:self.minimum_height
|
||||
width:self.minimum_width
|
||||
164
app/View/components/media_card/components/media_popup.kv
Normal file
164
app/View/components/media_card/components/media_popup.kv
Normal file
@@ -0,0 +1,164 @@
|
||||
#:import get_hex_from_color kivy.utils.get_hex_from_color
|
||||
#:set yellow [.9,.9,0,.9]
|
||||
|
||||
<SingleLineLabel@MDLabel>:
|
||||
shorten:True
|
||||
shorten_from:"right"
|
||||
adaptive_height:True
|
||||
|
||||
<PopupBoxLayout@MDBoxLayout>
|
||||
adaptive_height:True
|
||||
|
||||
<MediaPopup>
|
||||
size_hint: None, None
|
||||
height: dp(500)
|
||||
width: dp(400)
|
||||
radius:[5,5,5,5]
|
||||
md_bg_color:self.theme_cls.backgroundColor
|
||||
anchor_y: 'top'
|
||||
player:player
|
||||
MDBoxLayout:
|
||||
orientation: 'vertical'
|
||||
MDRelativeLayout:
|
||||
size_hint_y: None
|
||||
height: dp(250)
|
||||
line_color:root.caller.has_trailer_color
|
||||
line_width:2
|
||||
MediaPopupVideoPlayer:
|
||||
id:player
|
||||
source:root.caller.trailer_url
|
||||
preview:root.caller.preview_image
|
||||
state:"play" if root.caller.trailer_url else "stop"
|
||||
fit_mode:"fill"
|
||||
size_hint_y: None
|
||||
height: dp(250)
|
||||
PopupBoxLayout:
|
||||
padding: "10dp","5dp"
|
||||
spacing:"5dp"
|
||||
pos_hint: {'left': 1,'top': 1}
|
||||
MDIcon:
|
||||
icon: "star"
|
||||
color:yellow
|
||||
disabled: not(root.caller.stars[0])
|
||||
MDIcon:
|
||||
color:yellow
|
||||
disabled: not(root.caller.stars[1])
|
||||
icon: "star"
|
||||
MDIcon:
|
||||
color:yellow
|
||||
disabled: not(root.caller.stars[2])
|
||||
icon: "star"
|
||||
MDIcon:
|
||||
color:yellow
|
||||
disabled: not(root.caller.stars[3])
|
||||
icon: "star"
|
||||
MDIcon:
|
||||
color:yellow
|
||||
icon: "star"
|
||||
disabled: not(root.caller.stars[4])
|
||||
MDIcon:
|
||||
color: yellow
|
||||
icon: "star"
|
||||
disabled: not(root.caller.stars[5])
|
||||
|
||||
MDLabel:
|
||||
text: f"{root.caller.episodes} Episodes"
|
||||
halign:"right"
|
||||
font_style:"Label"
|
||||
role:"medium"
|
||||
bold:True
|
||||
pos_hint: {'center_y': 0.5}
|
||||
adaptive_height:True
|
||||
color: 0,0,0,.7
|
||||
|
||||
PopupBoxLayout:
|
||||
padding:"5dp"
|
||||
pos_hint: {'bottom': 1}
|
||||
SingleLineLabel:
|
||||
text:root.caller.media_status
|
||||
opacity:.8
|
||||
halign:"left"
|
||||
font_style:"Label"
|
||||
role:"medium"
|
||||
bold:True
|
||||
pos_hint: {'center_y': .5}
|
||||
SingleLineLabel:
|
||||
text:root.caller.first_aired_on
|
||||
opacity:.8
|
||||
halign:"right"
|
||||
font_style:"Label"
|
||||
role:"medium"
|
||||
bold:True
|
||||
pos_hint: {'center_y': .5}
|
||||
# header
|
||||
MDBoxLayout:
|
||||
orientation: 'vertical'
|
||||
padding:"10dp"
|
||||
spacing:"10dp"
|
||||
PopupBoxLayout:
|
||||
PopupBoxLayout:
|
||||
pos_hint: {'center_y': 0.5}
|
||||
TooltipMDIconButton:
|
||||
tooltip_text:root.caller.title
|
||||
icon: "play-circle"
|
||||
on_press:
|
||||
root.dismiss()
|
||||
app.show_anime_screen(root.caller.anime_id)
|
||||
MDIconButton:
|
||||
icon: "plus-circle" if not(root.caller.is_in_my_list) else "check-circle"
|
||||
on_release:
|
||||
root.caller.is_in_my_list = not(root.caller.is_in_my_list)
|
||||
self.icon = "plus-circle" if not(root.caller.is_in_my_list) else "check-circle"
|
||||
MDIconButton:
|
||||
icon: "bell-circle" if not(root.caller.is_in_my_notify) else "bell-check"
|
||||
PopupBoxLayout:
|
||||
pos_hint: {'center_y': 0.5}
|
||||
orientation: 'vertical'
|
||||
|
||||
SingleLineLabel:
|
||||
font_style:"Label"
|
||||
role:"small"
|
||||
text: f"[color={get_hex_from_color(self.theme_cls.primaryColor)}]"+"Genres: "+"[/color]"+root.caller.genres
|
||||
markup:True
|
||||
PopupBoxLayout:
|
||||
SingleLineLabel:
|
||||
font_style:"Label"
|
||||
role:"small"
|
||||
markup:True
|
||||
text: f"[color={get_hex_from_color(self.theme_cls.primaryColor)}]"+"Popularity: "+"[/color]"+root.caller.popularity
|
||||
SingleLineLabel:
|
||||
font_style:"Label"
|
||||
markup:True
|
||||
role:"small"
|
||||
text: f"[color={get_hex_from_color(self.theme_cls.primaryColor)}]"+"Favourites: "+"[/color]"+root.caller.favourites
|
||||
MDScrollView:
|
||||
size_hint:1,1
|
||||
do_scroll_y:True
|
||||
MDLabel:
|
||||
font_style:"Body"
|
||||
role:"small"
|
||||
text:root.caller.description
|
||||
adaptive_height:True
|
||||
# footer
|
||||
PopupBoxLayout:
|
||||
orientation:"vertical"
|
||||
SingleLineLabel:
|
||||
font_style:"Label"
|
||||
role:"small"
|
||||
markup:True
|
||||
text: f"[color={get_hex_from_color(self.theme_cls.primaryColor)}]"+"Author: "+"[/color]"+root.caller.author
|
||||
SingleLineLabel:
|
||||
font_style:"Label"
|
||||
markup:True
|
||||
role:"small"
|
||||
text: f"[color={get_hex_from_color(self.theme_cls.primaryColor)}]"+"Studios: "+"[/color]"+root.caller.studios
|
||||
SingleLineLabel:
|
||||
font_style:"Label"
|
||||
markup:True
|
||||
role:"small"
|
||||
text: f"[color={get_hex_from_color(self.theme_cls.primaryColor)}]"+"Characters: "+"[/color]"+root.caller.characters
|
||||
SingleLineLabel:
|
||||
font_style:"Label"
|
||||
markup:True
|
||||
role:"small"
|
||||
text: f"[color={get_hex_from_color(self.theme_cls.primaryColor)}]"+"Tags: "+"[/color]"+root.caller.tags
|
||||
3
app/View/components/media_card/components/tooltip.kv
Normal file
3
app/View/components/media_card/components/tooltip.kv
Normal file
@@ -0,0 +1,3 @@
|
||||
<Tooltip>
|
||||
MDTooltipPlain:
|
||||
text:root.tooltip_text
|
||||
@@ -1,209 +1,11 @@
|
||||
#:import get_hex_from_color kivy.utils.get_hex_from_color
|
||||
|
||||
#:set yellow [.9,.9,0,.9]
|
||||
|
||||
# overides and customization
|
||||
<MDLabel>:
|
||||
adaptive_height:True
|
||||
max_lines:1
|
||||
valign:"top"
|
||||
shorten_from:"right"
|
||||
shorten:True
|
||||
|
||||
<MDLabelShortened@MDLabel>
|
||||
bold:True
|
||||
<MDIcon>
|
||||
valign:"center"
|
||||
|
||||
|
||||
<MDBoxLayout>:
|
||||
# adaptive_height:True
|
||||
size_hint_y:None
|
||||
height:self.minimum_height
|
||||
|
||||
|
||||
# custom components
|
||||
<Tooltip>
|
||||
MDTooltipPlain:
|
||||
text:root.tooltip_text
|
||||
|
||||
|
||||
# <TooltipMDIconButton>
|
||||
|
||||
|
||||
<MediaPopup>
|
||||
size_hint: None, None
|
||||
height: dp(500)
|
||||
width: dp(400)
|
||||
radius:[5,5,5,5]
|
||||
md_bg_color:self.theme_cls.backgroundColor
|
||||
anchor_y: 'top'
|
||||
player:player
|
||||
MDBoxLayout:
|
||||
orientation: 'vertical'
|
||||
adaptive_height:False
|
||||
anchor_y: 'top'
|
||||
MDRelativeLayout:
|
||||
size_hint_y: None
|
||||
height: dp(250)
|
||||
line_color:root.caller.has_trailer_color
|
||||
line_width:2
|
||||
MediaPopupVideoPlayer:
|
||||
id:player
|
||||
source:root.caller.trailer_url
|
||||
preview:root.caller.preview_image
|
||||
state:"play" if root.caller.trailer_url else "stop"
|
||||
fit_mode:"fill"
|
||||
size_hint_y: None
|
||||
height: dp(250)
|
||||
MDBoxLayout:
|
||||
padding: "10dp","5dp"
|
||||
spacing:"5dp"
|
||||
pos_hint: {'left': 1,'top': 1}
|
||||
adaptive_height:True
|
||||
MDIcon:
|
||||
icon: "star"
|
||||
color:yellow
|
||||
disabled: not(root.caller.stars[0])
|
||||
MDIcon:
|
||||
color:yellow
|
||||
disabled: not(root.caller.stars[1])
|
||||
icon: "star"
|
||||
MDIcon:
|
||||
color:yellow
|
||||
disabled: not(root.caller.stars[2])
|
||||
icon: "star"
|
||||
MDIcon:
|
||||
color:yellow
|
||||
disabled: not(root.caller.stars[3])
|
||||
icon: "star"
|
||||
MDIcon:
|
||||
color:yellow
|
||||
icon: "star"
|
||||
disabled: not(root.caller.stars[4])
|
||||
MDIcon:
|
||||
color: yellow
|
||||
icon: "star"
|
||||
disabled: not(root.caller.stars[5])
|
||||
|
||||
MDLabel:
|
||||
text: f"{root.caller.episodes} Episodes"
|
||||
halign:"right"
|
||||
font_style:"Label"
|
||||
role:"medium"
|
||||
bold:True
|
||||
pos_hint: {'center_y': 0.5}
|
||||
adaptive_height:True
|
||||
color: 0,0,0,.7
|
||||
|
||||
MDBoxLayout:
|
||||
padding:"5dp"
|
||||
pos_hint: {'bottom': 1}
|
||||
adaptive_height:True
|
||||
MDLabel:
|
||||
text:root.caller.media_status
|
||||
opacity:.8
|
||||
halign:"left"
|
||||
font_style:"Label"
|
||||
role:"medium"
|
||||
bold:True
|
||||
pos_hint: {'center_y': .5}
|
||||
adaptive_height:True
|
||||
MDLabel:
|
||||
text:root.caller.first_aired_on
|
||||
opacity:.8
|
||||
halign:"right"
|
||||
font_style:"Label"
|
||||
role:"medium"
|
||||
bold:True
|
||||
pos_hint: {'center_y': .5}
|
||||
adaptive_height:True
|
||||
MDBoxLayout:
|
||||
orientation: 'vertical'
|
||||
padding:"10dp"
|
||||
spacing:"10dp"
|
||||
adaptive_height:False
|
||||
MDBoxLayout:
|
||||
adaptive_height:True
|
||||
MDBoxLayout:
|
||||
adaptive_height:True
|
||||
pos_hint: {'center_y': 0.5}
|
||||
TooltipMDIconButton:
|
||||
tooltip_text:root.caller.title
|
||||
icon: "play-circle"
|
||||
on_press: root.caller.is_play
|
||||
MDIconButton:
|
||||
icon: "plus-circle" if not(root.caller.is_in_my_list) else "check-circle"
|
||||
on_release:
|
||||
root.caller.is_in_my_list = not(root.caller.is_in_my_list)
|
||||
self.icon = "plus-circle" if not(root.caller.is_in_my_list) else "check-circle"
|
||||
MDIconButton:
|
||||
icon: "bell-circle" if not(root.caller.is_in_my_notify) else "bell-check"
|
||||
MDBoxLayout:
|
||||
orientation: 'vertical'
|
||||
pos_hint: {'center_y': 0.5}
|
||||
adaptive_height:True
|
||||
MDLabelShortened:
|
||||
font_style:"Label"
|
||||
role:"small"
|
||||
text: f"[color={get_hex_from_color(self.theme_cls.primaryColor)}]"+"Genres: "+"[/color]"+root.caller.genres
|
||||
markup:True
|
||||
MDBoxLayout:
|
||||
adaptive_height:True
|
||||
MDLabelShortened:
|
||||
font_style:"Label"
|
||||
role:"small"
|
||||
markup:True
|
||||
text: f"[color={get_hex_from_color(self.theme_cls.primaryColor)}]"+"Popularity: "+"[/color]"+root.caller.popularity
|
||||
MDLabelShortened:
|
||||
font_style:"Label"
|
||||
markup:True
|
||||
role:"small"
|
||||
text: f"[color={get_hex_from_color(self.theme_cls.primaryColor)}]"+"Favourites: "+"[/color]"+root.caller.favourites
|
||||
MDScrollView:
|
||||
size_hint:1,1
|
||||
do_scroll_y:True
|
||||
MDLabel:
|
||||
font_style:"Body"
|
||||
role:"small"
|
||||
text:root.caller.description
|
||||
shorten:False
|
||||
adaptive_height:True
|
||||
# shorten_from:"right"
|
||||
max_lines:0
|
||||
|
||||
MDBoxLayout:
|
||||
orientation: 'vertical'
|
||||
adaptive_height:True
|
||||
MDLabelShortened:
|
||||
font_style:"Label"
|
||||
role:"small"
|
||||
markup:True
|
||||
text: f"[color={get_hex_from_color(self.theme_cls.primaryColor)}]"+"Author: "+"[/color]"+root.caller.author
|
||||
MDLabelShortened:
|
||||
font_style:"Label"
|
||||
markup:True
|
||||
role:"small"
|
||||
text: f"[color={get_hex_from_color(self.theme_cls.primaryColor)}]"+"Studios: "+"[/color]"+root.caller.studios
|
||||
MDLabelShortened:
|
||||
font_style:"Label"
|
||||
markup:True
|
||||
role:"small"
|
||||
text: f"[color={get_hex_from_color(self.theme_cls.primaryColor)}]"+"Characters: "+"[/color]"+root.caller.characters
|
||||
MDLabelShortened:
|
||||
font_style:"Label"
|
||||
markup:True
|
||||
role:"small"
|
||||
text: f"[color={get_hex_from_color(self.theme_cls.primaryColor)}]"+"Tags: "+"[/color]"+root.caller.tags
|
||||
|
||||
<MediaCard>
|
||||
adaptive_height:True
|
||||
spacing:"5dp"
|
||||
image:"https://s4.anilist.co/file/anilistcdn/media/anime/cover/small/bx163270-oxwgbe43Cpog.jpg"
|
||||
on_release:
|
||||
self.open()
|
||||
size_hint_x: None
|
||||
width:dp(100)
|
||||
# height:self.minimum_height
|
||||
on_release:
|
||||
self.open()
|
||||
FitImage:
|
||||
source:root.cover_image_url
|
||||
fit_mode:"fill"
|
||||
@@ -212,7 +14,7 @@
|
||||
height: dp(150)
|
||||
MDDivider:
|
||||
color:root.has_trailer_color
|
||||
MDLabel:
|
||||
SingleLineLabel:
|
||||
font_style:"Label"
|
||||
role:"medium"
|
||||
text:root.title
|
||||
@@ -220,30 +22,3 @@
|
||||
halign:"center"
|
||||
color:self.theme_cls.secondaryColor
|
||||
|
||||
<MediaCardsContainer>
|
||||
# adaptive_height:True
|
||||
# size_hint_y:None
|
||||
size_hint_x:1
|
||||
# height:dp(300)
|
||||
size_hint_y:None
|
||||
height:max(self.minimum_height,dp(350),container.minimum_height)
|
||||
# adaptive_height:True
|
||||
# width:self.minimum_width
|
||||
container:container
|
||||
orientation: 'vertical'
|
||||
padding:"10dp"
|
||||
spacing:"5dp"
|
||||
MDLabel:
|
||||
text:root.list_name
|
||||
MDScrollView:
|
||||
# do_scroll_x:True
|
||||
# do_scroll_y:False
|
||||
size_hint:1,None
|
||||
height:container.minimum_height
|
||||
MDBoxLayout:
|
||||
id:container
|
||||
padding:"0dp","10dp","100dp","10dp"
|
||||
size_hint:None,None
|
||||
height:self.minimum_height
|
||||
width:self.minimum_width
|
||||
spacing:"10dp"
|
||||
|
||||
@@ -9,7 +9,7 @@ from kivymd.theming import ThemableBehavior
|
||||
from kivy.uix.modalview import ModalView
|
||||
from kivy.properties import ObjectProperty,StringProperty,BooleanProperty,ListProperty,NumericProperty
|
||||
from kivy.uix.video import Video
|
||||
|
||||
from kivy.animation import Animation
|
||||
class Tooltip(MDTooltip):
|
||||
pass
|
||||
|
||||
@@ -28,9 +28,45 @@ class MediaPopup(ThemableBehavior,HoverBehavior,StencilBehavior,CommonElevationB
|
||||
player = ObjectProperty()
|
||||
|
||||
def __init__(self, caller,*args,**kwarg):
|
||||
self.caller = caller
|
||||
self.caller:MediaCard = caller
|
||||
super(MediaPopup,self).__init__(*args,**kwarg)
|
||||
|
||||
|
||||
def open(self, *_args, **kwargs):
|
||||
"""Display the modal in the Window.
|
||||
|
||||
When the view is opened, it will be faded in with an animation. If you
|
||||
don't want the animation, use::
|
||||
|
||||
view.open(animation=False)
|
||||
|
||||
"""
|
||||
from kivy.core.window import Window
|
||||
if self._is_open:
|
||||
return
|
||||
self._window = Window
|
||||
self._is_open = True
|
||||
self.dispatch('on_pre_open')
|
||||
Window.add_widget(self)
|
||||
Window.bind(
|
||||
on_resize=self._align_center,
|
||||
on_keyboard=self._handle_keyboard)
|
||||
self.center = self.caller.to_window(*self.caller.center)
|
||||
self.fbind('center', self._align_center)
|
||||
self.fbind('size', self._align_center)
|
||||
if kwargs.get('animation', True):
|
||||
ani = Animation(_anim_alpha=1., d=self._anim_duration)
|
||||
ani.bind(on_complete=lambda *_args: self.dispatch('on_open'))
|
||||
ani.start(self)
|
||||
else:
|
||||
self._anim_alpha = 1.
|
||||
self.dispatch('on_open')
|
||||
|
||||
def _align_center(self, *_args):
|
||||
if self._is_open:
|
||||
self.center = self.caller.to_window(*self.caller.center)
|
||||
|
||||
|
||||
def on_leave(self,*args):
|
||||
def _leave(dt):
|
||||
if not self.hovering:
|
||||
@@ -39,6 +75,7 @@ class MediaPopup(ThemableBehavior,HoverBehavior,StencilBehavior,CommonElevationB
|
||||
|
||||
|
||||
class MediaCard(ButtonBehavior,HoverBehavior,MDBoxLayout):
|
||||
anime_id = NumericProperty()
|
||||
title = StringProperty()
|
||||
is_play = ObjectProperty()
|
||||
trailer_url = StringProperty()
|
||||
@@ -58,9 +95,7 @@ class MediaCard(ButtonBehavior,HoverBehavior,MDBoxLayout):
|
||||
stars = ListProperty([0,0,0,0,0,0])
|
||||
cover_image_url = StringProperty()
|
||||
preview_image = StringProperty()
|
||||
# screen_name = StringProperty()
|
||||
screen = ObjectProperty()
|
||||
anime_id = NumericProperty()
|
||||
has_trailer_color = ListProperty([1,1,1,0])
|
||||
def __init__(self,trailer_url=None,**kwargs):
|
||||
super().__init__(**kwargs)
|
||||
@@ -74,15 +109,16 @@ class MediaCard(ButtonBehavior,HoverBehavior,MDBoxLayout):
|
||||
# def on_screen_name(self,instance,value):
|
||||
# if self.app:
|
||||
# self.screen = self.app.manager_screens.get_screen(value)
|
||||
|
||||
# def
|
||||
def on_enter(self):
|
||||
def _open_popup(dt):
|
||||
if self.hovering:
|
||||
window = self.get_parent_window()
|
||||
for widget in window.children: # type: ignore
|
||||
if isinstance(widget,MediaPopup):
|
||||
return
|
||||
self.open()
|
||||
if window:
|
||||
for widget in window.children: # type: ignore
|
||||
if isinstance(widget,MediaPopup):
|
||||
return
|
||||
self.open()
|
||||
Clock.schedule_once(_open_popup,5)
|
||||
|
||||
def on_popup_open(self,popup:MediaPopup):
|
||||
@@ -116,70 +152,3 @@ class MediaCard(ButtonBehavior,HoverBehavior,MDBoxLayout):
|
||||
class MediaCardsContainer(MDBoxLayout):
|
||||
container = ObjectProperty()
|
||||
list_name = StringProperty()
|
||||
# if __name__ == "__main__":
|
||||
# from kivymd.app import MDApp
|
||||
# from kivy.lang import Builder
|
||||
# import json
|
||||
# import os
|
||||
# import tracemalloc
|
||||
# tracemalloc.start()
|
||||
# data = {}
|
||||
# with open(os.path.join(os.curdir,"View","components","media_card","data.json"),"r") as file:
|
||||
# data = json.loads(file.read())
|
||||
|
||||
# cache = {}
|
||||
# def fetch_data(key):
|
||||
# yt = YouTube(key)
|
||||
# preview_image = yt.thumbnail_url
|
||||
# video_stream_url = yt.streams.filter(progressive=True,file_extension="mp4")[-1].url
|
||||
# return preview_image,video_stream_url
|
||||
|
||||
# def cached_fetch_data(key):
|
||||
# if key not in cache:
|
||||
# cache[key] = fetch_data(key)
|
||||
# return cache[key]
|
||||
|
||||
|
||||
# class MediaCardApp(MDApp):
|
||||
# def build(self):
|
||||
# self.theme_cls.primary_palette = "Magenta"
|
||||
# self.theme_cls.theme_style = "Dark"
|
||||
# ui = Builder.load_file("./media_card.kv")
|
||||
|
||||
# for item in data["data"]["Page"]["media"]:
|
||||
# media_card = MediaCard()
|
||||
# if item["title"]["english"]:
|
||||
# media_card.title = item["title"]["english"]
|
||||
# else:
|
||||
# media_card.title = item["title"]["romaji"]
|
||||
# media_card.cover_image_url = item["coverImage"]["medium"]
|
||||
# media_card.popularity = str(item["popularity"])
|
||||
# media_card.favourites = str(item["favourites"])
|
||||
# media_card.episodes = str(item["episodes"])
|
||||
# media_card.description = item["description"]
|
||||
# media_card.first_aired_on = str(item["startDate"])
|
||||
# media_card.studios = str(item["studios"]["nodes"])
|
||||
# media_card.tags = str(item["tags"])
|
||||
# media_card.media_status = item["status"]
|
||||
# if item["trailer"]:
|
||||
# try:
|
||||
# url = cached_fetch_data("https://youtube.com/watch?v="+item["trailer"]["id"])[1]
|
||||
# media_card.trailer_url =url
|
||||
# except:
|
||||
# pass
|
||||
|
||||
# media_card.genres = ",".join(item["genres"])
|
||||
|
||||
# stars = int(item["averageScore"]/100*6)
|
||||
# if stars:
|
||||
# for i in range(stars):
|
||||
# media_card.stars[i] = 1
|
||||
|
||||
# ui.ids.cards.add_widget(media_card) # type: ignore
|
||||
# return ui
|
||||
|
||||
# MediaCardApp().run()
|
||||
# snapshot = tracemalloc.take_snapshot()
|
||||
# print("-----------------------------------------------")
|
||||
# for stat in snapshot.statistics("lineno")[:10]:
|
||||
# print(stat)
|
||||
42
app/View/components/navrail.kv
Normal file
42
app/View/components/navrail.kv
Normal file
@@ -0,0 +1,42 @@
|
||||
<CommonNavigationRailItem@MDNavigationRailItem>
|
||||
icon:""
|
||||
text:""
|
||||
<CommonNavigationRailItem>
|
||||
MDNavigationRailItemIcon:
|
||||
icon:root.icon
|
||||
|
||||
MDNavigationRailItemLabel:
|
||||
text: root.text
|
||||
|
||||
<NavRail>:
|
||||
anchor:"top"
|
||||
type: "labeled"
|
||||
md_bg_color: self.theme_cls.secondaryContainerColor
|
||||
|
||||
MDNavigationRailFabButton:
|
||||
icon: "home"
|
||||
on_release:
|
||||
root.screen.manager_screens.current = "home screen"
|
||||
|
||||
CommonNavigationRailItem:
|
||||
icon: "magnify"
|
||||
text: "Search"
|
||||
on_release:
|
||||
root.screen.manager_screens.current = "search screen"
|
||||
|
||||
CommonNavigationRailItem:
|
||||
icon: "bookmark" #if root.screen.manager_screens.current=="my list screen" else "bookmark-outline"
|
||||
text: "Bookmark"
|
||||
on_release:
|
||||
root.screen.manager_screens.current = "my list screen"
|
||||
CommonNavigationRailItem:
|
||||
icon: "library"
|
||||
text: "Library"
|
||||
on_release:
|
||||
root.screen.manager_screens.current = "anime screen"
|
||||
CommonNavigationRailItem:
|
||||
icon: "cog"
|
||||
text: "settings"
|
||||
CommonNavigationRailItem:
|
||||
icon: "bug"
|
||||
text: "debug"
|
||||
18
app/View/components/top_app_bar.kv
Normal file
18
app/View/components/top_app_bar.kv
Normal file
@@ -0,0 +1,18 @@
|
||||
<SearchBar>:
|
||||
pos_hint: {'center_x': 0.5,'top': 1}
|
||||
padding: "10dp"
|
||||
adaptive_height:True
|
||||
size_hint_x:.75
|
||||
spacing: '20dp'
|
||||
MDTextField:
|
||||
size_hint_x:1
|
||||
required:True
|
||||
on_text_validate:
|
||||
app.search_for_anime(args[0])
|
||||
MDTextFieldLeadingIcon:
|
||||
icon: "magnify"
|
||||
MDTextFieldHintText:
|
||||
text: "Search for anime"
|
||||
MDIconButton:
|
||||
pos_hint: {'center_y': 0.5}
|
||||
icon: "account-circle"
|
||||
@@ -1,14 +1,11 @@
|
||||
# The screens dictionary contains the objects of the models and controllers
|
||||
# of the screens of the application.
|
||||
from Controller import SearchScreenController,HomeScreenController,MyListScreenController,AnimeScreenController
|
||||
from Model import HomeScreenModel,SearchScreenModel,MyListScreenModel,AnimeScreenModel
|
||||
|
||||
|
||||
from Controller import SearchScreenController,MainScreenController,MyListScreenController
|
||||
from Model import MainScreenModel,SearchScreenModel,MyListScreenModel
|
||||
|
||||
screens = {
|
||||
"main screen": {
|
||||
"model": MainScreenModel,
|
||||
"controller": MainScreenController,
|
||||
"home screen": {
|
||||
"model": HomeScreenModel,
|
||||
"controller": HomeScreenController,
|
||||
},
|
||||
"search screen": {
|
||||
"model": SearchScreenModel,
|
||||
@@ -18,4 +15,8 @@ screens = {
|
||||
"model": MyListScreenModel,
|
||||
"controller": MyListScreenController,
|
||||
},
|
||||
"anime screen": {
|
||||
"model": AnimeScreenModel,
|
||||
"controller": AnimeScreenController,
|
||||
},
|
||||
}
|
||||
3
app/animdl_config.yml
Normal file
3
app/animdl_config.yml
Normal file
@@ -0,0 +1,3 @@
|
||||
default_player: mpv
|
||||
default_provider: allanime
|
||||
quality_string: "1080/best"
|
||||
969
app/anime.json
Normal file
969
app/anime.json
Normal file
@@ -0,0 +1,969 @@
|
||||
{
|
||||
"data": {
|
||||
"Page": {
|
||||
"media": [
|
||||
{
|
||||
"title": { "romaji": "Cowboy Bebop", "english": "Cowboy Bebop" },
|
||||
"coverImage": {
|
||||
"extraLarge": "https://s4.anilist.co/file/anilistcdn/media/anime/cover/large/bx1-CXtrrkMpJ8Zq.png"
|
||||
},
|
||||
"episodes":24,
|
||||
"characters": {
|
||||
"edges": [
|
||||
{
|
||||
"node": {
|
||||
"name": { "full": "Spike Spiegel" },
|
||||
"gender": "Male",
|
||||
"dateOfBirth": { "year": 2044, "month": 6, "day": 26 },
|
||||
"age": "27",
|
||||
"image": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/character/medium/b1-ChxaldmieFlQ.png"
|
||||
},
|
||||
"description": "__Height:__ 185 cm \n\nSpike Spiegel is a tall and lean 27-year-old bounty hunter born on Mars."
|
||||
},
|
||||
"voiceActors": [
|
||||
{
|
||||
"name": { "full": "Kouichi Yamadera" },
|
||||
"image": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/staff/medium/n95011-2RfLzncNyvbR.png"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": { "full": "Steven Blum" },
|
||||
"image": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/staff/medium/n95012-jnlK6VyCTf9P.png"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": { "full": "Massimo De Ambrosis" },
|
||||
"image": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/staff/medium/781.jpg"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": { "full": "Viktor Neumann" },
|
||||
"image": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/staff/medium/1638.jpg"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": { "full": "Zolt\u00e1n Juh\u00e1sz" },
|
||||
"image": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/staff/medium/default.jpg"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": { "full": "Yann Pichon" },
|
||||
"image": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/staff/medium/9237.jpg"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": { "full": "Ja hyeong Gu" },
|
||||
"image": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/staff/medium/14781.jpg"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": { "full": "Guilherme Briggs" },
|
||||
"image": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/staff/medium/n96099-n1wxTRslU9gj.jpg"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": { "full": "Yamil Atala" },
|
||||
"image": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/staff/medium/10028.jpg"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": { "full": "Genaro V\u00e1squez" },
|
||||
"image": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/staff/medium/n206333-oYkemxJhn4bk.png"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": { "full": "Jos\u00e9 Gilberto Vilchis" },
|
||||
"image": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/staff/medium/n105021-Bn6vy2ClY3uX.png"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"node": {
|
||||
"name": { "full": "Faye Valentine" },
|
||||
"gender": "Female",
|
||||
"dateOfBirth": { "year": 1994, "month": 8, "day": 14 },
|
||||
"age": "23 (Physical), 77 (Actual)",
|
||||
"image": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/character/medium/b2-0Iszg6Izgt4p.png"
|
||||
},
|
||||
"description": "One of the members of the bounty hunting crew in the anime series Cowboy Bebop. Often seen with a cigarette and in a revealing outfit complete with bright yellow hot pants and a matching, revealing top, black suspenders, white boots, and a long-sleeved red shirt worn normally through the sleeves, not to mention her signature headband, she is unusually attractive, sporting a bob of violet hair, green eyes, fair skin, and a voluptuous body. \n\nAlthough appearing to be no more than her 23 years alive suggests, Faye is actually upwards of 74-years-old, having been put into cryogenic freeze after a space shuttle accident. During the course of the series (set in 2071), Faye manages to cross paths with Spike and Jet twice before she finally makes herself at home aboard their ship the second time, much to the consternation and disapproval of the two men, both of whom have their own reservations about women in general. Faye herself is brash, egotistical, and quite lazy, despite taking plenty of time to pamper and care for her own appearance. Faye has also been placed under arrest several times in the series and spends much time in handcuffs on the ship. She, at times, expects the boys to take care of bounties for her, while she sits by idly to reap the benefits and eat all their food, another source of conflict. \n\nSeemingly little more than a thorn in her partners\u2019 sides, Faye is actually a well-rounded member of the team. She can handle herself exceptionally well for a woman of her slight appearance, displaying at least once in the series (in \"Cowboy Funk\") that she packs quite a mean punch. Adept at flying, Faye has stood her ground just as well as Spike has in an aerial dogfight in her ship Red Tail, at times even against Spike in an aerial dogfight. She also excels with guns, and is first seen in the series completely disabling a ship with a Heckler & Koch MP5, though she is immediately apprehended afterward. In the movie, she is seen with the same gun, in addition to her normal companion: a Glock 30. Where Faye really shines, however, is with her mouth. She has an almost unstoppable attitude, and even her sometimes innocent smile can be seen as dangerous. Sarcastic and presumptuous, she rarely appears weak or in need of support. She brags and takes care of herself, never trusting others, cheating and lying her way from one day to the next. \n\nShe is a woman who is skilled at getting what she wants; however, her indomitable exterior hides a more delicate interior. Upon awakening from her 54-year cryogenic sleep, not only was she saddled with a massive amount of debt that she had no means to pay, but she was also diagnosed with total amnesia, a stranger in a mysterious world that she was not a part of and did not understand, surrounded by people who claimed to be helping her but were only there to take advantage of her naivet\u00e9. The surname \"Valentine\" was merely a name given to her by the doctor who woke her; the circumstances of her accident, her previous life, and even her real name all remain a mystery, and are only gradually revealed as the series progresses. It has been hinted that she came from Singapore on Earth, and was the daughter of a very wealthy family, as the city's famous Merlion Statue features prominently in scenes of her childhood, and that memories and a film from her childhood showed her living in a large mansion. In an early episode, she states that she is descended from Roma people, but she may well have been lying. Utterly betrayed by someone she thought she could trust after waking, Faye found herself burdened with even more money to pay, and the situation resulted in the hardening of her personality to an extreme degree. She even says in Session 11: \u201cwe deceive or we are deceived\u201d, and that \u201cnothing good ever happened to me when I trusted others.\u201d \n\nThroughout the series, though she retains her sarcastic demeanor and unpleasant nature up until the very end, it is easy to see her grow as a character. She learns to value her comrades, coming back to the Bebop when she realizes that it is the only home that she has left, naming it as the \u201conly place I could return to\u201d. She grows to understand the disadvantages of being a loner, and that even though her \"family\" is somewhat dysfunctional it is still a place where she will always belong."
|
||||
},
|
||||
"voiceActors": [
|
||||
{
|
||||
"name": { "full": "Megumi Hayashibara" },
|
||||
"image": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/staff/medium/n95014-VqxNuufY94V3.png"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": { "full": "Wendee Lee" },
|
||||
"image": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/staff/medium/n95036-UkyIYVtEhoPk.png"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": { "full": "Barbara De Bortoli" },
|
||||
"image": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/staff/medium/n95763-Ci0xdLc6Z3a0.jpg"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": { "full": "Barbara Szit\u00e1s" },
|
||||
"image": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/staff/medium/7828.jpg"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": { "full": "Antje von der Ahe" },
|
||||
"image": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/staff/medium/8549.jpg"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": { "full": "Mi Sook Jeong" },
|
||||
"image": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/staff/medium/8812.jpg"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": { "full": "Carmen Ambr\u00f3s" },
|
||||
"image": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/staff/medium/default.jpg"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": { "full": "B\u00e9rang\u00e8re Jean" },
|
||||
"image": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/staff/medium/n163357-UI9zFTe0wI6y.png"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": { "full": "Miriam Ficher" },
|
||||
"image": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/staff/medium/540.jpg"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": { "full": "Elsa Covi\u00e1n" },
|
||||
"image": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/staff/medium/n153194-gLoOTnSq8k6H.jpg"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": { "full": "Karla Falc\u00f3n" },
|
||||
"image": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/staff/medium/n181977-cMmWSouBCpJN.png"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"node": {
|
||||
"name": { "full": "Edward Wong Hau Pepelu Tivrusky IV" },
|
||||
"gender": "Female",
|
||||
"dateOfBirth": { "year": 2058, "month": 1, "day": 1 },
|
||||
"age": "~13",
|
||||
"image": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/character/medium/b16-80wd87nl1Rue.png"
|
||||
},
|
||||
"description": "Ed is an eccentric, resourceful, childlike, tomboyish, and intelligent teenager. Ed first encounters the Bebop and its crew when she hacks the ship on its way to Earth. After Ed helps the Bebop crew cash in the Earth hacker bounty, she insists on joining the crew. When Faye tries to leave Earth without her, Ed hacks the Bebop and holds it hostage until she is permitted to join.\n\n~!\nLater in the story when the Bebop is back on Earth, the crew stumbles across an orphanage that Ed used to live in. After seeing some old friends there, Ed is informed that her father has come looking for her recently. Ed decides to make up a bounty on her father to convince Spike to find him. When Spike finds him, Ed decides to leave the Bebop with Ein to live with her father on Earth.!~"
|
||||
},
|
||||
"voiceActors": [
|
||||
{
|
||||
"name": { "full": "Melissa Fahn" },
|
||||
"image": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/staff/medium/n95452-ID2nbW1E8fLk.png"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": { "full": "Aoi Tada" },
|
||||
"image": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/staff/medium/n95658-paHKYOWkhoOd.png"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": { "full": "Isabel Marti\u00f1\u00f3n" },
|
||||
"image": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/staff/medium/1686.jpg"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": { "full": "Ilona Brokowski" },
|
||||
"image": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/staff/medium/6138.jpg"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": { "full": "Patricia Legrand" },
|
||||
"image": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/staff/medium/7223.jpg"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": { "full": "Jeong-Hwa Yang" },
|
||||
"image": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/staff/medium/14755.jpg"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": { "full": "Gemma Donati" },
|
||||
"image": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/staff/medium/default.jpg"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": { "full": "Leticia Celini" },
|
||||
"image": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/staff/medium/n180473-RxcWwuazq2t5.png"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"node": {
|
||||
"name": { "full": "Jet Black" },
|
||||
"gender": "Male",
|
||||
"dateOfBirth": { "year": 2035, "month": 12, "day": 3 },
|
||||
"age": "36",
|
||||
"image": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/character/medium/b3-JjH9Si9UM1NZ.png"
|
||||
},
|
||||
"description": "Jet, known on his home satellite as the \"Black Dog\" for his tenacity, is a 36-year-old former cop from Ganymede (a Jovian satellite) and acts as Spike's foil during the series. Physically, Jet is very tall with a muscular build. He wears a beard with no mustache, and is completely bald save for the back of his head. Spike acts lazy and uninterested, whereas Jet is hard working and a jack-of-all-trades. Jet was once an investigator in the Inter Solar System Police (ISSP) for many years until he lost his arm in an investigation that went awry when his corrupt partner (and friend at the time) betrayed him. His arm was replaced with a cybernetic limb (later revealed to be by choice, as biological replacements were possible, he wanted the fake arm as a reminder of what happened), yet his loss of limb coupled with the general corruption of the police force prompted Jet to quit the ISSP in disgust and become a freelance bounty hunter. Jet also considers himself something of a renaissance man: he cultivates bonsai trees, cooks, enjoys jazz/blues music (he named his ship the Bebop, referring to a type of jazz), especially Charlie Parker, and even has interest in Goethe. As a character, Jet is the quintessential oyaji or \"dad\" even though he often wishes people would view him as a more brotherly figure (so as not to seem old). Jet is skilled with handguns, typically carrying a pre-2004 Walther P99, as well as the use of the netgun. He is good with hand to hand combat as well. Unlike Spike, Jet tends to use more raw muscle than technique. He is also a great mechanic and pilot. Aside from the converted interplanetary fishing trawler vessel Bebop, Jet flies a smaller ship called Hammerhead. The Hammerhead appears to be a modified (Jet added larger engines and fuel tanks) salvage-craft that uses a mechanical arm equipped with a harpoon as its main weapon, which is somewhat analogous to his own mechanical arm. Both the Hammerhead and the Bebop are able to land on water, and have a fishing theme, most likely because Ganymede's surface is mostly covered with water (it is later revealed that the Bebop was originally a fishing ship that Jet \"customized\" with larger engines). ~!During the series, it is revealed that Jet once lived with a woman named Alisa, who left him because he was too controlling. Later they meet up again when Alisa's new boyfriend Rhint is wanted for murder. Jet then ends up in a situation somewhat similar to that of Vicious, where he must hunt down a woman who broke his heart, and her lover. In a later episode, another Vicious/Spike parallel is set up when Jet finds out that it was his old partner Fad who betrayed him (though in Jet's case, there was no love affair involved). Fad arranged for Jet's death in a setup, but he survived with only a missing arm and a scar on his face. It is worth noting that Jet managed to face the demons of his past and let them go, in contrast to Spike, who was killed when he confronted his. This is likely due to the contrast in the two approaches to the past. While Spike hid and fled from his past, Jet tracked it down and confronted it.!~"
|
||||
},
|
||||
"voiceActors": [
|
||||
{
|
||||
"name": { "full": "Unshou Ishizuka" },
|
||||
"image": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/staff/medium/n95357-umndcceko65h.png"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": { "full": "Beau Billingslea" },
|
||||
"image": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/staff/medium/n95358-WswC6Q3j7dnB.jpg"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": { "full": "Philippe Roullier" },
|
||||
"image": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/staff/medium/9256.jpg"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": { "full": "Alfonso Ram\u00edrez" },
|
||||
"image": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/staff/medium/n105030-gxZbxXNbufOh.jpg"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": { "full": "Gi hyeon Kim" },
|
||||
"image": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/staff/medium/14779.jpg"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": { "full": "Karl Schulz" },
|
||||
"image": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/staff/medium/default.jpg"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": { "full": "Nino Prester" },
|
||||
"image": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/staff/medium/default.jpg"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": { "full": "Mauro Ramos" },
|
||||
"image": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/staff/medium/n180569-d5ctTE6UNLfi.jpg"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": { "full": "Ricardo Tejedo" },
|
||||
"image": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/staff/medium/n182551-z5pxnDy9L0DJ.jpg"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"node": {
|
||||
"name": { "full": "Ein" },
|
||||
"gender": null,
|
||||
"dateOfBirth": { "year": null, "month": null, "day": null },
|
||||
"age": null,
|
||||
"image": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/character/medium/4.jpg"
|
||||
},
|
||||
"description": "Ein is a Pembroke Welsh Corgi brought aboard the Bebop by Spike after a failed attempt to capture a bounty. Ein is a \"data dog\": while the televised series only briefly hints on the fact that this means Ein's brain was somehow enhanced drastically, the manga shows Ed accessing data stored in Ein's brain via a virtual reality-type interface with which she has a conversation with a human proprietor. It is obvious that Ein is abnormally intelligent, as he is able to answer the telephone, drive a car (just the wheel), use the SSW, play sh\u014dgi, and generally do a number of other things that an average canine should not be able to do, but he never talks in a human language during the show. He does, however, speak in Session 18 \"Speak Like A Child\" after the credits Ein tells Spike \"Next Episode: Wild Horses\". He is able to \"speak\" to other species, as demonstrated in Session 17, \"Mushroom Samba\" (he spoke to a cow with a subtitled bark of \"Thanks\", to which the cow has a subtitled moo back of \"No problem\"). It is likely that Ed is the only crew member with any idea of Ein's capabilities, as the other crew members are quick to dismiss Ein, and never seem to acknowledge him as more than a pet. Ein initially takes a shine to Jet, but when Ed joins the crew, he comes around to her as well. Frequently the two trade roles, with Ein expressing very human sentiments via facial expression and Ed regressing to a feral state. He went with Ed after she left the crew, probably because of his attachment to her. His name is a pun on the Japanese word for \"dog\" (\u72ac inu) but is also German for \"one\". \"Ein\" may also be short for \"Einstein\", after Albert Einstein, because of the extraordinary intelligence he possesses."
|
||||
},
|
||||
"voiceActors": [
|
||||
{
|
||||
"name": { "full": "Kouichi Yamadera" },
|
||||
"image": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/staff/medium/n95011-2RfLzncNyvbR.png"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": { "full": "Jonatas Carmona" },
|
||||
"image": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/staff/medium/n231351-hjXONdRlwtsG.jpg"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"node": {
|
||||
"name": { "full": "Vicious" },
|
||||
"gender": "Male",
|
||||
"dateOfBirth": { "year": null, "month": null, "day": null },
|
||||
"age": null,
|
||||
"image": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/character/medium/b2734-aglO8RKNVxnn.jpg"
|
||||
},
|
||||
"description": "It's all in the name with Vicious: he is ruthless, bloodthirsty, cunning and ambitious, willing to do anything in order to secure a position of power. He is a member of the Red Dragon Crime Syndicate in Tharsis, and is often referred to or depicted as a venomous snake. His weapon of choice is not a firearm, but a katana which he wields skillfully, even against gun-wielders. \n\n~!After Spike's supposed death, Vicious also leaves the Red Dragons briefly to fight in the Titan War of 2068 although his precise motivations for enlisting are debated.!~"
|
||||
},
|
||||
"voiceActors": [
|
||||
{
|
||||
"name": { "full": "Norio Wakamoto" },
|
||||
"image": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/staff/medium/n95084-RTrZSU38POPF.png"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": { "full": "Skip Stellrecht" },
|
||||
"image": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/staff/medium/384.jpg"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": { "full": "Roberto Chevalier" },
|
||||
"image": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/staff/medium/1266.jpg"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": { "full": "Szabolcs P\u00e1lmai" },
|
||||
"image": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/staff/medium/7814.jpg"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": { "full": "Marcos Pati\u00f1o" },
|
||||
"image": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/staff/medium/n105020-ZpspJDXu5iTS.png"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": { "full": "Andreas Hosang" },
|
||||
"image": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/staff/medium/default.jpg"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": { "full": "Jacques Albaret" },
|
||||
"image": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/staff/medium/n113869-wF45sVu1JAxR.jpg"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": { "full": "William Viana" },
|
||||
"image": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/staff/medium/n153462-TiLeyrUYBRTa.jpg"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": { "full": "Rafael Pacheco" },
|
||||
"image": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/staff/medium/n182222-0Fz9qcwIYdVr.jpg"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": { "full": "Andr\u00e9s Guti\u00e9rrez Coto" },
|
||||
"image": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/staff/medium/n108301-MdWBMH4h79NP.png"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"node": {
|
||||
"name": { "full": "Grencia Mars Elijah Guo Eckener" },
|
||||
"gender": null,
|
||||
"dateOfBirth": { "year": null, "month": null, "day": null },
|
||||
"age": null,
|
||||
"image": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/character/medium/b2736-0Eoluq9UxXu4.png"
|
||||
},
|
||||
"description": "Gren was once a soldier for the war on Titan, and appears in the two-part episodes of 'Jupiter Jazz'. On Titan he fought beside Vicious, who he admired and found encouragement in, during the war. After the war, Gren came back hoping to be a jazz musician, but that plan was cut short when he was arrested on the pretense of being a spy. In prison, Gren heard that Vicious testified against him; this and the isolation drove him mad. The prison used prisoners for drug experiments, and he was forced to become a test subject. (from Wikipedia) Height: 6ft 2 inches Age : 29 Weight : 172 pounds "
|
||||
},
|
||||
"voiceActors": [
|
||||
{
|
||||
"name": { "full": "Kenyuu Horiuchi" },
|
||||
"image": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/staff/medium/262.jpg"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": { "full": "Michael Gregory" },
|
||||
"image": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/staff/medium/668.jpg"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": { "full": "Seung jun Kim" },
|
||||
"image": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/staff/medium/14819.jpg"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": { "full": "Charles Rettinghaus" },
|
||||
"image": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/staff/medium/n156036-a3yI3vcZscWP.jpg"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": { "full": "Marcelo Campos" },
|
||||
"image": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/staff/medium/n96423-YaAvwaxG5fNk.jpg"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": { "full": "Luis Leonardo Su\u00e1rez" },
|
||||
"image": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/staff/medium/n182235-4nWPBHLcz65x.png"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": { "full": "Roberto Mendiola" },
|
||||
"image": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/staff/medium/n198310-yBOdbNEZylzU.png"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": { "full": "Vittorio De Angelis" },
|
||||
"image": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/staff/medium/n158538-6FsfCIOtHUzx.png"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"node": {
|
||||
"name": { "full": "Julia" },
|
||||
"gender": null,
|
||||
"dateOfBirth": { "year": null, "month": null, "day": null },
|
||||
"age": null,
|
||||
"image": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/character/medium/b2735-0NRiXHK4PSWs.png"
|
||||
},
|
||||
"description": "Julia is a beautiful and mysterious woman from both Spike and Vicious' pasts. A love triangle among the three caused Spike to leave the syndicate rather than challenge Vicious. Spike had wanted to take her with him when he left the syndicate, but she was blackmailed by Vicious into almost shooting Spike. Vicious found out they were planning to run away together and confronted Julia, telling her that she would have to kill Spike, or both of them would be killed. To protect not only herself but also the man she loved, she ran away, never meeting Spike at the cemetery as both of them had planned. (from Wikipedia)"
|
||||
},
|
||||
"voiceActors": [
|
||||
{
|
||||
"name": { "full": "Mary Elizabeth McGlynn" },
|
||||
"image": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/staff/medium/n95269-PhQ87wkVzLBb.jpg"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": { "full": "Gara Takashima" },
|
||||
"image": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/staff/medium/n95497-ZisMmeLQfZr7.png"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": { "full": "Orsolya Ol\u00e1h" },
|
||||
"image": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/staff/medium/default.jpg"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": { "full": "Susan Sindberg" },
|
||||
"image": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/staff/medium/n104747-3HN1vSuPSlEb.jpg"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": { "full": "Dulce Guerrero" },
|
||||
"image": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/staff/medium/n106424-aHMqVAmkh5OD.png"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": { "full": "Anke Reitzenstein" },
|
||||
"image": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/staff/medium/default.jpg"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": { "full": "Eleonora De Angelis" },
|
||||
"image": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/staff/medium/n157374-iq3dNBXijHRy.jpg"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": { "full": "Let\u00edcia Quinto" },
|
||||
"image": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/staff/medium/n100136-x5kzXdgnFpS2.jpg"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"node": {
|
||||
"name": { "full": "Judy" },
|
||||
"gender": null,
|
||||
"dateOfBirth": { "year": null, "month": null, "day": null },
|
||||
"age": null,
|
||||
"image": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/character/medium/b6694-y0PmKzrcVa7A.png"
|
||||
},
|
||||
"description": "Co-hosts the TV show Big Shot along with Punch. The show features the duo in western attire and provides information on popular Bounty Heads throughout the star system. Judy acts like a stereotypical dumb-blonde, and wears a very revealing outfit. After Punch announces that the show has been cancelled, Judy reacts violently and exclaims that "The station will hear from her agent about this!" Later, it is revealed that she is engaged to be married to her agent."
|
||||
},
|
||||
"voiceActors": [
|
||||
{
|
||||
"name": { "full": "Miki Nagasawa" },
|
||||
"image": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/staff/medium/n95209-9RHgLGkMrska.png"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": { "full": "Lia Sargent" },
|
||||
"image": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/staff/medium/835.jpg"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": { "full": "Rossella Acerbo" },
|
||||
"image": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/staff/medium/1677.jpg"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": { "full": "Angela Ringer" },
|
||||
"image": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/staff/medium/default.jpg"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": { "full": "Susan Sindberg" },
|
||||
"image": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/staff/medium/n104747-3HN1vSuPSlEb.jpg"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": { "full": "Cec\u00edlia Lemes" },
|
||||
"image": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/staff/medium/12095.jpg"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": { "full": "Alicia Barrag\u00e1n" },
|
||||
"image": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/staff/medium/n182221-N9LZsRKJBTCd.jpg"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": { "full": "Monserrat Mendoza" },
|
||||
"image": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/staff/medium/n139011-PtSpM8k7zwlf.png"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"node": {
|
||||
"name": { "full": "Andy Von de Oniyate" },
|
||||
"gender": null,
|
||||
"dateOfBirth": { "year": null, "month": null, "day": null },
|
||||
"age": null,
|
||||
"image": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/character/medium/b23740-NCE7b9okKmeI.png"
|
||||
},
|
||||
"description": "Andy is a hunter who went after a criminal called Teddy Bomber whom he thought to be Spike. He is always with his mare, Onyx. He's a member of YMCA, Young Man's Cowboy Association. After fighting and losing he gives his cowboy title to Spike and turns into a samurai."
|
||||
},
|
||||
"voiceActors": [
|
||||
{
|
||||
"name": { "full": "Masashi Ebara" },
|
||||
"image": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/staff/medium/n95179-ZXxATX9muGcD.png"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": { "full": "Daran Norris" },
|
||||
"image": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/staff/medium/n95719-xM38IFuIRqgv.jpg"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": { "full": "N\u00e1ndor Holl" },
|
||||
"image": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/staff/medium/7786.jpg"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": { "full": "Constantin Pappas" },
|
||||
"image": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/staff/medium/n154153-y6Y8JWyyPnBG.png"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": { "full": "Marco Ant\u00f4nio Costa" },
|
||||
"image": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/staff/medium/n191888-8c9SpkajaMmq.png"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": { "full": "Idzi Dutkiewicz" },
|
||||
"image": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/staff/medium/n108299-vems5azPxtU5.png"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": { "full": "Ulises Zavala" },
|
||||
"image": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/staff/medium/n232410-ZNSOyFA2EHO7.png"
|
||||
}
|
||||
},
|
||||
{
|
||||
"name": { "full": "Sandro Acerbo" },
|
||||
"image": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/staff/medium/1096.jpg"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
"studios": {
|
||||
"nodes": [
|
||||
{ "name": "Sunrise", "isAnimationStudio": true },
|
||||
{ "name": "Bandai Visual", "isAnimationStudio": false },
|
||||
{ "name": "Bandai Entertainment", "isAnimationStudio": false }
|
||||
]
|
||||
},
|
||||
"season": "SPRING",
|
||||
"format": "TV",
|
||||
"status": "FINISHED",
|
||||
"seasonYear": 1998,
|
||||
"description": "Enter a world in the distant future, where Bounty Hunters roam the solar system. Spike and Jet, bounty hunting partners, set out on journeys in an ever struggling effort to win bounty rewards to survive.<br><br>\nWhile traveling, they meet up with other very interesting people. Could Faye, the beautiful and ridiculously poor gambler, Edward, the computer genius, and Ein, the engineered dog be a good addition to the group?",
|
||||
"genres": ["Action", "Adventure", "Drama", "Sci-Fi"],
|
||||
"synonyms": [
|
||||
"\uce74\uc6b0\ubcf4\uc774 \ube44\ubc25",
|
||||
"\u05e7\u05d0\u05d5\u05d1\u05d5\u05d9 \u05d1\u05d9\u05d1\u05d5\u05e4",
|
||||
"\u0e04\u0e32\u0e27\u0e1a\u0e2d\u0e22 \u0e1a\u0e35\u0e1a\u0e4a\u0e2d\u0e1b",
|
||||
"\u041a\u043e\u0432\u0431\u043e\u0439 \u0411\u0438\u0431\u043e\u043f",
|
||||
"\u039a\u03b1\u03bf\u03c5\u03bc\u03c0\u03cc\u03b7\u03b4\u03b5\u03c2 \u03c4\u03bf\u03c5 \u0394\u03b9\u03b1\u03c3\u03c4\u03ae\u03bc\u03b1\u03c4\u03bf\u03c2",
|
||||
"Kowboj Bebop"
|
||||
],
|
||||
"startDate": { "year": 1998, "month": 4, "day": 3 },
|
||||
"endDate": { "year": 1999, "month": 4, "day": 24 },
|
||||
"duration": 24,
|
||||
"countryOfOrigin": "JP",
|
||||
"averageScore": 86,
|
||||
"source": "ORIGINAL",
|
||||
"hashtag": null,
|
||||
"siteUrl": "https://anilist.co/anime/1",
|
||||
"nextAiringEpisode": null,
|
||||
"tags": [
|
||||
{ "name": "Space", "rank": 94 },
|
||||
{ "name": "Crime", "rank": 92 },
|
||||
{ "name": "Episodic", "rank": 88 },
|
||||
{ "name": "Ensemble Cast", "rank": 86 },
|
||||
{ "name": "Primarily Adult Cast", "rank": 85 },
|
||||
{ "name": "Tragedy", "rank": 80 },
|
||||
{ "name": "Travel", "rank": 80 },
|
||||
{ "name": "Noir", "rank": 80 },
|
||||
{ "name": "Male Protagonist", "rank": 78 },
|
||||
{ "name": "Guns", "rank": 78 },
|
||||
{ "name": "Cyberpunk", "rank": 77 },
|
||||
{ "name": "Philosophy", "rank": 72 },
|
||||
{ "name": "Tomboy", "rank": 71 },
|
||||
{ "name": "Martial Arts", "rank": 67 },
|
||||
{ "name": "Terrorism", "rank": 66 },
|
||||
{ "name": "Anti-Hero", "rank": 64 },
|
||||
{ "name": "Found Family", "rank": 60 },
|
||||
{ "name": "Amnesia", "rank": 60 },
|
||||
{ "name": "Cyborg", "rank": 58 },
|
||||
{ "name": "Gambling", "rank": 57 },
|
||||
{ "name": "Yakuza", "rank": 50 },
|
||||
{ "name": "Drugs", "rank": 49 },
|
||||
{ "name": "Cult", "rank": 42 },
|
||||
{ "name": "Police", "rank": 37 },
|
||||
{ "name": "Tanned Skin", "rank": 35 },
|
||||
{ "name": "Nudity", "rank": 30 },
|
||||
{ "name": "Circus", "rank": 10 }
|
||||
],
|
||||
"reviews": {
|
||||
"nodes": [
|
||||
{
|
||||
"summary": "I think it's time we blow this scene, get everybody and the stuff together... okay, three, two, one, let's jam.",
|
||||
"user": {
|
||||
"name": "Pursueth",
|
||||
"avatar": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/user/avatar/medium/b5984516-vVhftslD3YbM.jpg"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"summary": "Been carrying the weight for two years now. Truly my favorite anime.",
|
||||
"user": {
|
||||
"name": "honkytonkwomen",
|
||||
"avatar": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/user/avatar/medium/b5382323-LaMixPweP4eB.jpg"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"summary": "Okay, 3, 2, 1 let's jam",
|
||||
"user": {
|
||||
"name": "TheRealKyuubey",
|
||||
"avatar": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/user/avatar/medium/b173334-U6tLWQoaepDP.png"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"summary": "Cowboy Bebop: A Timeless Journey Through Space and Jazz",
|
||||
"user": {
|
||||
"name": "3dnane",
|
||||
"avatar": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/user/avatar/medium/b6497672-U4Ljca8ZT4bn.jpg"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"summary": "A story from the past that teaches us to look to the future",
|
||||
"user": {
|
||||
"name": "Arikarikita",
|
||||
"avatar": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/user/avatar/medium/b883323-qLr1bYr6GGhv.png"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"summary": "Cowboy Bebop was a bet.",
|
||||
"user": {
|
||||
"name": "paradigm",
|
||||
"avatar": {
|
||||
"medium": "https://s4.anilist.co/file/anilistcdn/user/avatar/medium/b211063-M7bZqsY3D98s.png"
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"recommendations": {
|
||||
"nodes": [
|
||||
{
|
||||
"mediaRecommendation": {
|
||||
"title": {
|
||||
"romaji": "Samurai Champloo",
|
||||
"english": "Samurai Champloo"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"mediaRecommendation": {
|
||||
"title": { "romaji": "TRIGUN", "english": "Trigun" }
|
||||
}
|
||||
},
|
||||
{
|
||||
"mediaRecommendation": {
|
||||
"title": {
|
||||
"romaji": "GREAT PRETENDER",
|
||||
"english": "Great Pretender"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"mediaRecommendation": {
|
||||
"title": {
|
||||
"romaji": "Space\u2606Dandy",
|
||||
"english": "Space Dandy"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"mediaRecommendation": {
|
||||
"title": {
|
||||
"romaji": "BLACK LAGOON",
|
||||
"english": "Black Lagoon"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"mediaRecommendation": {
|
||||
"title": { "romaji": "Baccano!", "english": "Baccano!" }
|
||||
}
|
||||
},
|
||||
{
|
||||
"mediaRecommendation": {
|
||||
"title": {
|
||||
"romaji": "Michiko to Hatchin",
|
||||
"english": "Michiko & Hatchin"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"mediaRecommendation": {
|
||||
"title": { "romaji": "Lupin III", "english": "Lupin the 3rd" }
|
||||
}
|
||||
},
|
||||
{
|
||||
"mediaRecommendation": {
|
||||
"title": {
|
||||
"romaji": "Koukaku Kidoutai: STAND ALONE COMPLEX",
|
||||
"english": "Ghost in the Shell: Stand Alone Complex"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"mediaRecommendation": {
|
||||
"title": {
|
||||
"romaji": "Seihou Bukyou Outlaw Star",
|
||||
"english": "Outlaw Star"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"mediaRecommendation": {
|
||||
"title": {
|
||||
"romaji": "TRIGUN STAMPEDE",
|
||||
"english": "TRIGUN STAMPEDE"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"mediaRecommendation": {
|
||||
"title": {
|
||||
"romaji": "Shin Seiki Evangelion",
|
||||
"english": "Neon Genesis Evangelion"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"mediaRecommendation": {
|
||||
"title": {
|
||||
"romaji": "Cyberpunk: Edgerunners",
|
||||
"english": "Cyberpunk: Edgerunners"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"mediaRecommendation": {
|
||||
"title": {
|
||||
"romaji": "Kekkai Sensen",
|
||||
"english": "Blood Blockade Battlefront"
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
"mediaRecommendation": {
|
||||
"title": { "romaji": "THE Big O", "english": "The Big O" }
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"relations": {
|
||||
"nodes": [
|
||||
{
|
||||
"title": {
|
||||
"romaji": "Cowboy Bebop: Tengoku no Tobira",
|
||||
"english": "Cowboy Bebop: The Movie - Knockin' on Heaven's Door",
|
||||
"native": "\u30ab\u30a6\u30dc\u30fc\u30a4\u30d3\u30d0\u30c3\u30d7\u5929\u56fd\u306e\u6249"
|
||||
}
|
||||
},
|
||||
{
|
||||
"title": {
|
||||
"romaji": "Cowboy Bebop: Ein no Natsuyasumi",
|
||||
"english": "Ein's Summer Vacation",
|
||||
"native": "\u30a2\u30a4\u30f3\u306e\u306a\u3064\u3084\u3059\u307f"
|
||||
}
|
||||
},
|
||||
{
|
||||
"title": {
|
||||
"romaji": "Cowboy Bebop",
|
||||
"english": "Cowboy Bebop",
|
||||
"native": "\u30ab\u30a6\u30dc\u30fc\u30a4\u30d3\u30d0\u30c3\u30d7"
|
||||
}
|
||||
},
|
||||
{
|
||||
"title": {
|
||||
"romaji": "Shooting Star Bebop: Cowboy Bebop",
|
||||
"english": "Cowboy Bebop Shooting Star",
|
||||
"native": "\u30b7\u30e5\u30fc\u30c6\u30a3\u30f3\u30b0\u30b9\u30bf\u30fc\u30d3\u30d0\u30c3\u30d7 \u30ab\u30a6\u30dc\u30fc\u30a4\u30d3\u30d0\u30c3\u30d7"
|
||||
}
|
||||
},
|
||||
{
|
||||
"title": {
|
||||
"romaji": "Cowboy Bebop: Yoseatsume Blues",
|
||||
"english": null,
|
||||
"native": "\u30ab\u30a6\u30dc\u30fc\u30a4\u30d3\u30d0\u30c3\u30d7 \u3088\u305b\u3042\u3064\u3081\u30d6\u30eb\u30fc\u30b9"
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
"externalLinks": [
|
||||
{
|
||||
"url": "http://www.hulu.com/cowboy-bebop",
|
||||
"site": "Hulu",
|
||||
"icon": "https://s4.anilist.co/file/anilistcdn/link/icon/7-rM06PQyWONGC.png"
|
||||
},
|
||||
{
|
||||
"url": "http://www.crunchyroll.com/cowboy-bebop",
|
||||
"site": "Crunchyroll",
|
||||
"icon": "https://s4.anilist.co/file/anilistcdn/link/icon/5-AWN2pVlluCOO.png"
|
||||
},
|
||||
{
|
||||
"url": "https://www.amazon.com/gp/video/detail/B00R2KO8ZE/",
|
||||
"site": "Amazon Prime Video",
|
||||
"icon": "https://s4.anilist.co/file/anilistcdn/link/icon/21-bDoNIomehkOx.png"
|
||||
},
|
||||
{
|
||||
"url": "https://tubitv.com/series/2052",
|
||||
"site": "Tubi TV",
|
||||
"icon": "https://s4.anilist.co/file/anilistcdn/link/icon/30-H2h0Fxnog1Pr.png"
|
||||
},
|
||||
{
|
||||
"url": "https://www.adultswim.com/videos/cowboy-bebop",
|
||||
"site": "Adult Swim",
|
||||
"icon": "https://s4.anilist.co/file/anilistcdn/link/icon/28-W1L8AHW0O4xE.png"
|
||||
},
|
||||
{
|
||||
"url": "https://www.netflix.com/title/80001305",
|
||||
"site": "Netflix",
|
||||
"icon": "https://s4.anilist.co/file/anilistcdn/link/icon/10-rVGPom8RCiwH.png"
|
||||
},
|
||||
{
|
||||
"url": "https://cowboy-bebop.net/",
|
||||
"site": "Official Site",
|
||||
"icon": null
|
||||
}
|
||||
],
|
||||
"rankings": [
|
||||
{ "rank": 44, "context": "highest rated all time" },
|
||||
{ "rank": 54, "context": "most popular all time" },
|
||||
{ "rank": 1, "context": "highest rated" },
|
||||
{ "rank": 1, "context": "most popular" }
|
||||
],
|
||||
"bannerImage": "https://s4.anilist.co/file/anilistcdn/media/anime/banner/1-OquNCNB6srGe.jpg"
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -9,7 +9,8 @@ from .queries_graphql import (
|
||||
anime_characters_query,
|
||||
anime_relations_query,
|
||||
airing_schedule_query,
|
||||
upcoming_anime_query
|
||||
upcoming_anime_query,
|
||||
anime_query
|
||||
)
|
||||
import requests
|
||||
# from kivy.network.urlrequest import UrlRequestRequests
|
||||
@@ -44,6 +45,7 @@ class AniList:
|
||||
averageScore_lesser:int|None=None,
|
||||
tag_in:list[str]|None=None,
|
||||
tag_not_in:list[str]|None=None,
|
||||
status:str|None = None,
|
||||
status_in:list[str]|None=None,
|
||||
status_not_in:list[str]|None=None,
|
||||
endDate_greater:int|None=None,
|
||||
@@ -60,6 +62,13 @@ class AniList:
|
||||
search_results = cls.get_data(search_query,variables=variables)
|
||||
return search_results
|
||||
|
||||
@classmethod
|
||||
def get_anime(cls,id:int)->tuple[bool,dict]:
|
||||
variables = {
|
||||
"id":id
|
||||
}
|
||||
return cls.get_data(anime_query,variables)
|
||||
|
||||
@classmethod
|
||||
def get_trending(cls)->tuple[bool,dict]:
|
||||
trending = cls.get_data(trending_query)
|
||||
@@ -125,10 +134,16 @@ if __name__ == "__main__":
|
||||
# data = AniList.get_trending()
|
||||
# data = AniList.get_most_scored()
|
||||
# term = input("enter term: ")
|
||||
data = AniList.search(query="Ninja")
|
||||
# data = AniList.search(query="Ninja")+
|
||||
# data = AniList.get_anime(1)
|
||||
data = AniList.search(query="one",status="RELEASING")
|
||||
print(data)
|
||||
# data = AniList.get_recommended_anime_for(21)
|
||||
# data = AniList.get_related_anime_for(21)
|
||||
# data = AniList.get_airing_schedule_for(21)
|
||||
# data = AniList.get_upcoming_anime(1)
|
||||
print(json.dumps(data,indent=4))
|
||||
pass
|
||||
if data[0]:
|
||||
with open("search.json","w") as file:
|
||||
json.dump(data[1],file)
|
||||
else:
|
||||
print(data)
|
||||
|
||||
@@ -6,6 +6,7 @@ $genre_not_in:[String],\
|
||||
$tag_in:[String],\
|
||||
$tag_not_in:[String],\
|
||||
$status_in:[MediaStatus],\
|
||||
$status:MediaStatus,\
|
||||
$status_not_in:[MediaStatus],\
|
||||
$popularity_greater:Int,\
|
||||
$popularity_lesser:Int,\
|
||||
@@ -20,10 +21,11 @@ $endDate_lesser:FuzzyDateInt\
|
||||
# MediaStatus = (FINISHED,RELEASING,NOT_YET_RELEASED,CANCELLED,HIATUS)
|
||||
search_query = """
|
||||
query($query:String,%s){
|
||||
Page(perPage:15,page:$page){
|
||||
Page(perPage:30,page:$page){
|
||||
pageInfo{
|
||||
total
|
||||
currentPage
|
||||
hasNextPage
|
||||
}
|
||||
media(
|
||||
search:$query,
|
||||
@@ -32,6 +34,7 @@ query($query:String,%s){
|
||||
tag_in:$tag_in,
|
||||
tag_not_in:$tag_not_in,
|
||||
status_in:$status_in,
|
||||
status:$status,
|
||||
status_not_in:$status_not_in,
|
||||
popularity_greater:$popularity_greater,
|
||||
popularity_lesser:$popularity_lesser,
|
||||
@@ -310,7 +313,7 @@ query{
|
||||
most_recently_updated_query = """
|
||||
query{
|
||||
Page(perPage:15){
|
||||
media(sort:UPDATED_AT_DESC,type:ANIME){
|
||||
media(sort:UPDATED_AT_DESC,type:ANIME,averageScore_greater:50){
|
||||
id
|
||||
title{
|
||||
romaji
|
||||
@@ -321,8 +324,7 @@ query{
|
||||
}
|
||||
trailer {
|
||||
site
|
||||
id
|
||||
|
||||
id
|
||||
}
|
||||
popularity
|
||||
favourites
|
||||
@@ -573,4 +575,131 @@ query ($page: Int) {
|
||||
}
|
||||
}
|
||||
"""
|
||||
|
||||
anime_query = """
|
||||
query($id:Int){
|
||||
Page{
|
||||
media(id:$id) {
|
||||
title {
|
||||
romaji
|
||||
english
|
||||
}
|
||||
nextAiringEpisode {
|
||||
timeUntilAiring
|
||||
airingAt
|
||||
episode
|
||||
}
|
||||
coverImage {
|
||||
extraLarge
|
||||
}
|
||||
characters(perPage: 5, sort: FAVOURITES_DESC) {
|
||||
edges {
|
||||
node {
|
||||
name {
|
||||
full
|
||||
|
||||
}
|
||||
gender
|
||||
dateOfBirth {
|
||||
year
|
||||
month
|
||||
day
|
||||
}
|
||||
age
|
||||
image {
|
||||
medium
|
||||
}
|
||||
description
|
||||
}
|
||||
voiceActors {
|
||||
name {
|
||||
full
|
||||
}
|
||||
image {
|
||||
medium
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
studios {
|
||||
nodes {
|
||||
name
|
||||
isAnimationStudio
|
||||
}
|
||||
}
|
||||
season
|
||||
format
|
||||
status
|
||||
seasonYear
|
||||
description
|
||||
genres
|
||||
synonyms
|
||||
startDate {
|
||||
year
|
||||
month
|
||||
day
|
||||
}
|
||||
endDate {
|
||||
year
|
||||
month
|
||||
day
|
||||
}
|
||||
duration
|
||||
countryOfOrigin
|
||||
averageScore
|
||||
popularity
|
||||
favourites
|
||||
source
|
||||
hashtag
|
||||
siteUrl
|
||||
tags {
|
||||
name
|
||||
rank
|
||||
}
|
||||
reviews(sort: SCORE_DESC, perPage: 3) {
|
||||
nodes {
|
||||
summary
|
||||
user {
|
||||
name
|
||||
avatar {
|
||||
medium
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
recommendations(sort: RATING_DESC, perPage: 10) {
|
||||
nodes {
|
||||
mediaRecommendation {
|
||||
title {
|
||||
romaji
|
||||
english
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
relations {
|
||||
nodes {
|
||||
title {
|
||||
romaji
|
||||
english
|
||||
native
|
||||
}
|
||||
}
|
||||
}
|
||||
externalLinks {
|
||||
url
|
||||
site
|
||||
icon
|
||||
}
|
||||
rankings {
|
||||
rank
|
||||
context
|
||||
}
|
||||
bannerImage
|
||||
episodes
|
||||
}
|
||||
}
|
||||
}
|
||||
"""
|
||||
|
||||
# print(search_query)
|
||||
Binary file not shown.
425
app/libs/animdl/a.json
Normal file
425
app/libs/animdl/a.json
Normal file
@@ -0,0 +1,425 @@
|
||||
[
|
||||
{
|
||||
"episode": 1,
|
||||
"streams": [
|
||||
{
|
||||
"quality": 2160,
|
||||
"stream_url": "https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/9v/lr/n230705er39jxogp0ap3b823gkkylr9v-1-281210110000.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806416&gen=playurlv2&os=akam&oi=2823883151&trid=cdad1de563c743629bdbef3a82d44df0i&mid=1715226141&platform=pc&upsig=cb00cb784589adbaceceb0fa139943fa&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806416~hmac=0fff2748095c5e0330934793408757d3f51ce260eff3d39b6b96e6dc51201cc8&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0",
|
||||
"audio_tracks": [
|
||||
"https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/9v/lr/n230705er39jxogp0ap3b823gkkylr9v-1-2d1301000023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806416&gen=playurlv2&os=akam&oi=2823883151&trid=cdad1de563c743629bdbef3a82d44df0i&mid=1715226141&platform=pc&upsig=419c3e929cd04770d08cb0eb8f95470d&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806416~hmac=93ee08fbb96878bc55af2ed52bf9d176d96d93656ff865d59ed817bb04ecdedc&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0",
|
||||
"https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/9v/lr/n230705er39jxogp0ap3b823gkkylr9v-1-2c1301000023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806416&gen=playurlv2&os=akam&oi=2823883151&trid=cdad1de563c743629bdbef3a82d44df0i&mid=1715226141&platform=pc&upsig=81958d2e221d15d2c338619036f29c0e&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806416~hmac=bfcfa2cdb0b8deb5154d651a96ce22a6b4b0745d10b28fca87a6908328c5aa17&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0",
|
||||
"https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/9v/lr/n230705er39jxogp0ap3b823gkkylr9v-1-2a1301000023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806416&gen=playurlv2&os=akam&oi=2823883151&trid=cdad1de563c743629bdbef3a82d44df0i&mid=1715226141&platform=pc&upsig=d808b57371897bb4174112c3a53c6ed2&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806416~hmac=30bb7b24ea912715ec2e9e76dfbb7b2703a824389d867b78b472d2d555b94b0c&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0"
|
||||
],
|
||||
"subtitle": [
|
||||
"https://allanime.pro/apiak/sk.json?sub=dx-ep-LYKSutL2PaAjYyXWz_1_sub_English"
|
||||
]
|
||||
},
|
||||
{
|
||||
"quality": 1080,
|
||||
"stream_url": "https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/9v/lr/n230705er39jxogp0ap3b823gkkylr9v-1-261210110000.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806416&gen=playurlv2&os=akam&oi=2823883151&trid=cdad1de563c743629bdbef3a82d44df0i&mid=1715226141&platform=pc&upsig=02ff8e9f9060bc3437356a7cb6cc1ed1&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806416~hmac=836a02ef21ecc1a02034d7d10083bdf97103df2a586d8ba6009d8521abd855ac&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0",
|
||||
"audio_tracks": [
|
||||
"https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/9v/lr/n230705er39jxogp0ap3b823gkkylr9v-1-2d1301000023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806416&gen=playurlv2&os=akam&oi=2823883151&trid=cdad1de563c743629bdbef3a82d44df0i&mid=1715226141&platform=pc&upsig=419c3e929cd04770d08cb0eb8f95470d&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806416~hmac=93ee08fbb96878bc55af2ed52bf9d176d96d93656ff865d59ed817bb04ecdedc&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0",
|
||||
"https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/9v/lr/n230705er39jxogp0ap3b823gkkylr9v-1-2c1301000023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806416&gen=playurlv2&os=akam&oi=2823883151&trid=cdad1de563c743629bdbef3a82d44df0i&mid=1715226141&platform=pc&upsig=81958d2e221d15d2c338619036f29c0e&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806416~hmac=bfcfa2cdb0b8deb5154d651a96ce22a6b4b0745d10b28fca87a6908328c5aa17&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0",
|
||||
"https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/9v/lr/n230705er39jxogp0ap3b823gkkylr9v-1-2a1301000023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806416&gen=playurlv2&os=akam&oi=2823883151&trid=cdad1de563c743629bdbef3a82d44df0i&mid=1715226141&platform=pc&upsig=d808b57371897bb4174112c3a53c6ed2&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806416~hmac=30bb7b24ea912715ec2e9e76dfbb7b2703a824389d867b78b472d2d555b94b0c&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0"
|
||||
],
|
||||
"subtitle": [
|
||||
"https://allanime.pro/apiak/sk.json?sub=dx-ep-LYKSutL2PaAjYyXWz_1_sub_English"
|
||||
]
|
||||
},
|
||||
{
|
||||
"quality": 1080,
|
||||
"stream_url": "https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/9v/lr/n230705er39jxogp0ap3b823gkkylr9v-1-251210110000.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806416&gen=playurlv2&os=akam&oi=2823883151&trid=cdad1de563c743629bdbef3a82d44df0i&mid=1715226141&platform=pc&upsig=f99d431016260b0922d9020489ba7199&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806416~hmac=d94064afd352f39f9a57c1fe0b0c97eec231849dbdbcb0fdd070497cc5d86877&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0",
|
||||
"audio_tracks": [
|
||||
"https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/9v/lr/n230705er39jxogp0ap3b823gkkylr9v-1-2d1301000023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806416&gen=playurlv2&os=akam&oi=2823883151&trid=cdad1de563c743629bdbef3a82d44df0i&mid=1715226141&platform=pc&upsig=419c3e929cd04770d08cb0eb8f95470d&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806416~hmac=93ee08fbb96878bc55af2ed52bf9d176d96d93656ff865d59ed817bb04ecdedc&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0",
|
||||
"https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/9v/lr/n230705er39jxogp0ap3b823gkkylr9v-1-2c1301000023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806416&gen=playurlv2&os=akam&oi=2823883151&trid=cdad1de563c743629bdbef3a82d44df0i&mid=1715226141&platform=pc&upsig=81958d2e221d15d2c338619036f29c0e&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806416~hmac=bfcfa2cdb0b8deb5154d651a96ce22a6b4b0745d10b28fca87a6908328c5aa17&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0",
|
||||
"https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/9v/lr/n230705er39jxogp0ap3b823gkkylr9v-1-2a1301000023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806416&gen=playurlv2&os=akam&oi=2823883151&trid=cdad1de563c743629bdbef3a82d44df0i&mid=1715226141&platform=pc&upsig=d808b57371897bb4174112c3a53c6ed2&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806416~hmac=30bb7b24ea912715ec2e9e76dfbb7b2703a824389d867b78b472d2d555b94b0c&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0"
|
||||
],
|
||||
"subtitle": [
|
||||
"https://allanime.pro/apiak/sk.json?sub=dx-ep-LYKSutL2PaAjYyXWz_1_sub_English"
|
||||
]
|
||||
},
|
||||
{
|
||||
"quality": 720,
|
||||
"stream_url": "https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/9v/lr/n230705er39jxogp0ap3b823gkkylr9v-1-241210110000.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806416&gen=playurlv2&os=akam&oi=2823883151&trid=cdad1de563c743629bdbef3a82d44df0i&mid=1715226141&platform=pc&upsig=730fa341c3839f233e8a367d04c59306&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806416~hmac=7b2539b70f4a7f8c354e297a974a21fea81d571775c1a18dd754d4f58b061d90&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0",
|
||||
"audio_tracks": [
|
||||
"https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/9v/lr/n230705er39jxogp0ap3b823gkkylr9v-1-2d1301000023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806416&gen=playurlv2&os=akam&oi=2823883151&trid=cdad1de563c743629bdbef3a82d44df0i&mid=1715226141&platform=pc&upsig=419c3e929cd04770d08cb0eb8f95470d&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806416~hmac=93ee08fbb96878bc55af2ed52bf9d176d96d93656ff865d59ed817bb04ecdedc&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0",
|
||||
"https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/9v/lr/n230705er39jxogp0ap3b823gkkylr9v-1-2c1301000023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806416&gen=playurlv2&os=akam&oi=2823883151&trid=cdad1de563c743629bdbef3a82d44df0i&mid=1715226141&platform=pc&upsig=81958d2e221d15d2c338619036f29c0e&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806416~hmac=bfcfa2cdb0b8deb5154d651a96ce22a6b4b0745d10b28fca87a6908328c5aa17&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0",
|
||||
"https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/9v/lr/n230705er39jxogp0ap3b823gkkylr9v-1-2a1301000023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806416&gen=playurlv2&os=akam&oi=2823883151&trid=cdad1de563c743629bdbef3a82d44df0i&mid=1715226141&platform=pc&upsig=d808b57371897bb4174112c3a53c6ed2&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806416~hmac=30bb7b24ea912715ec2e9e76dfbb7b2703a824389d867b78b472d2d555b94b0c&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0"
|
||||
],
|
||||
"subtitle": [
|
||||
"https://allanime.pro/apiak/sk.json?sub=dx-ep-LYKSutL2PaAjYyXWz_1_sub_English"
|
||||
]
|
||||
},
|
||||
{
|
||||
"quality": 480,
|
||||
"stream_url": "https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/9v/lr/n230705er39jxogp0ap3b823gkkylr9v-1-231210110000.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806416&gen=playurlv2&os=akam&oi=2823883151&trid=cdad1de563c743629bdbef3a82d44df0i&mid=1715226141&platform=pc&upsig=a09b45f68cb418e807eeb090b23d510e&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806416~hmac=7da6b3ffe8d32c9495fb77af7b18b358d5d1eced6ced88c99312a38522e13340&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0",
|
||||
"audio_tracks": [
|
||||
"https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/9v/lr/n230705er39jxogp0ap3b823gkkylr9v-1-2d1301000023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806416&gen=playurlv2&os=akam&oi=2823883151&trid=cdad1de563c743629bdbef3a82d44df0i&mid=1715226141&platform=pc&upsig=419c3e929cd04770d08cb0eb8f95470d&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806416~hmac=93ee08fbb96878bc55af2ed52bf9d176d96d93656ff865d59ed817bb04ecdedc&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0",
|
||||
"https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/9v/lr/n230705er39jxogp0ap3b823gkkylr9v-1-2c1301000023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806416&gen=playurlv2&os=akam&oi=2823883151&trid=cdad1de563c743629bdbef3a82d44df0i&mid=1715226141&platform=pc&upsig=81958d2e221d15d2c338619036f29c0e&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806416~hmac=bfcfa2cdb0b8deb5154d651a96ce22a6b4b0745d10b28fca87a6908328c5aa17&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0",
|
||||
"https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/9v/lr/n230705er39jxogp0ap3b823gkkylr9v-1-2a1301000023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806416&gen=playurlv2&os=akam&oi=2823883151&trid=cdad1de563c743629bdbef3a82d44df0i&mid=1715226141&platform=pc&upsig=d808b57371897bb4174112c3a53c6ed2&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806416~hmac=30bb7b24ea912715ec2e9e76dfbb7b2703a824389d867b78b472d2d555b94b0c&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0"
|
||||
],
|
||||
"subtitle": [
|
||||
"https://allanime.pro/apiak/sk.json?sub=dx-ep-LYKSutL2PaAjYyXWz_1_sub_English"
|
||||
]
|
||||
},
|
||||
{
|
||||
"quality": 360,
|
||||
"stream_url": "https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/9v/lr/n230705er39jxogp0ap3b823gkkylr9v-1-211210110000.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806416&gen=playurlv2&os=akam&oi=2823883151&trid=cdad1de563c743629bdbef3a82d44df0i&mid=1715226141&platform=pc&upsig=9e17e8e2f788307cd6ab4208332c45b2&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806416~hmac=65ea6b54125595f8ebc55362d30b9367fac6517e2fe8b32aabb08ad0abfb5a8c&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0",
|
||||
"audio_tracks": [
|
||||
"https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/9v/lr/n230705er39jxogp0ap3b823gkkylr9v-1-2d1301000023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806416&gen=playurlv2&os=akam&oi=2823883151&trid=cdad1de563c743629bdbef3a82d44df0i&mid=1715226141&platform=pc&upsig=419c3e929cd04770d08cb0eb8f95470d&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806416~hmac=93ee08fbb96878bc55af2ed52bf9d176d96d93656ff865d59ed817bb04ecdedc&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0",
|
||||
"https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/9v/lr/n230705er39jxogp0ap3b823gkkylr9v-1-2c1301000023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806416&gen=playurlv2&os=akam&oi=2823883151&trid=cdad1de563c743629bdbef3a82d44df0i&mid=1715226141&platform=pc&upsig=81958d2e221d15d2c338619036f29c0e&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806416~hmac=bfcfa2cdb0b8deb5154d651a96ce22a6b4b0745d10b28fca87a6908328c5aa17&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0",
|
||||
"https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/9v/lr/n230705er39jxogp0ap3b823gkkylr9v-1-2a1301000023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806416&gen=playurlv2&os=akam&oi=2823883151&trid=cdad1de563c743629bdbef3a82d44df0i&mid=1715226141&platform=pc&upsig=d808b57371897bb4174112c3a53c6ed2&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806416~hmac=30bb7b24ea912715ec2e9e76dfbb7b2703a824389d867b78b472d2d555b94b0c&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0"
|
||||
],
|
||||
"subtitle": [
|
||||
"https://allanime.pro/apiak/sk.json?sub=dx-ep-LYKSutL2PaAjYyXWz_1_sub_English"
|
||||
]
|
||||
},
|
||||
{
|
||||
"quality": 240,
|
||||
"stream_url": "https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/9v/lr/n230705er39jxogp0ap3b823gkkylr9v-1-2e1210110000.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806416&gen=playurlv2&os=akam&oi=2823883151&trid=cdad1de563c743629bdbef3a82d44df0i&mid=1715226141&platform=pc&upsig=53991473cb3bce40502a72593be91b52&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806416~hmac=29e7fcc042beae346d067210649fc6d31e60b7d438bb00d9877ac4049ed7afd9&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0",
|
||||
"audio_tracks": [
|
||||
"https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/9v/lr/n230705er39jxogp0ap3b823gkkylr9v-1-2d1301000023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806416&gen=playurlv2&os=akam&oi=2823883151&trid=cdad1de563c743629bdbef3a82d44df0i&mid=1715226141&platform=pc&upsig=419c3e929cd04770d08cb0eb8f95470d&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806416~hmac=93ee08fbb96878bc55af2ed52bf9d176d96d93656ff865d59ed817bb04ecdedc&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0",
|
||||
"https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/9v/lr/n230705er39jxogp0ap3b823gkkylr9v-1-2c1301000023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806416&gen=playurlv2&os=akam&oi=2823883151&trid=cdad1de563c743629bdbef3a82d44df0i&mid=1715226141&platform=pc&upsig=81958d2e221d15d2c338619036f29c0e&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806416~hmac=bfcfa2cdb0b8deb5154d651a96ce22a6b4b0745d10b28fca87a6908328c5aa17&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0",
|
||||
"https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/9v/lr/n230705er39jxogp0ap3b823gkkylr9v-1-2a1301000023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806416&gen=playurlv2&os=akam&oi=2823883151&trid=cdad1de563c743629bdbef3a82d44df0i&mid=1715226141&platform=pc&upsig=d808b57371897bb4174112c3a53c6ed2&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806416~hmac=30bb7b24ea912715ec2e9e76dfbb7b2703a824389d867b78b472d2d555b94b0c&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0"
|
||||
],
|
||||
"subtitle": [
|
||||
"https://allanime.pro/apiak/sk.json?sub=dx-ep-LYKSutL2PaAjYyXWz_1_sub_English"
|
||||
]
|
||||
},
|
||||
{
|
||||
"quality": 144,
|
||||
"stream_url": "https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/9v/lr/n230705er39jxogp0ap3b823gkkylr9v-1-2f1210110000.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806416&gen=playurlv2&os=akam&oi=2823883151&trid=cdad1de563c743629bdbef3a82d44df0i&mid=1715226141&platform=pc&upsig=38d619a08803fbeae4ce516df0025aa3&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806416~hmac=d7abaf668ed19a948b6597721d47b5c69cae7aa3f7ae965121e07ee23b82ef3f&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0",
|
||||
"audio_tracks": [
|
||||
"https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/9v/lr/n230705er39jxogp0ap3b823gkkylr9v-1-2d1301000023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806416&gen=playurlv2&os=akam&oi=2823883151&trid=cdad1de563c743629bdbef3a82d44df0i&mid=1715226141&platform=pc&upsig=419c3e929cd04770d08cb0eb8f95470d&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806416~hmac=93ee08fbb96878bc55af2ed52bf9d176d96d93656ff865d59ed817bb04ecdedc&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0",
|
||||
"https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/9v/lr/n230705er39jxogp0ap3b823gkkylr9v-1-2c1301000023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806416&gen=playurlv2&os=akam&oi=2823883151&trid=cdad1de563c743629bdbef3a82d44df0i&mid=1715226141&platform=pc&upsig=81958d2e221d15d2c338619036f29c0e&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806416~hmac=bfcfa2cdb0b8deb5154d651a96ce22a6b4b0745d10b28fca87a6908328c5aa17&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0",
|
||||
"https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/9v/lr/n230705er39jxogp0ap3b823gkkylr9v-1-2a1301000023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806416&gen=playurlv2&os=akam&oi=2823883151&trid=cdad1de563c743629bdbef3a82d44df0i&mid=1715226141&platform=pc&upsig=d808b57371897bb4174112c3a53c6ed2&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806416~hmac=30bb7b24ea912715ec2e9e76dfbb7b2703a824389d867b78b472d2d555b94b0c&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0"
|
||||
],
|
||||
"subtitle": [
|
||||
"https://allanime.pro/apiak/sk.json?sub=dx-ep-LYKSutL2PaAjYyXWz_1_sub_English"
|
||||
]
|
||||
},
|
||||
{
|
||||
"quality": 2160,
|
||||
"stream_url": "https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/9v/lr/n230705er39jxogp0ap3b823gkkylr9v-1-281220110000.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806416&gen=playurlv2&os=akam&oi=2823883151&trid=0d3feddd596b49619e240c063f47de83i&mid=1715226141&platform=pc&upsig=83e007567b4a487687b013ee6179d405&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806416~hmac=59635b60fa44105a97b961210f58d8918e7269900cdda1e621b9e947e5d86c36&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0",
|
||||
"audio_tracks": [
|
||||
"https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/9v/lr/n230705er39jxogp0ap3b823gkkylr9v-1-2d1301000023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806416&gen=playurlv2&os=akam&oi=2823883151&trid=cdad1de563c743629bdbef3a82d44df0i&mid=1715226141&platform=pc&upsig=419c3e929cd04770d08cb0eb8f95470d&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806416~hmac=93ee08fbb96878bc55af2ed52bf9d176d96d93656ff865d59ed817bb04ecdedc&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0",
|
||||
"https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/9v/lr/n230705er39jxogp0ap3b823gkkylr9v-1-2c1301000023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806416&gen=playurlv2&os=akam&oi=2823883151&trid=cdad1de563c743629bdbef3a82d44df0i&mid=1715226141&platform=pc&upsig=81958d2e221d15d2c338619036f29c0e&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806416~hmac=bfcfa2cdb0b8deb5154d651a96ce22a6b4b0745d10b28fca87a6908328c5aa17&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0",
|
||||
"https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/9v/lr/n230705er39jxogp0ap3b823gkkylr9v-1-2a1301000023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806416&gen=playurlv2&os=akam&oi=2823883151&trid=cdad1de563c743629bdbef3a82d44df0i&mid=1715226141&platform=pc&upsig=d808b57371897bb4174112c3a53c6ed2&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806416~hmac=30bb7b24ea912715ec2e9e76dfbb7b2703a824389d867b78b472d2d555b94b0c&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0"
|
||||
],
|
||||
"subtitle": [
|
||||
"https://allanime.pro/apiak/sk.json?sub=dx-ep-LYKSutL2PaAjYyXWz_1_sub_English"
|
||||
]
|
||||
},
|
||||
{
|
||||
"quality": 1080,
|
||||
"stream_url": "https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/9v/lr/n230705er39jxogp0ap3b823gkkylr9v-1-261220110000.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806416&gen=playurlv2&os=akam&oi=2823883151&trid=0d3feddd596b49619e240c063f47de83i&mid=1715226141&platform=pc&upsig=5a765ca2a4bc69821cf8f13fe1864fb9&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806416~hmac=9fc3d5682ac7a4cdbe37dad60f49c3b6f53dc84979f2b71e5d1e0b4ca2784374&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0",
|
||||
"audio_tracks": [
|
||||
"https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/9v/lr/n230705er39jxogp0ap3b823gkkylr9v-1-2d1301000023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806416&gen=playurlv2&os=akam&oi=2823883151&trid=cdad1de563c743629bdbef3a82d44df0i&mid=1715226141&platform=pc&upsig=419c3e929cd04770d08cb0eb8f95470d&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806416~hmac=93ee08fbb96878bc55af2ed52bf9d176d96d93656ff865d59ed817bb04ecdedc&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0",
|
||||
"https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/9v/lr/n230705er39jxogp0ap3b823gkkylr9v-1-2c1301000023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806416&gen=playurlv2&os=akam&oi=2823883151&trid=cdad1de563c743629bdbef3a82d44df0i&mid=1715226141&platform=pc&upsig=81958d2e221d15d2c338619036f29c0e&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806416~hmac=bfcfa2cdb0b8deb5154d651a96ce22a6b4b0745d10b28fca87a6908328c5aa17&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0",
|
||||
"https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/9v/lr/n230705er39jxogp0ap3b823gkkylr9v-1-2a1301000023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806416&gen=playurlv2&os=akam&oi=2823883151&trid=cdad1de563c743629bdbef3a82d44df0i&mid=1715226141&platform=pc&upsig=d808b57371897bb4174112c3a53c6ed2&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806416~hmac=30bb7b24ea912715ec2e9e76dfbb7b2703a824389d867b78b472d2d555b94b0c&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0"
|
||||
],
|
||||
"subtitle": [
|
||||
"https://allanime.pro/apiak/sk.json?sub=dx-ep-LYKSutL2PaAjYyXWz_1_sub_English"
|
||||
]
|
||||
},
|
||||
{
|
||||
"quality": 1080,
|
||||
"stream_url": "https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/9v/lr/n230705er39jxogp0ap3b823gkkylr9v-1-251220110000.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806416&gen=playurlv2&os=akam&oi=2823883151&trid=0d3feddd596b49619e240c063f47de83i&mid=1715226141&platform=pc&upsig=d0c61918b0e282f76f736d1c736f9ec8&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806416~hmac=fdff82180978f3b07104033dddd2014f9a5e49f1124995f35cfcc29785abb570&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0",
|
||||
"audio_tracks": [
|
||||
"https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/9v/lr/n230705er39jxogp0ap3b823gkkylr9v-1-2d1301000023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806416&gen=playurlv2&os=akam&oi=2823883151&trid=cdad1de563c743629bdbef3a82d44df0i&mid=1715226141&platform=pc&upsig=419c3e929cd04770d08cb0eb8f95470d&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806416~hmac=93ee08fbb96878bc55af2ed52bf9d176d96d93656ff865d59ed817bb04ecdedc&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0",
|
||||
"https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/9v/lr/n230705er39jxogp0ap3b823gkkylr9v-1-2c1301000023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806416&gen=playurlv2&os=akam&oi=2823883151&trid=cdad1de563c743629bdbef3a82d44df0i&mid=1715226141&platform=pc&upsig=81958d2e221d15d2c338619036f29c0e&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806416~hmac=bfcfa2cdb0b8deb5154d651a96ce22a6b4b0745d10b28fca87a6908328c5aa17&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0",
|
||||
"https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/9v/lr/n230705er39jxogp0ap3b823gkkylr9v-1-2a1301000023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806416&gen=playurlv2&os=akam&oi=2823883151&trid=cdad1de563c743629bdbef3a82d44df0i&mid=1715226141&platform=pc&upsig=d808b57371897bb4174112c3a53c6ed2&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806416~hmac=30bb7b24ea912715ec2e9e76dfbb7b2703a824389d867b78b472d2d555b94b0c&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0"
|
||||
],
|
||||
"subtitle": [
|
||||
"https://allanime.pro/apiak/sk.json?sub=dx-ep-LYKSutL2PaAjYyXWz_1_sub_English"
|
||||
]
|
||||
},
|
||||
{
|
||||
"quality": 720,
|
||||
"stream_url": "https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/9v/lr/n230705er39jxogp0ap3b823gkkylr9v-1-241220110000.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806416&gen=playurlv2&os=akam&oi=2823883151&trid=0d3feddd596b49619e240c063f47de83i&mid=1715226141&platform=pc&upsig=d62ed27057c8b6a6bd9c3d5dfce6c244&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806416~hmac=2bbef8b303b91623bf8f4c7a822a6a732edddda155093e363608bbecea77f0d4&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0",
|
||||
"audio_tracks": [
|
||||
"https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/9v/lr/n230705er39jxogp0ap3b823gkkylr9v-1-2d1301000023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806416&gen=playurlv2&os=akam&oi=2823883151&trid=cdad1de563c743629bdbef3a82d44df0i&mid=1715226141&platform=pc&upsig=419c3e929cd04770d08cb0eb8f95470d&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806416~hmac=93ee08fbb96878bc55af2ed52bf9d176d96d93656ff865d59ed817bb04ecdedc&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0",
|
||||
"https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/9v/lr/n230705er39jxogp0ap3b823gkkylr9v-1-2c1301000023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806416&gen=playurlv2&os=akam&oi=2823883151&trid=cdad1de563c743629bdbef3a82d44df0i&mid=1715226141&platform=pc&upsig=81958d2e221d15d2c338619036f29c0e&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806416~hmac=bfcfa2cdb0b8deb5154d651a96ce22a6b4b0745d10b28fca87a6908328c5aa17&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0",
|
||||
"https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/9v/lr/n230705er39jxogp0ap3b823gkkylr9v-1-2a1301000023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806416&gen=playurlv2&os=akam&oi=2823883151&trid=cdad1de563c743629bdbef3a82d44df0i&mid=1715226141&platform=pc&upsig=d808b57371897bb4174112c3a53c6ed2&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806416~hmac=30bb7b24ea912715ec2e9e76dfbb7b2703a824389d867b78b472d2d555b94b0c&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0"
|
||||
],
|
||||
"subtitle": [
|
||||
"https://allanime.pro/apiak/sk.json?sub=dx-ep-LYKSutL2PaAjYyXWz_1_sub_English"
|
||||
]
|
||||
},
|
||||
{
|
||||
"quality": 480,
|
||||
"stream_url": "https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/9v/lr/n230705er39jxogp0ap3b823gkkylr9v-1-231220110000.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806416&gen=playurlv2&os=akam&oi=2823883151&trid=0d3feddd596b49619e240c063f47de83i&mid=1715226141&platform=pc&upsig=3f133a535a1f792e6f2344634d6ac519&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806416~hmac=0bd35aae28c3c0c8eb48f20e68958f7c95ec7be94db9da75ed3642569f3e18fb&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0",
|
||||
"audio_tracks": [
|
||||
"https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/9v/lr/n230705er39jxogp0ap3b823gkkylr9v-1-2d1301000023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806416&gen=playurlv2&os=akam&oi=2823883151&trid=cdad1de563c743629bdbef3a82d44df0i&mid=1715226141&platform=pc&upsig=419c3e929cd04770d08cb0eb8f95470d&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806416~hmac=93ee08fbb96878bc55af2ed52bf9d176d96d93656ff865d59ed817bb04ecdedc&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0",
|
||||
"https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/9v/lr/n230705er39jxogp0ap3b823gkkylr9v-1-2c1301000023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806416&gen=playurlv2&os=akam&oi=2823883151&trid=cdad1de563c743629bdbef3a82d44df0i&mid=1715226141&platform=pc&upsig=81958d2e221d15d2c338619036f29c0e&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806416~hmac=bfcfa2cdb0b8deb5154d651a96ce22a6b4b0745d10b28fca87a6908328c5aa17&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0",
|
||||
"https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/9v/lr/n230705er39jxogp0ap3b823gkkylr9v-1-2a1301000023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806416&gen=playurlv2&os=akam&oi=2823883151&trid=cdad1de563c743629bdbef3a82d44df0i&mid=1715226141&platform=pc&upsig=d808b57371897bb4174112c3a53c6ed2&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806416~hmac=30bb7b24ea912715ec2e9e76dfbb7b2703a824389d867b78b472d2d555b94b0c&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0"
|
||||
],
|
||||
"subtitle": [
|
||||
"https://allanime.pro/apiak/sk.json?sub=dx-ep-LYKSutL2PaAjYyXWz_1_sub_English"
|
||||
]
|
||||
},
|
||||
{
|
||||
"quality": 360,
|
||||
"stream_url": "https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/9v/lr/n230705er39jxogp0ap3b823gkkylr9v-1-211220110000.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806416&gen=playurlv2&os=akam&oi=2823883151&trid=0d3feddd596b49619e240c063f47de83i&mid=1715226141&platform=pc&upsig=9cc8f9105cf2b103498edcb0b598172b&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806416~hmac=c53f5655b975d10dc84e3e64d0a4cef05e28570eebb463d83fed2a3d8f9b7811&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0",
|
||||
"audio_tracks": [
|
||||
"https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/9v/lr/n230705er39jxogp0ap3b823gkkylr9v-1-2d1301000023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806416&gen=playurlv2&os=akam&oi=2823883151&trid=cdad1de563c743629bdbef3a82d44df0i&mid=1715226141&platform=pc&upsig=419c3e929cd04770d08cb0eb8f95470d&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806416~hmac=93ee08fbb96878bc55af2ed52bf9d176d96d93656ff865d59ed817bb04ecdedc&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0",
|
||||
"https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/9v/lr/n230705er39jxogp0ap3b823gkkylr9v-1-2c1301000023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806416&gen=playurlv2&os=akam&oi=2823883151&trid=cdad1de563c743629bdbef3a82d44df0i&mid=1715226141&platform=pc&upsig=81958d2e221d15d2c338619036f29c0e&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806416~hmac=bfcfa2cdb0b8deb5154d651a96ce22a6b4b0745d10b28fca87a6908328c5aa17&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0",
|
||||
"https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/9v/lr/n230705er39jxogp0ap3b823gkkylr9v-1-2a1301000023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806416&gen=playurlv2&os=akam&oi=2823883151&trid=cdad1de563c743629bdbef3a82d44df0i&mid=1715226141&platform=pc&upsig=d808b57371897bb4174112c3a53c6ed2&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806416~hmac=30bb7b24ea912715ec2e9e76dfbb7b2703a824389d867b78b472d2d555b94b0c&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0"
|
||||
],
|
||||
"subtitle": [
|
||||
"https://allanime.pro/apiak/sk.json?sub=dx-ep-LYKSutL2PaAjYyXWz_1_sub_English"
|
||||
]
|
||||
},
|
||||
{
|
||||
"quality": 240,
|
||||
"stream_url": "https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/9v/lr/n230705er39jxogp0ap3b823gkkylr9v-1-2e1220110000.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806416&gen=playurlv2&os=akam&oi=2823883151&trid=0d3feddd596b49619e240c063f47de83i&mid=1715226141&platform=pc&upsig=94e89139eb6c68c3abaa60732b71d9b5&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806416~hmac=857664970a080beafe4c0eecfd55d74d02488ab2540f3fb7a761d8de1cbb7d73&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0",
|
||||
"audio_tracks": [
|
||||
"https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/9v/lr/n230705er39jxogp0ap3b823gkkylr9v-1-2d1301000023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806416&gen=playurlv2&os=akam&oi=2823883151&trid=cdad1de563c743629bdbef3a82d44df0i&mid=1715226141&platform=pc&upsig=419c3e929cd04770d08cb0eb8f95470d&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806416~hmac=93ee08fbb96878bc55af2ed52bf9d176d96d93656ff865d59ed817bb04ecdedc&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0",
|
||||
"https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/9v/lr/n230705er39jxogp0ap3b823gkkylr9v-1-2c1301000023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806416&gen=playurlv2&os=akam&oi=2823883151&trid=cdad1de563c743629bdbef3a82d44df0i&mid=1715226141&platform=pc&upsig=81958d2e221d15d2c338619036f29c0e&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806416~hmac=bfcfa2cdb0b8deb5154d651a96ce22a6b4b0745d10b28fca87a6908328c5aa17&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0",
|
||||
"https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/9v/lr/n230705er39jxogp0ap3b823gkkylr9v-1-2a1301000023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806416&gen=playurlv2&os=akam&oi=2823883151&trid=cdad1de563c743629bdbef3a82d44df0i&mid=1715226141&platform=pc&upsig=d808b57371897bb4174112c3a53c6ed2&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806416~hmac=30bb7b24ea912715ec2e9e76dfbb7b2703a824389d867b78b472d2d555b94b0c&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0"
|
||||
],
|
||||
"subtitle": [
|
||||
"https://allanime.pro/apiak/sk.json?sub=dx-ep-LYKSutL2PaAjYyXWz_1_sub_English"
|
||||
]
|
||||
},
|
||||
{
|
||||
"quality": 144,
|
||||
"stream_url": "https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/9v/lr/n230705er39jxogp0ap3b823gkkylr9v-1-2f1220110000.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806416&gen=playurlv2&os=akam&oi=2823883151&trid=0d3feddd596b49619e240c063f47de83i&mid=1715226141&platform=pc&upsig=b1cf645fb59d1a842513c0e1009ebe48&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806416~hmac=027ee786681aa3a335293a80df939a5c07566acaca78b1634665ea4a69f06ed9&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0",
|
||||
"audio_tracks": [
|
||||
"https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/9v/lr/n230705er39jxogp0ap3b823gkkylr9v-1-2d1301000023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806416&gen=playurlv2&os=akam&oi=2823883151&trid=cdad1de563c743629bdbef3a82d44df0i&mid=1715226141&platform=pc&upsig=419c3e929cd04770d08cb0eb8f95470d&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806416~hmac=93ee08fbb96878bc55af2ed52bf9d176d96d93656ff865d59ed817bb04ecdedc&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0",
|
||||
"https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/9v/lr/n230705er39jxogp0ap3b823gkkylr9v-1-2c1301000023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806416&gen=playurlv2&os=akam&oi=2823883151&trid=cdad1de563c743629bdbef3a82d44df0i&mid=1715226141&platform=pc&upsig=81958d2e221d15d2c338619036f29c0e&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806416~hmac=bfcfa2cdb0b8deb5154d651a96ce22a6b4b0745d10b28fca87a6908328c5aa17&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0",
|
||||
"https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/9v/lr/n230705er39jxogp0ap3b823gkkylr9v-1-2a1301000023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806416&gen=playurlv2&os=akam&oi=2823883151&trid=cdad1de563c743629bdbef3a82d44df0i&mid=1715226141&platform=pc&upsig=d808b57371897bb4174112c3a53c6ed2&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806416~hmac=30bb7b24ea912715ec2e9e76dfbb7b2703a824389d867b78b472d2d555b94b0c&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0"
|
||||
],
|
||||
"subtitle": [
|
||||
"https://allanime.pro/apiak/sk.json?sub=dx-ep-LYKSutL2PaAjYyXWz_1_sub_English"
|
||||
]
|
||||
},
|
||||
{
|
||||
"stream_url": "https://tools.fast4speed.rsvp//media7/videos/LYKSutL2PaAjYyXWz/sub/1",
|
||||
"subtitle": [
|
||||
"https://allanime.pro/apiak/sk.json?sub=dx-ep-LYKSutL2PaAjYyXWz_1_sub_English"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"episode": 2,
|
||||
"streams": [
|
||||
{
|
||||
"quality": 2160,
|
||||
"stream_url": "https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/3h/zb/n230713erpauupbrgz8d631feuarzb3h-1-281210110000.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806421&gen=playurlv2&os=akam&oi=2823883151&trid=83363b1f112c42b2b8cf9d738318ac28i&mid=1715226141&platform=pc&upsig=524b69564543fbf4f3d4c68b6c3c1d09&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806421~hmac=6d81e4cd3e315752490834a7a10b0c87aed91c328b5c7bf3bf6d26f05ac88497&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0",
|
||||
"audio_tracks": [
|
||||
"https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/3h/zb/n230713erpauupbrgz8d631feuarzb3h-1-2d1301000023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806421&gen=playurlv2&os=akam&oi=2823883151&trid=83363b1f112c42b2b8cf9d738318ac28i&mid=1715226141&platform=pc&upsig=1db546d64c64be51daa2a29c5d174445&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806421~hmac=b44869856e3c8a7d8e7e83fbee0cd9dab8cb5f85897ea559a54d332554c5d309&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0",
|
||||
"https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/3h/zb/n230713erpauupbrgz8d631feuarzb3h-1-2c1301000023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806421&gen=playurlv2&os=akam&oi=2823883151&trid=83363b1f112c42b2b8cf9d738318ac28i&mid=1715226141&platform=pc&upsig=3631738cb91c22b18272e76b136b3528&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806421~hmac=7c49369f5d56c50d4ad05efcf296bcfc2b8915970315eab22153144a5cad38d6&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0",
|
||||
"https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/3h/zb/n230713erpauupbrgz8d631feuarzb3h-1-2a1301000023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806421&gen=playurlv2&os=akam&oi=2823883151&trid=83363b1f112c42b2b8cf9d738318ac28i&mid=1715226141&platform=pc&upsig=9e88250822bf3a37ef07d3db28264aef&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806421~hmac=46af0b8bc556f8b9ff8c2d31f2e474803c8feb9516e76b08ef9a18514c7be347&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0"
|
||||
],
|
||||
"subtitle": [
|
||||
"https://allanime.pro/apiak/sk.json?sub=dx-ep-LYKSutL2PaAjYyXWz_2_sub_English"
|
||||
]
|
||||
},
|
||||
{
|
||||
"quality": 1080,
|
||||
"stream_url": "https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/3h/zb/n230713erpauupbrgz8d631feuarzb3h-1-261210110000.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806421&gen=playurlv2&os=akam&oi=2823883151&trid=83363b1f112c42b2b8cf9d738318ac28i&mid=1715226141&platform=pc&upsig=cb2fea1f90e4446670dff59f478b4ae9&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806421~hmac=8c9def323472882639cd860c4fa9597383f738ea15f87c642555095c04735e5f&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0",
|
||||
"audio_tracks": [
|
||||
"https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/3h/zb/n230713erpauupbrgz8d631feuarzb3h-1-2d1301000023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806421&gen=playurlv2&os=akam&oi=2823883151&trid=83363b1f112c42b2b8cf9d738318ac28i&mid=1715226141&platform=pc&upsig=1db546d64c64be51daa2a29c5d174445&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806421~hmac=b44869856e3c8a7d8e7e83fbee0cd9dab8cb5f85897ea559a54d332554c5d309&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0",
|
||||
"https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/3h/zb/n230713erpauupbrgz8d631feuarzb3h-1-2c1301000023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806421&gen=playurlv2&os=akam&oi=2823883151&trid=83363b1f112c42b2b8cf9d738318ac28i&mid=1715226141&platform=pc&upsig=3631738cb91c22b18272e76b136b3528&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806421~hmac=7c49369f5d56c50d4ad05efcf296bcfc2b8915970315eab22153144a5cad38d6&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0",
|
||||
"https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/3h/zb/n230713erpauupbrgz8d631feuarzb3h-1-2a1301000023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806421&gen=playurlv2&os=akam&oi=2823883151&trid=83363b1f112c42b2b8cf9d738318ac28i&mid=1715226141&platform=pc&upsig=9e88250822bf3a37ef07d3db28264aef&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806421~hmac=46af0b8bc556f8b9ff8c2d31f2e474803c8feb9516e76b08ef9a18514c7be347&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0"
|
||||
],
|
||||
"subtitle": [
|
||||
"https://allanime.pro/apiak/sk.json?sub=dx-ep-LYKSutL2PaAjYyXWz_2_sub_English"
|
||||
]
|
||||
},
|
||||
{
|
||||
"quality": 1080,
|
||||
"stream_url": "https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/3h/zb/n230713erpauupbrgz8d631feuarzb3h-1-251210110000.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806421&gen=playurlv2&os=akam&oi=2823883151&trid=83363b1f112c42b2b8cf9d738318ac28i&mid=1715226141&platform=pc&upsig=43c3d1bae3d7eb6a8bc0288f12e1bc9f&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806421~hmac=17755eaa1600fb6e16fc1e1e6752e2a36f54f12a8bbccadbf59e21c44e2227b1&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0",
|
||||
"audio_tracks": [
|
||||
"https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/3h/zb/n230713erpauupbrgz8d631feuarzb3h-1-2d1301000023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806421&gen=playurlv2&os=akam&oi=2823883151&trid=83363b1f112c42b2b8cf9d738318ac28i&mid=1715226141&platform=pc&upsig=1db546d64c64be51daa2a29c5d174445&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806421~hmac=b44869856e3c8a7d8e7e83fbee0cd9dab8cb5f85897ea559a54d332554c5d309&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0",
|
||||
"https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/3h/zb/n230713erpauupbrgz8d631feuarzb3h-1-2c1301000023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806421&gen=playurlv2&os=akam&oi=2823883151&trid=83363b1f112c42b2b8cf9d738318ac28i&mid=1715226141&platform=pc&upsig=3631738cb91c22b18272e76b136b3528&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806421~hmac=7c49369f5d56c50d4ad05efcf296bcfc2b8915970315eab22153144a5cad38d6&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0",
|
||||
"https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/3h/zb/n230713erpauupbrgz8d631feuarzb3h-1-2a1301000023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806421&gen=playurlv2&os=akam&oi=2823883151&trid=83363b1f112c42b2b8cf9d738318ac28i&mid=1715226141&platform=pc&upsig=9e88250822bf3a37ef07d3db28264aef&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806421~hmac=46af0b8bc556f8b9ff8c2d31f2e474803c8feb9516e76b08ef9a18514c7be347&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0"
|
||||
],
|
||||
"subtitle": [
|
||||
"https://allanime.pro/apiak/sk.json?sub=dx-ep-LYKSutL2PaAjYyXWz_2_sub_English"
|
||||
]
|
||||
},
|
||||
{
|
||||
"quality": 720,
|
||||
"stream_url": "https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/3h/zb/n230713erpauupbrgz8d631feuarzb3h-1-241210110000.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806421&gen=playurlv2&os=akam&oi=2823883151&trid=83363b1f112c42b2b8cf9d738318ac28i&mid=1715226141&platform=pc&upsig=ed96f5dbb3243056c2184c5f0b6043bc&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806421~hmac=3376b48990131bd8e8e72e328ba519b329956d9fe83cdef4884de957840d4048&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0",
|
||||
"audio_tracks": [
|
||||
"https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/3h/zb/n230713erpauupbrgz8d631feuarzb3h-1-2d1301000023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806421&gen=playurlv2&os=akam&oi=2823883151&trid=83363b1f112c42b2b8cf9d738318ac28i&mid=1715226141&platform=pc&upsig=1db546d64c64be51daa2a29c5d174445&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806421~hmac=b44869856e3c8a7d8e7e83fbee0cd9dab8cb5f85897ea559a54d332554c5d309&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0",
|
||||
"https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/3h/zb/n230713erpauupbrgz8d631feuarzb3h-1-2c1301000023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806421&gen=playurlv2&os=akam&oi=2823883151&trid=83363b1f112c42b2b8cf9d738318ac28i&mid=1715226141&platform=pc&upsig=3631738cb91c22b18272e76b136b3528&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806421~hmac=7c49369f5d56c50d4ad05efcf296bcfc2b8915970315eab22153144a5cad38d6&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0",
|
||||
"https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/3h/zb/n230713erpauupbrgz8d631feuarzb3h-1-2a1301000023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806421&gen=playurlv2&os=akam&oi=2823883151&trid=83363b1f112c42b2b8cf9d738318ac28i&mid=1715226141&platform=pc&upsig=9e88250822bf3a37ef07d3db28264aef&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806421~hmac=46af0b8bc556f8b9ff8c2d31f2e474803c8feb9516e76b08ef9a18514c7be347&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0"
|
||||
],
|
||||
"subtitle": [
|
||||
"https://allanime.pro/apiak/sk.json?sub=dx-ep-LYKSutL2PaAjYyXWz_2_sub_English"
|
||||
]
|
||||
},
|
||||
{
|
||||
"quality": 480,
|
||||
"stream_url": "https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/3h/zb/n230713erpauupbrgz8d631feuarzb3h-1-231210110000.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806421&gen=playurlv2&os=akam&oi=2823883151&trid=83363b1f112c42b2b8cf9d738318ac28i&mid=1715226141&platform=pc&upsig=9b5e3042a4b7ef1c297da688491a597f&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806421~hmac=db7e82bea1c34954c95350128a9b36aa99115a5720876ab7d4f04b4ab5d27296&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0",
|
||||
"audio_tracks": [
|
||||
"https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/3h/zb/n230713erpauupbrgz8d631feuarzb3h-1-2d1301000023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806421&gen=playurlv2&os=akam&oi=2823883151&trid=83363b1f112c42b2b8cf9d738318ac28i&mid=1715226141&platform=pc&upsig=1db546d64c64be51daa2a29c5d174445&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806421~hmac=b44869856e3c8a7d8e7e83fbee0cd9dab8cb5f85897ea559a54d332554c5d309&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0",
|
||||
"https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/3h/zb/n230713erpauupbrgz8d631feuarzb3h-1-2c1301000023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806421&gen=playurlv2&os=akam&oi=2823883151&trid=83363b1f112c42b2b8cf9d738318ac28i&mid=1715226141&platform=pc&upsig=3631738cb91c22b18272e76b136b3528&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806421~hmac=7c49369f5d56c50d4ad05efcf296bcfc2b8915970315eab22153144a5cad38d6&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0",
|
||||
"https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/3h/zb/n230713erpauupbrgz8d631feuarzb3h-1-2a1301000023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806421&gen=playurlv2&os=akam&oi=2823883151&trid=83363b1f112c42b2b8cf9d738318ac28i&mid=1715226141&platform=pc&upsig=9e88250822bf3a37ef07d3db28264aef&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806421~hmac=46af0b8bc556f8b9ff8c2d31f2e474803c8feb9516e76b08ef9a18514c7be347&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0"
|
||||
],
|
||||
"subtitle": [
|
||||
"https://allanime.pro/apiak/sk.json?sub=dx-ep-LYKSutL2PaAjYyXWz_2_sub_English"
|
||||
]
|
||||
},
|
||||
{
|
||||
"quality": 360,
|
||||
"stream_url": "https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/3h/zb/n230713erpauupbrgz8d631feuarzb3h-1-211210110000.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806421&gen=playurlv2&os=akam&oi=2823883151&trid=83363b1f112c42b2b8cf9d738318ac28i&mid=1715226141&platform=pc&upsig=eb082a3debd772ec8ec7652e0269eef0&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806421~hmac=331c2ef5a5a9fd182462062134e35567a62ab7598edf7a93678918c76d7f2754&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0",
|
||||
"audio_tracks": [
|
||||
"https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/3h/zb/n230713erpauupbrgz8d631feuarzb3h-1-2d1301000023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806421&gen=playurlv2&os=akam&oi=2823883151&trid=83363b1f112c42b2b8cf9d738318ac28i&mid=1715226141&platform=pc&upsig=1db546d64c64be51daa2a29c5d174445&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806421~hmac=b44869856e3c8a7d8e7e83fbee0cd9dab8cb5f85897ea559a54d332554c5d309&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0",
|
||||
"https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/3h/zb/n230713erpauupbrgz8d631feuarzb3h-1-2c1301000023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806421&gen=playurlv2&os=akam&oi=2823883151&trid=83363b1f112c42b2b8cf9d738318ac28i&mid=1715226141&platform=pc&upsig=3631738cb91c22b18272e76b136b3528&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806421~hmac=7c49369f5d56c50d4ad05efcf296bcfc2b8915970315eab22153144a5cad38d6&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0",
|
||||
"https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/3h/zb/n230713erpauupbrgz8d631feuarzb3h-1-2a1301000023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806421&gen=playurlv2&os=akam&oi=2823883151&trid=83363b1f112c42b2b8cf9d738318ac28i&mid=1715226141&platform=pc&upsig=9e88250822bf3a37ef07d3db28264aef&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806421~hmac=46af0b8bc556f8b9ff8c2d31f2e474803c8feb9516e76b08ef9a18514c7be347&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0"
|
||||
],
|
||||
"subtitle": [
|
||||
"https://allanime.pro/apiak/sk.json?sub=dx-ep-LYKSutL2PaAjYyXWz_2_sub_English"
|
||||
]
|
||||
},
|
||||
{
|
||||
"quality": 240,
|
||||
"stream_url": "https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/3h/zb/n230713erpauupbrgz8d631feuarzb3h-1-2e1210110000.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806421&gen=playurlv2&os=akam&oi=2823883151&trid=83363b1f112c42b2b8cf9d738318ac28i&mid=1715226141&platform=pc&upsig=c7978f5178ca0041e4f9edf8d57a899f&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806421~hmac=5d7fe506b0f7784eb47aa85f2dcc99fffeb6d715ee71bb3766a51a8c747e6b39&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0",
|
||||
"audio_tracks": [
|
||||
"https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/3h/zb/n230713erpauupbrgz8d631feuarzb3h-1-2d1301000023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806421&gen=playurlv2&os=akam&oi=2823883151&trid=83363b1f112c42b2b8cf9d738318ac28i&mid=1715226141&platform=pc&upsig=1db546d64c64be51daa2a29c5d174445&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806421~hmac=b44869856e3c8a7d8e7e83fbee0cd9dab8cb5f85897ea559a54d332554c5d309&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0",
|
||||
"https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/3h/zb/n230713erpauupbrgz8d631feuarzb3h-1-2c1301000023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806421&gen=playurlv2&os=akam&oi=2823883151&trid=83363b1f112c42b2b8cf9d738318ac28i&mid=1715226141&platform=pc&upsig=3631738cb91c22b18272e76b136b3528&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806421~hmac=7c49369f5d56c50d4ad05efcf296bcfc2b8915970315eab22153144a5cad38d6&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0",
|
||||
"https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/3h/zb/n230713erpauupbrgz8d631feuarzb3h-1-2a1301000023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806421&gen=playurlv2&os=akam&oi=2823883151&trid=83363b1f112c42b2b8cf9d738318ac28i&mid=1715226141&platform=pc&upsig=9e88250822bf3a37ef07d3db28264aef&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806421~hmac=46af0b8bc556f8b9ff8c2d31f2e474803c8feb9516e76b08ef9a18514c7be347&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0"
|
||||
],
|
||||
"subtitle": [
|
||||
"https://allanime.pro/apiak/sk.json?sub=dx-ep-LYKSutL2PaAjYyXWz_2_sub_English"
|
||||
]
|
||||
},
|
||||
{
|
||||
"quality": 144,
|
||||
"stream_url": "https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/3h/zb/n230713erpauupbrgz8d631feuarzb3h-1-2f1210110000.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806421&gen=playurlv2&os=akam&oi=2823883151&trid=83363b1f112c42b2b8cf9d738318ac28i&mid=1715226141&platform=pc&upsig=59e5be290a3224956c898b95cef6b149&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806421~hmac=a44bca5b557490d30ef52537a93dd0ce47a5dab8db5c19fbe5935e49b0bfc71f&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0",
|
||||
"audio_tracks": [
|
||||
"https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/3h/zb/n230713erpauupbrgz8d631feuarzb3h-1-2d1301000023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806421&gen=playurlv2&os=akam&oi=2823883151&trid=83363b1f112c42b2b8cf9d738318ac28i&mid=1715226141&platform=pc&upsig=1db546d64c64be51daa2a29c5d174445&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806421~hmac=b44869856e3c8a7d8e7e83fbee0cd9dab8cb5f85897ea559a54d332554c5d309&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0",
|
||||
"https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/3h/zb/n230713erpauupbrgz8d631feuarzb3h-1-2c1301000023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806421&gen=playurlv2&os=akam&oi=2823883151&trid=83363b1f112c42b2b8cf9d738318ac28i&mid=1715226141&platform=pc&upsig=3631738cb91c22b18272e76b136b3528&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806421~hmac=7c49369f5d56c50d4ad05efcf296bcfc2b8915970315eab22153144a5cad38d6&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0",
|
||||
"https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/3h/zb/n230713erpauupbrgz8d631feuarzb3h-1-2a1301000023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806421&gen=playurlv2&os=akam&oi=2823883151&trid=83363b1f112c42b2b8cf9d738318ac28i&mid=1715226141&platform=pc&upsig=9e88250822bf3a37ef07d3db28264aef&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806421~hmac=46af0b8bc556f8b9ff8c2d31f2e474803c8feb9516e76b08ef9a18514c7be347&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0"
|
||||
],
|
||||
"subtitle": [
|
||||
"https://allanime.pro/apiak/sk.json?sub=dx-ep-LYKSutL2PaAjYyXWz_2_sub_English"
|
||||
]
|
||||
},
|
||||
{
|
||||
"quality": 2160,
|
||||
"stream_url": "https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/3h/zb/n230713erpauupbrgz8d631feuarzb3h-1-281220110000.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806421&gen=playurlv2&os=akam&oi=2823883151&trid=893c4505892c4e239a3a1aa3cc0ad30ai&mid=1715226141&platform=pc&upsig=31265763ba5db068abf292c0f97e4b66&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806421~hmac=006292cd147652fe63354536afdc1cb063b996b370efe2790d4e49a98fd84ef3&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0",
|
||||
"audio_tracks": [
|
||||
"https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/3h/zb/n230713erpauupbrgz8d631feuarzb3h-1-2d1301000023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806421&gen=playurlv2&os=akam&oi=2823883151&trid=83363b1f112c42b2b8cf9d738318ac28i&mid=1715226141&platform=pc&upsig=1db546d64c64be51daa2a29c5d174445&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806421~hmac=b44869856e3c8a7d8e7e83fbee0cd9dab8cb5f85897ea559a54d332554c5d309&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0",
|
||||
"https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/3h/zb/n230713erpauupbrgz8d631feuarzb3h-1-2c1301000023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806421&gen=playurlv2&os=akam&oi=2823883151&trid=83363b1f112c42b2b8cf9d738318ac28i&mid=1715226141&platform=pc&upsig=3631738cb91c22b18272e76b136b3528&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806421~hmac=7c49369f5d56c50d4ad05efcf296bcfc2b8915970315eab22153144a5cad38d6&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0",
|
||||
"https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/3h/zb/n230713erpauupbrgz8d631feuarzb3h-1-2a1301000023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806421&gen=playurlv2&os=akam&oi=2823883151&trid=83363b1f112c42b2b8cf9d738318ac28i&mid=1715226141&platform=pc&upsig=9e88250822bf3a37ef07d3db28264aef&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806421~hmac=46af0b8bc556f8b9ff8c2d31f2e474803c8feb9516e76b08ef9a18514c7be347&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0"
|
||||
],
|
||||
"subtitle": [
|
||||
"https://allanime.pro/apiak/sk.json?sub=dx-ep-LYKSutL2PaAjYyXWz_2_sub_English"
|
||||
]
|
||||
},
|
||||
{
|
||||
"quality": 1080,
|
||||
"stream_url": "https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/3h/zb/n230713erpauupbrgz8d631feuarzb3h-1-261220110000.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806421&gen=playurlv2&os=akam&oi=2823883151&trid=893c4505892c4e239a3a1aa3cc0ad30ai&mid=1715226141&platform=pc&upsig=0119546d4b9d3470ac382dd9de3bb4c7&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806421~hmac=cae44130401286c51353667dc3a0bc14f86fdfe12461da839786008d2013c773&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0",
|
||||
"audio_tracks": [
|
||||
"https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/3h/zb/n230713erpauupbrgz8d631feuarzb3h-1-2d1301000023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806421&gen=playurlv2&os=akam&oi=2823883151&trid=83363b1f112c42b2b8cf9d738318ac28i&mid=1715226141&platform=pc&upsig=1db546d64c64be51daa2a29c5d174445&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806421~hmac=b44869856e3c8a7d8e7e83fbee0cd9dab8cb5f85897ea559a54d332554c5d309&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0",
|
||||
"https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/3h/zb/n230713erpauupbrgz8d631feuarzb3h-1-2c1301000023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806421&gen=playurlv2&os=akam&oi=2823883151&trid=83363b1f112c42b2b8cf9d738318ac28i&mid=1715226141&platform=pc&upsig=3631738cb91c22b18272e76b136b3528&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806421~hmac=7c49369f5d56c50d4ad05efcf296bcfc2b8915970315eab22153144a5cad38d6&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0",
|
||||
"https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/3h/zb/n230713erpauupbrgz8d631feuarzb3h-1-2a1301000023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806421&gen=playurlv2&os=akam&oi=2823883151&trid=83363b1f112c42b2b8cf9d738318ac28i&mid=1715226141&platform=pc&upsig=9e88250822bf3a37ef07d3db28264aef&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806421~hmac=46af0b8bc556f8b9ff8c2d31f2e474803c8feb9516e76b08ef9a18514c7be347&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0"
|
||||
],
|
||||
"subtitle": [
|
||||
"https://allanime.pro/apiak/sk.json?sub=dx-ep-LYKSutL2PaAjYyXWz_2_sub_English"
|
||||
]
|
||||
},
|
||||
{
|
||||
"quality": 1080,
|
||||
"stream_url": "https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/3h/zb/n230713erpauupbrgz8d631feuarzb3h-1-251220110000.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806421&gen=playurlv2&os=akam&oi=2823883151&trid=893c4505892c4e239a3a1aa3cc0ad30ai&mid=1715226141&platform=pc&upsig=a165d30b028da157106f918dd1da47b8&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806421~hmac=70eb53d921969914a41ecc829799aaf93f771f2896aa0f24895fa08563011b4a&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0",
|
||||
"audio_tracks": [
|
||||
"https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/3h/zb/n230713erpauupbrgz8d631feuarzb3h-1-2d1301000023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806421&gen=playurlv2&os=akam&oi=2823883151&trid=83363b1f112c42b2b8cf9d738318ac28i&mid=1715226141&platform=pc&upsig=1db546d64c64be51daa2a29c5d174445&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806421~hmac=b44869856e3c8a7d8e7e83fbee0cd9dab8cb5f85897ea559a54d332554c5d309&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0",
|
||||
"https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/3h/zb/n230713erpauupbrgz8d631feuarzb3h-1-2c1301000023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806421&gen=playurlv2&os=akam&oi=2823883151&trid=83363b1f112c42b2b8cf9d738318ac28i&mid=1715226141&platform=pc&upsig=3631738cb91c22b18272e76b136b3528&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806421~hmac=7c49369f5d56c50d4ad05efcf296bcfc2b8915970315eab22153144a5cad38d6&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0",
|
||||
"https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/3h/zb/n230713erpauupbrgz8d631feuarzb3h-1-2a1301000023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806421&gen=playurlv2&os=akam&oi=2823883151&trid=83363b1f112c42b2b8cf9d738318ac28i&mid=1715226141&platform=pc&upsig=9e88250822bf3a37ef07d3db28264aef&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806421~hmac=46af0b8bc556f8b9ff8c2d31f2e474803c8feb9516e76b08ef9a18514c7be347&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0"
|
||||
],
|
||||
"subtitle": [
|
||||
"https://allanime.pro/apiak/sk.json?sub=dx-ep-LYKSutL2PaAjYyXWz_2_sub_English"
|
||||
]
|
||||
},
|
||||
{
|
||||
"quality": 720,
|
||||
"stream_url": "https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/3h/zb/n230713erpauupbrgz8d631feuarzb3h-1-241220110000.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806421&gen=playurlv2&os=akam&oi=2823883151&trid=893c4505892c4e239a3a1aa3cc0ad30ai&mid=1715226141&platform=pc&upsig=44f1f4283a9ab0477d54ee1b17920439&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806421~hmac=ccfde33644f85a1bd17e2fe959d517015a2abbfad81c53633b607f9d46536a7e&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0",
|
||||
"audio_tracks": [
|
||||
"https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/3h/zb/n230713erpauupbrgz8d631feuarzb3h-1-2d1301000023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806421&gen=playurlv2&os=akam&oi=2823883151&trid=83363b1f112c42b2b8cf9d738318ac28i&mid=1715226141&platform=pc&upsig=1db546d64c64be51daa2a29c5d174445&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806421~hmac=b44869856e3c8a7d8e7e83fbee0cd9dab8cb5f85897ea559a54d332554c5d309&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0",
|
||||
"https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/3h/zb/n230713erpauupbrgz8d631feuarzb3h-1-2c1301000023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806421&gen=playurlv2&os=akam&oi=2823883151&trid=83363b1f112c42b2b8cf9d738318ac28i&mid=1715226141&platform=pc&upsig=3631738cb91c22b18272e76b136b3528&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806421~hmac=7c49369f5d56c50d4ad05efcf296bcfc2b8915970315eab22153144a5cad38d6&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0",
|
||||
"https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/3h/zb/n230713erpauupbrgz8d631feuarzb3h-1-2a1301000023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806421&gen=playurlv2&os=akam&oi=2823883151&trid=83363b1f112c42b2b8cf9d738318ac28i&mid=1715226141&platform=pc&upsig=9e88250822bf3a37ef07d3db28264aef&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806421~hmac=46af0b8bc556f8b9ff8c2d31f2e474803c8feb9516e76b08ef9a18514c7be347&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0"
|
||||
],
|
||||
"subtitle": [
|
||||
"https://allanime.pro/apiak/sk.json?sub=dx-ep-LYKSutL2PaAjYyXWz_2_sub_English"
|
||||
]
|
||||
},
|
||||
{
|
||||
"quality": 480,
|
||||
"stream_url": "https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/3h/zb/n230713erpauupbrgz8d631feuarzb3h-1-231220110000.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806421&gen=playurlv2&os=akam&oi=2823883151&trid=893c4505892c4e239a3a1aa3cc0ad30ai&mid=1715226141&platform=pc&upsig=d7c85bc331e1969ef09e10af9fb955e4&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806421~hmac=1fd5b2f944f87f8d22499ba46cacee299080dd82136489ac15063d7d40377708&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0",
|
||||
"audio_tracks": [
|
||||
"https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/3h/zb/n230713erpauupbrgz8d631feuarzb3h-1-2d1301000023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806421&gen=playurlv2&os=akam&oi=2823883151&trid=83363b1f112c42b2b8cf9d738318ac28i&mid=1715226141&platform=pc&upsig=1db546d64c64be51daa2a29c5d174445&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806421~hmac=b44869856e3c8a7d8e7e83fbee0cd9dab8cb5f85897ea559a54d332554c5d309&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0",
|
||||
"https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/3h/zb/n230713erpauupbrgz8d631feuarzb3h-1-2c1301000023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806421&gen=playurlv2&os=akam&oi=2823883151&trid=83363b1f112c42b2b8cf9d738318ac28i&mid=1715226141&platform=pc&upsig=3631738cb91c22b18272e76b136b3528&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806421~hmac=7c49369f5d56c50d4ad05efcf296bcfc2b8915970315eab22153144a5cad38d6&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0",
|
||||
"https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/3h/zb/n230713erpauupbrgz8d631feuarzb3h-1-2a1301000023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806421&gen=playurlv2&os=akam&oi=2823883151&trid=83363b1f112c42b2b8cf9d738318ac28i&mid=1715226141&platform=pc&upsig=9e88250822bf3a37ef07d3db28264aef&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806421~hmac=46af0b8bc556f8b9ff8c2d31f2e474803c8feb9516e76b08ef9a18514c7be347&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0"
|
||||
],
|
||||
"subtitle": [
|
||||
"https://allanime.pro/apiak/sk.json?sub=dx-ep-LYKSutL2PaAjYyXWz_2_sub_English"
|
||||
]
|
||||
},
|
||||
{
|
||||
"quality": 360,
|
||||
"stream_url": "https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/3h/zb/n230713erpauupbrgz8d631feuarzb3h-1-211220110000.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806421&gen=playurlv2&os=akam&oi=2823883151&trid=893c4505892c4e239a3a1aa3cc0ad30ai&mid=1715226141&platform=pc&upsig=2d41ffea376120e178ece52948ad95f5&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806421~hmac=c95c968cb54a6647fd17015d14d09cfb4a9901e54bd30f3811419e03334efc38&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0",
|
||||
"audio_tracks": [
|
||||
"https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/3h/zb/n230713erpauupbrgz8d631feuarzb3h-1-2d1301000023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806421&gen=playurlv2&os=akam&oi=2823883151&trid=83363b1f112c42b2b8cf9d738318ac28i&mid=1715226141&platform=pc&upsig=1db546d64c64be51daa2a29c5d174445&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806421~hmac=b44869856e3c8a7d8e7e83fbee0cd9dab8cb5f85897ea559a54d332554c5d309&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0",
|
||||
"https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/3h/zb/n230713erpauupbrgz8d631feuarzb3h-1-2c1301000023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806421&gen=playurlv2&os=akam&oi=2823883151&trid=83363b1f112c42b2b8cf9d738318ac28i&mid=1715226141&platform=pc&upsig=3631738cb91c22b18272e76b136b3528&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806421~hmac=7c49369f5d56c50d4ad05efcf296bcfc2b8915970315eab22153144a5cad38d6&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0",
|
||||
"https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/3h/zb/n230713erpauupbrgz8d631feuarzb3h-1-2a1301000023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806421&gen=playurlv2&os=akam&oi=2823883151&trid=83363b1f112c42b2b8cf9d738318ac28i&mid=1715226141&platform=pc&upsig=9e88250822bf3a37ef07d3db28264aef&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806421~hmac=46af0b8bc556f8b9ff8c2d31f2e474803c8feb9516e76b08ef9a18514c7be347&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0"
|
||||
],
|
||||
"subtitle": [
|
||||
"https://allanime.pro/apiak/sk.json?sub=dx-ep-LYKSutL2PaAjYyXWz_2_sub_English"
|
||||
]
|
||||
},
|
||||
{
|
||||
"quality": 240,
|
||||
"stream_url": "https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/3h/zb/n230713erpauupbrgz8d631feuarzb3h-1-2e1220110000.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806421&gen=playurlv2&os=akam&oi=2823883151&trid=893c4505892c4e239a3a1aa3cc0ad30ai&mid=1715226141&platform=pc&upsig=08807f4673a635863fa9d5f137e202b9&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806421~hmac=78774c1e1784e1dd7bf6b6e697a0da2d1f6d0a748b33b82a879ae3bb17de5c2d&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0",
|
||||
"audio_tracks": [
|
||||
"https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/3h/zb/n230713erpauupbrgz8d631feuarzb3h-1-2d1301000023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806421&gen=playurlv2&os=akam&oi=2823883151&trid=83363b1f112c42b2b8cf9d738318ac28i&mid=1715226141&platform=pc&upsig=1db546d64c64be51daa2a29c5d174445&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806421~hmac=b44869856e3c8a7d8e7e83fbee0cd9dab8cb5f85897ea559a54d332554c5d309&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0",
|
||||
"https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/3h/zb/n230713erpauupbrgz8d631feuarzb3h-1-2c1301000023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806421&gen=playurlv2&os=akam&oi=2823883151&trid=83363b1f112c42b2b8cf9d738318ac28i&mid=1715226141&platform=pc&upsig=3631738cb91c22b18272e76b136b3528&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806421~hmac=7c49369f5d56c50d4ad05efcf296bcfc2b8915970315eab22153144a5cad38d6&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0",
|
||||
"https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/3h/zb/n230713erpauupbrgz8d631feuarzb3h-1-2a1301000023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806421&gen=playurlv2&os=akam&oi=2823883151&trid=83363b1f112c42b2b8cf9d738318ac28i&mid=1715226141&platform=pc&upsig=9e88250822bf3a37ef07d3db28264aef&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806421~hmac=46af0b8bc556f8b9ff8c2d31f2e474803c8feb9516e76b08ef9a18514c7be347&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0"
|
||||
],
|
||||
"subtitle": [
|
||||
"https://allanime.pro/apiak/sk.json?sub=dx-ep-LYKSutL2PaAjYyXWz_2_sub_English"
|
||||
]
|
||||
},
|
||||
{
|
||||
"quality": 144,
|
||||
"stream_url": "https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/3h/zb/n230713erpauupbrgz8d631feuarzb3h-1-2f1220110000.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806421&gen=playurlv2&os=akam&oi=2823883151&trid=893c4505892c4e239a3a1aa3cc0ad30ai&mid=1715226141&platform=pc&upsig=2e8a816bc0df4223db2ac78908801676&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806421~hmac=d6abfa29491f1c32f66707d6285895389bc70abfae9095851acf8f183a4230ef&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0",
|
||||
"audio_tracks": [
|
||||
"https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/3h/zb/n230713erpauupbrgz8d631feuarzb3h-1-2d1301000023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806421&gen=playurlv2&os=akam&oi=2823883151&trid=83363b1f112c42b2b8cf9d738318ac28i&mid=1715226141&platform=pc&upsig=1db546d64c64be51daa2a29c5d174445&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806421~hmac=b44869856e3c8a7d8e7e83fbee0cd9dab8cb5f85897ea559a54d332554c5d309&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0",
|
||||
"https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/3h/zb/n230713erpauupbrgz8d631feuarzb3h-1-2c1301000023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806421&gen=playurlv2&os=akam&oi=2823883151&trid=83363b1f112c42b2b8cf9d738318ac28i&mid=1715226141&platform=pc&upsig=3631738cb91c22b18272e76b136b3528&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806421~hmac=7c49369f5d56c50d4ad05efcf296bcfc2b8915970315eab22153144a5cad38d6&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0",
|
||||
"https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/3h/zb/n230713erpauupbrgz8d631feuarzb3h-1-2a1301000023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806421&gen=playurlv2&os=akam&oi=2823883151&trid=83363b1f112c42b2b8cf9d738318ac28i&mid=1715226141&platform=pc&upsig=9e88250822bf3a37ef07d3db28264aef&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806421~hmac=46af0b8bc556f8b9ff8c2d31f2e474803c8feb9516e76b08ef9a18514c7be347&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0"
|
||||
],
|
||||
"subtitle": [
|
||||
"https://allanime.pro/apiak/sk.json?sub=dx-ep-LYKSutL2PaAjYyXWz_2_sub_English"
|
||||
]
|
||||
},
|
||||
{
|
||||
"stream_url": "https://tools.fast4speed.rsvp//media7/videos/LYKSutL2PaAjYyXWz/sub/2",
|
||||
"subtitle": [
|
||||
"https://allanime.pro/apiak/sk.json?sub=dx-ep-LYKSutL2PaAjYyXWz_2_sub_English"
|
||||
]
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"episode": 1,
|
||||
"streams": [
|
||||
{
|
||||
"stream_url": "https://tools.fast4speed.rsvp//media6/videos/Mk8Z4bqjYq9FNeRDS/sub/1"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"episode": 2,
|
||||
"streams": [
|
||||
{
|
||||
"stream_url": "https://tools.fast4speed.rsvp//media6/videos/Mk8Z4bqjYq9FNeRDS/sub/2",
|
||||
"title": "Miyuki Shirogane Wants to Mediate / Kaguya Wants to Distract Him / Kaguya Preemptively Strikes"
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
1217
app/libs/animdl/animdl.json
Normal file
1217
app/libs/animdl/animdl.json
Normal file
File diff suppressed because it is too large
Load Diff
@@ -1,46 +1,208 @@
|
||||
from subprocess import run, PIPE
|
||||
from difflib import SequenceMatcher
|
||||
import os
|
||||
from subprocess import Popen, run, PIPE
|
||||
# from difflib import SequenceMatcher
|
||||
from fuzzywuzzy import fuzz
|
||||
import time
|
||||
import json
|
||||
import re
|
||||
import requests
|
||||
import shutil
|
||||
|
||||
|
||||
broken_link_pattern = r"https://tools.fast4speed.rsvp/\w*"
|
||||
|
||||
class AnimdlApi:
|
||||
@classmethod
|
||||
def run_command(cls,cmds:list):
|
||||
return run(["C:\\Users\\bxavi\\.pyenv\\pyenv-win\\versions\\3.10.11\\python.exe","-m", "animdl", *cmds],capture_output=True,stdin=PIPE,text=True)
|
||||
def run_animdl_command(cls,cmds:list,capture = True):
|
||||
if py_path:=shutil.which("python"):
|
||||
if capture:
|
||||
return run([py_path,"-m", "animdl", *cmds],capture_output=True,stdin=PIPE,text=True)
|
||||
else:
|
||||
return run([py_path,"-m", "animdl", *cmds])
|
||||
|
||||
@classmethod
|
||||
def stream_anime_by_title(cls,title,episodes_range=None):
|
||||
anime = cls.get_anime_url_by_title(title)
|
||||
if not anime:
|
||||
return False
|
||||
if py_path:=shutil.which("python"):
|
||||
base_cmds = [py_path,"-m", "animdl","stream",anime[1]]
|
||||
cmd = [*base_cmds,"-r",episodes_range] if episodes_range else base_cmds
|
||||
streaming_child_process = Popen(cmd)
|
||||
return streaming_child_process
|
||||
|
||||
@classmethod
|
||||
def download_anime_by_title(cls,title,on_episode_download_progress,on_complete,output_path=os.getcwd(),episodes_range=None,quality="best"):
|
||||
data = cls.get_stream_urls_by_anime_title(title,episodes_range)
|
||||
if not data:
|
||||
return None,None
|
||||
failed_downloads = []
|
||||
successful_downloads = []
|
||||
anime_title,episodes_to_download = data
|
||||
anime_title = anime_title.capitalize()
|
||||
|
||||
if not episodes_to_download:
|
||||
return False,None
|
||||
|
||||
# determine download location
|
||||
parsed_anime_title = anime_title.replace(":","").replace("/", "").replace("\\","")
|
||||
download_location = os.path.join(output_path,parsed_anime_title)
|
||||
if not os.path.exists(download_location):
|
||||
os.mkdir(download_location)
|
||||
|
||||
for episode in episodes_to_download:
|
||||
episode_number = episode["episode"]
|
||||
episode_title = f"Episode {episode_number}"
|
||||
try:
|
||||
streams = episode["streams"]
|
||||
|
||||
# remove the brocken streams
|
||||
filter_broken_stream = lambda stream: True if not re.match(broken_link_pattern,stream.get("stream_url")) else False
|
||||
streams = list(filter(filter_broken_stream,streams))
|
||||
|
||||
# get the appropriate stream or default to best
|
||||
get_quality_func = lambda stream_: stream_.get("quality") if stream_.get("quality") else 0
|
||||
quality_args = quality.split("/")
|
||||
if quality_args[0] == "best":
|
||||
stream=max(streams,key=get_quality_func)
|
||||
elif quality_args[0] == "worst":
|
||||
stream=min(streams,key=get_quality_func)
|
||||
else:
|
||||
success = False
|
||||
try:
|
||||
for stream_ in streams:
|
||||
if str(stream_.get("quality")) == quality_args[0]:
|
||||
if stream_url_:=stream.get("stream_url"):
|
||||
stream = stream_url_
|
||||
success=True
|
||||
break
|
||||
if not success:
|
||||
if quality_args[1] == "worst":
|
||||
stream=min(streams,key=get_quality_func)
|
||||
else:
|
||||
stream=max(streams,key=get_quality_func)
|
||||
except Exception as e:
|
||||
stream=max(streams,key=get_quality_func)
|
||||
|
||||
# determine episode_title
|
||||
if title:=stream.get("title"):
|
||||
episode_title = f"{episode_title} - {title}"
|
||||
parsed_episode_title = episode_title.replace(":","").replace("/", "").replace("\\","")
|
||||
episode_download_location = os.path.join(download_location,parsed_episode_title)
|
||||
if not os.path.exists(episode_download_location):
|
||||
os.mkdir(episode_download_location)
|
||||
|
||||
stream_url = stream.get("stream_url")
|
||||
audio_tracks = stream.get("audio_tracks")
|
||||
subtitles = stream.get("subtitle")
|
||||
|
||||
episode_info = {
|
||||
"episode":parsed_episode_title,
|
||||
"anime_title": anime_title
|
||||
}
|
||||
|
||||
# check if its adaptive or progressive and call the appropriate downloader
|
||||
if stream_url and subtitles and audio_tracks:
|
||||
cls.download_adaptive(stream_url,audio_tracks[0],subtitles[0],episode_download_location,on_episode_download_progress,episode_info)
|
||||
elif stream_url and subtitles:
|
||||
# probably wont occur
|
||||
cls.download_video_and_subtitles(stream_url,subtitles[0],episode_download_location,on_episode_download_progress,episode_info)
|
||||
else:
|
||||
cls.download_progressive(stream_url,episode_download_location,episode_info,on_episode_download_progress)
|
||||
|
||||
successful_downloads.append(episode_number)
|
||||
except:
|
||||
failed_downloads.append(episode_number)
|
||||
on_complete(successful_downloads,failed_downloads)
|
||||
|
||||
@classmethod
|
||||
def download_with_mpv(cls,url,output_path,on_progress):
|
||||
if mpv:=shutil.which("mpv"):
|
||||
process = Popen([mpv,url,f"--stream-dump={output_path}"],stderr=PIPE,text=True,stdout=PIPE)
|
||||
progress_regex = re.compile(r"\d+/\d+") # eg Dumping 2044776/125359745
|
||||
|
||||
for stream in process.stderr:
|
||||
if matches:=progress_regex.findall(stream):
|
||||
current_bytes,total_bytes = [float(val) for val in matches[0].split("/")]
|
||||
on_progress(current_bytes,total_bytes)
|
||||
return process.returncode
|
||||
else:
|
||||
return False
|
||||
|
||||
@classmethod
|
||||
def download_adaptive(cls,video_url,audio_url,sub_url,output_path,on_progress,episode_info):
|
||||
on_progress_ = lambda current_bytes,total_bytes: on_progress(current_bytes,total_bytes,episode_info)
|
||||
episode = episode_info.get("anime_title") + " - " + episode_info.get("episode").replace(" - ","; ")
|
||||
sub_filename = episode + ".ass"
|
||||
sub_filepath = os.path.join(output_path,sub_filename)
|
||||
is_sub_failure = cls.download_with_mpv(sub_url,sub_filepath,on_progress_)
|
||||
|
||||
audio_filename = episode + ".mp3"
|
||||
audio_filepath = os.path.join(output_path,audio_filename)
|
||||
is_audio_failure = cls.download_with_mpv(audio_url,audio_filepath,on_progress_)
|
||||
|
||||
video_filename = episode + ".mp4"
|
||||
video_filepath = os.path.join(output_path,video_filename)
|
||||
is_video_failure = cls.download_with_mpv(video_url,video_filepath,on_progress_)
|
||||
|
||||
if is_video_failure:
|
||||
raise Exception
|
||||
|
||||
@classmethod
|
||||
def download_video_and_subtitles(cls,video_url,sub_url,output_path,on_progress,episode_info):
|
||||
on_progress_ = lambda current_bytes,total_bytes: on_progress(current_bytes,total_bytes,episode_info)
|
||||
episode = episode_info.get("anime_title") + " - " + episode_info.get("episode").replace(" - ","; ")
|
||||
sub_filename = episode + ".ass"
|
||||
sub_filepath = os.path.join(output_path,sub_filename)
|
||||
is_sub_failure = cls.download_with_mpv(sub_url,sub_filepath,on_progress_)
|
||||
|
||||
video_filename = episode + ".mp4"
|
||||
video_filepath = os.path.join(output_path,video_filename)
|
||||
is_video_failure = cls.download_with_mpv(video_url,video_filepath,on_progress_)
|
||||
|
||||
if is_video_failure:
|
||||
raise Exception
|
||||
|
||||
@classmethod
|
||||
def download_progressive(cls,video_url,output_path,episode_info,on_progress):
|
||||
episode = episode_info.get("anime_title") + " - " + episode_info.get("episode").replace(" - ","; ")
|
||||
file_name = episode + ".mp4"
|
||||
download_location = os.path.join(output_path,file_name)
|
||||
on_progress_ = lambda current_bytes,total_bytes: on_progress(current_bytes,total_bytes,episode_info)
|
||||
isfailure = cls.download_with_mpv(video_url,download_location,on_progress_)
|
||||
if isfailure:
|
||||
raise Exception
|
||||
|
||||
|
||||
@classmethod
|
||||
def get_anime_match(cls,anime_item,title):
|
||||
return SequenceMatcher(None,title,anime_item[0]).ratio()
|
||||
return fuzz.ratio(title,anime_item[0])
|
||||
|
||||
@classmethod
|
||||
def get_anime_url_by_title(cls,title:str):
|
||||
result = cls.run_command(["search",title])
|
||||
result = cls.run_animdl_command(["search",title])
|
||||
possible_animes = cls.output_parser(result)
|
||||
if possible_animes:
|
||||
anime_url = max(possible_animes.items(),key=lambda anime_item:cls.get_anime_match(anime_item,title))
|
||||
return anime_url # {"title","anime url"}
|
||||
anime = max(possible_animes.items(),key=lambda anime_item:cls.get_anime_match(anime_item,title))
|
||||
return anime # {"title","anime url"}
|
||||
return None
|
||||
|
||||
@classmethod
|
||||
def get_stream_urls_by_anime_url(cls,anime_url:str):
|
||||
if anime_url:
|
||||
try:
|
||||
result = cls.run_command(["grab",anime_url])
|
||||
return [json.loads(episode.strip()) for episode in result.stdout.strip().split("\n")]
|
||||
except:
|
||||
return None
|
||||
return None
|
||||
def get_stream_urls_by_anime_url(cls,anime_url:str,episodes_range=None):
|
||||
if not anime_url:
|
||||
return None
|
||||
try:
|
||||
cmd = ["grab",anime_url,"-r",episodes_range] if episodes_range else ["grab",anime_url]
|
||||
result = cls.run_animdl_command(cmd)
|
||||
return [json.loads(episode.strip()) for episode in result.stdout.strip().split("\n")]
|
||||
except:
|
||||
return None
|
||||
|
||||
@classmethod
|
||||
def get_stream_urls_by_anime_title(cls,title:str):
|
||||
def get_stream_urls_by_anime_title(cls,title:str,episodes_range=None):
|
||||
anime = cls.get_anime_url_by_title(title)
|
||||
if anime:
|
||||
return anime[0],cls.get_stream_urls_by_anime_url(anime[1])
|
||||
return None
|
||||
|
||||
if not anime:
|
||||
return None
|
||||
return anime[0],cls.get_stream_urls_by_anime_url(anime[1],episodes_range)
|
||||
|
||||
@classmethod
|
||||
def contains_only_spaces(cls,input_string):
|
||||
@@ -60,12 +222,18 @@ class AnimdlApi:
|
||||
item = data_item.split(" / ")
|
||||
numbering = r"^\d*\.\s*"
|
||||
try:
|
||||
|
||||
anime_title = re.sub(numbering,'',item[0]).lower()
|
||||
# special case for onepiece since allanime labels it as 1p instead of onepiece
|
||||
one_piece_regex = re.compile(r"1p",re.IGNORECASE)
|
||||
if one_piece_regex.match(anime_title):
|
||||
anime_title = "one piece"
|
||||
|
||||
if item[1] == "" or cls.contains_only_spaces(item[1]):
|
||||
pass_next = True
|
||||
|
||||
parsed_data.update({f"{re.sub(numbering,'',item[0])}":f"{data[i+1]}"})
|
||||
parsed_data.update({f"{anime_title}":f"{data[i+1]}"})
|
||||
else:
|
||||
parsed_data.update({f"{re.sub(numbering,'',item[0])}":f"{item[1]}"})
|
||||
parsed_data.update({f"{anime_title}":f"{item[1]}"})
|
||||
except:
|
||||
pass
|
||||
return parsed_data
|
||||
@@ -73,10 +241,22 @@ class AnimdlApi:
|
||||
|
||||
if __name__ == "__main__":
|
||||
# for anime_title,url in AnimdlApi.get_anime_url_by_title("jujutsu").items():
|
||||
# t = AnimdlApi.get_stream_urls_by_anime_url("https://allanime.to/anime/LYKSutL2PaAjYyXWz")
|
||||
start = time.time()
|
||||
t = AnimdlApi.get_stream_urls_by_anime_title("KONOSUBA -God's Blessing on This Wonderful World! 3")
|
||||
# t = AnimdlApi.get_stream_urls_by_anime_url("https://allanime.to/anime/LYKSutL2PaAjYyXWz")
|
||||
title = input("enter title: ")
|
||||
e_range = input("enter range: ")
|
||||
# t = AnimdlApi.download_anime_by_title(title,lambda *args:print(f"done ep: {args}"),lambda *args:print(f"done {args}"),episodes_range=e_range,quality="worst")
|
||||
t=AnimdlApi.stream_anime_by_title(title,e_range)
|
||||
# t = os.mkdir("kol")
|
||||
# t = run([shutil.which("python"),"--version"])
|
||||
# while t.stderr:
|
||||
# print(p,t.stderr)
|
||||
# for line in t.stderr:
|
||||
|
||||
# print(line)
|
||||
# print("o")
|
||||
delta = time.time() - start
|
||||
print(t)
|
||||
print(t,shutil.which("python"))
|
||||
# print(json.dumps(t[1]))
|
||||
print(f"Took: {delta} secs")
|
||||
|
||||
|
||||
118
app/libs/animdl/qu.graphql
Normal file
118
app/libs/animdl/qu.graphql
Normal file
@@ -0,0 +1,118 @@
|
||||
{
|
||||
Page{
|
||||
media(id:90) {
|
||||
title {
|
||||
romaji
|
||||
english
|
||||
}
|
||||
coverImage {
|
||||
extraLarge
|
||||
}
|
||||
characters(perPage: 10, sort: FAVOURITES_DESC) {
|
||||
edges {
|
||||
node {
|
||||
name {
|
||||
full
|
||||
|
||||
}
|
||||
gender
|
||||
dateOfBirth {
|
||||
year
|
||||
month
|
||||
day
|
||||
}
|
||||
age
|
||||
image {
|
||||
medium
|
||||
}
|
||||
description
|
||||
}
|
||||
voiceActors {
|
||||
name {
|
||||
full
|
||||
}
|
||||
image {
|
||||
medium
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
studios {
|
||||
nodes {
|
||||
name
|
||||
isAnimationStudio
|
||||
}
|
||||
}
|
||||
season
|
||||
format
|
||||
status
|
||||
seasonYear
|
||||
description
|
||||
genres
|
||||
synonyms
|
||||
startDate {
|
||||
year
|
||||
month
|
||||
day
|
||||
}
|
||||
endDate {
|
||||
year
|
||||
month
|
||||
day
|
||||
}
|
||||
duration
|
||||
countryOfOrigin
|
||||
averageScore
|
||||
source
|
||||
hashtag
|
||||
siteUrl
|
||||
tags {
|
||||
name
|
||||
rank
|
||||
}
|
||||
reviews(sort: SCORE_DESC, perPage: 6) {
|
||||
nodes {
|
||||
summary
|
||||
user {
|
||||
name
|
||||
avatar {
|
||||
medium
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
recommendations(sort: RATING_DESC, perPage: 15) {
|
||||
nodes {
|
||||
rating
|
||||
mediaRecommendation {
|
||||
title {
|
||||
romaji
|
||||
english
|
||||
native
|
||||
userPreferred
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
relations {
|
||||
nodes {
|
||||
title {
|
||||
romaji
|
||||
english
|
||||
native
|
||||
}
|
||||
}
|
||||
}
|
||||
externalLinks {
|
||||
url
|
||||
site
|
||||
icon
|
||||
}
|
||||
rankings {
|
||||
rank
|
||||
context
|
||||
}
|
||||
bannerImage
|
||||
}
|
||||
}
|
||||
}
|
||||
68
app/main.py
68
app/main.py
@@ -1,36 +1,65 @@
|
||||
# from kivy.config import Config
|
||||
# Config.set('kivy', 'window_icon', "logo.ico")
|
||||
# Config.write()
|
||||
import os
|
||||
from kivy.loader import Loader
|
||||
Loader.num_workers = 5
|
||||
Loader.max_upload_per_frame = 5
|
||||
from libs.animdl.animdl_api import AnimdlApi
|
||||
os.environ["KIVY_VIDEO"] = "ffpyplayer"
|
||||
from kivymd.icon_definitions import md_icons
|
||||
import json
|
||||
|
||||
from queue import Queue
|
||||
from threading import Thread
|
||||
import plyer
|
||||
from kivymd.app import MDApp
|
||||
from kivy.uix.screenmanager import ScreenManager,FadeTransition
|
||||
from kivy.clock import Clock
|
||||
from kivy.storage.jsonstore import JsonStore
|
||||
from datetime import date
|
||||
from subprocess import Popen
|
||||
|
||||
user_data = JsonStore("user_data.json")
|
||||
|
||||
today = date.today()
|
||||
if not(user_data.exists("my_list")):
|
||||
user_data.put("my_list",list=[])
|
||||
|
||||
if not(user_data.exists("yt_stream_links")):
|
||||
user_data.put("yt_stream_links",links=[])
|
||||
yt_cache = JsonStore("yt_cache.json")
|
||||
if not(yt_cache.exists("yt_stream_links")):
|
||||
yt_cache.put("yt_stream_links",**{f"{today}":[]})
|
||||
elif not( yt_cache.get("yt_stream_links").get(f"{today}")):
|
||||
yt_cache.put("yt_stream_links",**{f"{today}":[]})
|
||||
|
||||
|
||||
from View.screens import screens
|
||||
# plyer.
|
||||
class AninformaApp(MDApp):
|
||||
class AniXStreamApp(MDApp):
|
||||
queue = Queue()
|
||||
animdl_streaming_subprocess:Popen|None = None
|
||||
def worker(self,queue:Queue):
|
||||
while True:
|
||||
task = queue.get() # task should be a function
|
||||
task()
|
||||
self.queue.task_done()
|
||||
|
||||
|
||||
def __init__(self, **kwargs):
|
||||
super().__init__(**kwargs)
|
||||
self.load_all_kv_files(self.directory)
|
||||
self.theme_cls.theme_style = "Dark"
|
||||
self.theme_cls.primary_palette = "Orange"
|
||||
self.theme_cls.primary_palette = "Lightcoral"
|
||||
self.manager_screens = ScreenManager()
|
||||
self.manager_screens.transition = FadeTransition()
|
||||
|
||||
# initialize worker
|
||||
self.worker_thread = Thread(target=self.worker,args=(self.queue,))
|
||||
self.worker_thread.daemon = True
|
||||
self.worker_thread.start()
|
||||
|
||||
def build(self) -> ScreenManager:
|
||||
self.generate_application_screens()
|
||||
self.anime_screen = self.manager_screens.get_screen("anime screen")
|
||||
self.search_screen = self.manager_screens.get_screen("search screen")
|
||||
return self.manager_screens
|
||||
|
||||
def on_start(self,*args):
|
||||
@@ -44,6 +73,29 @@ class AninformaApp(MDApp):
|
||||
view.manager_screens = self.manager_screens
|
||||
view.name = name_screen
|
||||
self.manager_screens.add_widget(view)
|
||||
|
||||
# others
|
||||
def search_for_anime(self,search_field,**kwargs):
|
||||
if self.manager_screens.current != "search screen":
|
||||
self.manager_screens.current = "search screen"
|
||||
self.search_screen.handle_search_for_anime(search_field,**kwargs)
|
||||
|
||||
def show_anime_screen(self,id):
|
||||
self.manager_screens.current = "anime screen"
|
||||
self.anime_screen.controller.update_anime_view(id)
|
||||
|
||||
def stream_anime_with_animdl(self,title):
|
||||
self.animdl_streaming_subprocess = AnimdlApi.stream_anime_by_title(title)
|
||||
self.stop_streaming = False
|
||||
|
||||
def watch_on_animdl(self,title_dict:dict):
|
||||
if self.animdl_streaming_subprocess:
|
||||
self.animdl_streaming_subprocess.terminate()
|
||||
if title:=title_dict.get("japanese"):
|
||||
stream_func = lambda: self.stream_anime_with_animdl(title)
|
||||
self.queue.put(stream_func)
|
||||
elif title:=title_dict.get("english"):
|
||||
stream_func = lambda:self.stream_anime_with_animdl(title)
|
||||
self.queue.put(stream_func)
|
||||
|
||||
if __name__ == "__main__":
|
||||
AninformaApp().run()
|
||||
AniXStreamApp().run()
|
||||
|
||||
@@ -3,4 +3,5 @@ pytube
|
||||
ffpyplayer
|
||||
plyer
|
||||
https://github.com/kivymd/KivyMD/archive/master.zip
|
||||
|
||||
fuzzywuzzy
|
||||
python-Levenshtein
|
||||
1
app/search.json
Normal file
1
app/search.json
Normal file
@@ -0,0 +1 @@
|
||||
{"data": {"Page": {"pageInfo": {"total": 1, "currentPage": 1, "hasNextPage": false}, "media": [{"id": 21, "title": {"romaji": "ONE PIECE", "english": "ONE PIECE"}, "coverImage": {"medium": "https://s4.anilist.co/file/anilistcdn/media/anime/cover/small/bx21-YCDoj1EkAxFn.jpg"}, "trailer": null, "popularity": 521138, "favourites": 76037, "averageScore": 88, "episodes": null, "genres": ["Action", "Adventure", "Comedy", "Drama", "Fantasy"], "studios": {"nodes": [{"name": "Toei Animation", "favourites": 3149}, {"name": "Funimation", "favourites": 928}, {"name": "Fuji TV", "favourites": 71}, {"name": "4Kids Entertainment", "favourites": 30}, {"name": "TAP", "favourites": 4}, {"name": "Asatsu DK", "favourites": 4}, {"name": "Magic Bus", "favourites": 28}, {"name": "Mushi Production", "favourites": 64}, {"name": "Studio Guts", "favourites": 3}, {"name": "Asahi Production", "favourites": 30}, {"name": "Avex Pictures", "favourites": 13}]}, "tags": [{"name": "Pirates"}, {"name": "Travel"}, {"name": "Ensemble Cast"}, {"name": "Shounen"}, {"name": "Super Power"}, {"name": "Found Family"}, {"name": "Male Protagonist"}, {"name": "Slapstick"}, {"name": "Tragedy"}, {"name": "Ships"}, {"name": "Conspiracy"}, {"name": "Time Skip"}, {"name": "Slavery"}, {"name": "Politics"}, {"name": "Crime"}, {"name": "Fugitive"}, {"name": "War"}, {"name": "Dystopian"}, {"name": "Gods"}, {"name": "Lost Civilization"}, {"name": "Swordplay"}, {"name": "Anthropomorphism"}, {"name": "Prison"}, {"name": "Samurai"}, {"name": "Medicine"}, {"name": "Food"}, {"name": "Monster Boy"}, {"name": "Henshin"}, {"name": "Robots"}, {"name": "Shapeshifting"}, {"name": "Cyborg"}, {"name": "Primarily Adult Cast"}, {"name": "Artificial Intelligence"}, {"name": "Anti-Hero"}, {"name": "Coming of Age"}, {"name": "Animals"}, {"name": "Guns"}, {"name": "Desert"}, {"name": "Trains"}, {"name": "Skeleton"}, {"name": "Marriage"}, {"name": "Post-Apocalyptic"}, {"name": "Anachronism"}, {"name": "Espionage"}, {"name": "Monster Girl"}, {"name": "Fairy"}, {"name": "Dragons"}, {"name": "Philosophy"}, {"name": "Drugs"}, {"name": "Female Protagonist"}, {"name": "Assassins"}, {"name": "Asexual"}, {"name": "Clone"}, {"name": "Kuudere"}, {"name": "Adoption"}, {"name": "Ninja"}, {"name": "Gender Bending"}, {"name": "Revenge"}, {"name": "Angels"}, {"name": "Mermaid"}, {"name": "Battle Royale"}, {"name": "CGI"}, {"name": "Time Manipulation"}, {"name": "Musical"}, {"name": "LGBTQ+ Themes"}, {"name": "Female Harem"}, {"name": "Zombie"}, {"name": "Body Swapping"}, {"name": "Unrequited Love"}, {"name": "Achromatic"}, {"name": "Acting"}], "startDate": {"year": 1999, "month": 10, "day": 20}, "endDate": {"year": null, "month": null, "day": null}, "status": "RELEASING", "description": "Gold Roger was known as the Pirate King, the strongest and most infamous being to have sailed the Grand Line. The capture and death of Roger by the World Government brought a change throughout the world. His last words before his death revealed the location of the greatest treasure in the world, One Piece. It was this revelation that brought about the Grand Age of Pirates, men who dreamed of finding One Piece (which promises an unlimited amount of riches and fame), and quite possibly the most coveted of titles for the person who found it, the title of the Pirate King.<br><br>\nEnter Monkey D. Luffy, a 17-year-old boy that defies your standard definition of a pirate. Rather than the popular persona of a wicked, hardened, toothless pirate who ransacks villages for fun, Luffy\u2019s reason for being a pirate is one of pure wonder; the thought of an exciting adventure and meeting new and intriguing people, along with finding One Piece, are his reasons of becoming a pirate. Following in the footsteps of his childhood hero, Luffy and his crew travel across the Grand Line, experiencing crazy adventures, unveiling dark mysteries and battling strong enemies, all in order to reach One Piece.<br><br>\n<b>*This includes following special episodes:</b><br>\n- Chopperman to the Rescue! Protect the TV Station by the Shore! (Episode 336)<br>\n- The Strongest Tag-Team! Luffy and Toriko's Hard Struggle! (Episode 492)<br>\n- Team Formation! Save Chopper (Episode 542)<br>\n- History's Strongest Collaboration vs. Glutton of the Sea (Episode 590)<br>\n- 20th Anniversary! Special Romance Dawn (Episode 907)", "nextAiringEpisode": {"timeUntilAiring": 328669, "airingAt": 1716683400, "episode": 1106}}]}}}
|
||||
84
app/temp/temp.py
Normal file
84
app/temp/temp.py
Normal file
@@ -0,0 +1,84 @@
|
||||
# # import plyer
|
||||
|
||||
# # plyer.notification.notify(app_name="Aninforma",message="hello",title="Anime Update") # type: ignore
|
||||
|
||||
# from kivy.properties import StringProperty
|
||||
# from kivy.uix.widget import Widget
|
||||
# def get_prop():
|
||||
# return StringProperty()
|
||||
|
||||
# class app(Widget):
|
||||
# def awe(self):
|
||||
# self.prop = get_prop
|
||||
|
||||
# def on_prop(self,value,instance):
|
||||
# print(
|
||||
import requests
|
||||
from inspect import isgenerator
|
||||
from typing import Generator
|
||||
|
||||
def jo():
|
||||
|
||||
if False:
|
||||
return {}
|
||||
else:
|
||||
def _f():
|
||||
for i in [1,2,3,4]:
|
||||
yield i
|
||||
return _f()
|
||||
|
||||
# url = "https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/9v/lr/n230705er39jxogp0ap3b823gkkylr9v-1-261210110000.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806416&gen=playurlv2&os=akam&oi=2823883151&trid=cdad1de563c743629bdbef3a82d44df0i&mid=1715226141&platform=pc&upsig=02ff8e9f9060bc3437356a7cb6cc1ed1&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806416~hmac=836a02ef21ecc1a02034d7d10083bdf97103df2a586d8ba6009d8521abd855ac&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0"
|
||||
|
||||
# url = "https://allanime.pro/apiak/sk.json?sub=dx-ep-LYKSutL2PaAjYyXWz_1_sub_English"
|
||||
|
||||
# url = "https://upos-bstar1-mirrorakam.akamaized.net/iupxcodeboss/9v/lr/n230705er39jxogp0ap3b823gkkylr9v-1-2d1301000023.m4s?e=ig8euxZM2rNcNbdlhoNvNC8BqJIzNbfqXBvEqxTEto8BTrNvN0GvT90W5JZMkX_YN0MvXg8gNEV4NC8xNEV4N03eN0B5tZlqNxTEto8BTrNvNeZVuJ10Kj_g2UB02J0mN0B5tZlqNCNEto8BTrNvNC7MTX502C8f2jmMQJ6mqF2fka1mqx6gqj0eN0B599M=&uipk=5&nbs=1&deadline=1715806416&gen=playurlv2&os=akam&oi=2823883151&trid=cdad1de563c743629bdbef3a82d44df0i&mid=1715226141&platform=pc&upsig=419c3e929cd04770d08cb0eb8f95470d&uparams=e,uipk,nbs,deadline,gen,os,oi,trid,mid,platform&hdnts=exp=1715806416~hmac=93ee08fbb96878bc55af2ed52bf9d176d96d93656ff865d59ed817bb04ecdedc&bvc=vod&nettype=0&orderid=0,1&logo=00000000&f=i_0_0"
|
||||
|
||||
url = "https://video.wixstatic.com/video/7ef2fd_c718a462da2b43c9b1cae21babfadf2c/480p/mp4/file.mp4"
|
||||
|
||||
# r = requests.get(url)
|
||||
|
||||
|
||||
# for cont in r.iter_content(chunk_size=8*1024):
|
||||
# print(cont)
|
||||
from subprocess import run,Popen,PIPE
|
||||
import re
|
||||
def download_with_mpv(url,output_path):
|
||||
process = Popen(["mpv",url,f"--stream-dump={output_path}"],stderr=PIPE,text=True)
|
||||
progress_regex = re.compile(r"\d+/\d+") # eg Dumping 2044776/125359745
|
||||
|
||||
for stream in process.stderr:
|
||||
if matches:=progress_regex.findall(stream):
|
||||
# current_bytes,total_bytes = [float(val) for val in matches[0].split("/")]
|
||||
print(matches)
|
||||
# print("percentage download: ",(current_bytes/total_bytes)*100,"%")
|
||||
|
||||
else:
|
||||
print("hmm")
|
||||
|
||||
|
||||
def progress(stream):
|
||||
buffer = b""
|
||||
for line in iter(lambda: stream.read(),b""):
|
||||
# match = progress_regex.search(line)
|
||||
# if match:
|
||||
# progress = match.group(1)
|
||||
buffer += line
|
||||
if buffer:
|
||||
yield line
|
||||
print(f"Progress: {line}%")
|
||||
|
||||
# from tqdm import tqdm
|
||||
|
||||
# tqdm.
|
||||
|
||||
from multiprocessing import Process
|
||||
import time
|
||||
pr = Process(target=lambda *_:print("io"),args=(url,"./vid.mp4"))
|
||||
pr.start()
|
||||
|
||||
time.sleep(5)
|
||||
# print(r.content)
|
||||
# print(r.headers)
|
||||
# d = jo()
|
||||
# h = {}
|
||||
# print(isgenerator(d))
|
||||
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user