successfully completed search page

This commit is contained in:
Benex254
2024-08-05 09:46:53 +03:00
parent 0b3ea92120
commit 548deaadc5
60 changed files with 4819 additions and 678 deletions

174
.gitignore vendored
View File

@@ -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/

View File

@@ -1 +1 @@
3.12
3.10

View File

@@ -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

View 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)

View File

@@ -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)

View File

@@ -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

View File

@@ -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
View 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)

View 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()

View File

@@ -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

View File

@@ -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
View 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']

View File

@@ -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

View 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:

View 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"]

View 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

View 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"

View 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

View 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

View 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"])

View 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

View 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:

View 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"

View File

@@ -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()

View File

@@ -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"

View File

@@ -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:

View File

@@ -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

View 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")

View 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()

View 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"

View File

@@ -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

View File

@@ -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)

View File

@@ -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

View File

@@ -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.

View File

@@ -0,0 +1,3 @@
<MDLabel>:
allow_copy:True
allow_selection:True

View File

@@ -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

View 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

View File

@@ -0,0 +1,3 @@
<Tooltip>
MDTooltipPlain:
text:root.tooltip_text

View File

@@ -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"

View File

@@ -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)

View 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"

View 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"

View File

@@ -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
View File

@@ -0,0 +1,3 @@
default_player: mpv
default_provider: allanime
quality_string: "1080/best"

969
app/anime.json Normal file
View 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 &amp; 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&#039;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&#039;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 &#039;Jupiter Jazz&#039;. 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&#039; 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 &quot;The station will hear from her agent about this!&quot; 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&#039;s a member of YMCA, Young Man&#039;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"
}
]
}
}
}

View File

@@ -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)

View File

@@ -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)

425
app/libs/animdl/a.json Normal file
View 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

File diff suppressed because it is too large Load Diff

View File

@@ -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
View 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
}
}
}

View File

@@ -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()

View File

@@ -3,4 +3,5 @@ pytube
ffpyplayer
plyer
https://github.com/kivymd/KivyMD/archive/master.zip
fuzzywuzzy
python-Levenshtein

1
app/search.json Normal file
View 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
View 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