doc and style: formatted the whole codebase to pep8 plus added documentation where necessary

This commit is contained in:
Benedict Xavier Wanyonyi
2024-05-30 15:43:45 +03:00
parent e526e31083
commit b94987dfd7
54 changed files with 555 additions and 346 deletions

View File

@@ -19,6 +19,7 @@ from .components import (
class AnimeScreenView(BaseScreenView):
"""The anime screen view"""
caller_screen_name = StringProperty()
header: AnimeHeader = ObjectProperty()
side_bar: AnimeSideBar = ObjectProperty()

View File

@@ -31,7 +31,7 @@
padding:"10dp"
orientation:"vertical"
StreamDialogHeaderLabel:
text:"Stream on Animdl"
text:"Stream Anime"
StreamDialogLabel:
text:"Title"
MDTextField:

View File

@@ -1,20 +1,35 @@
from kivy.clock import Clock
from kivy.uix.modalview import ModalView
from kivymd.uix.behaviors import StencilBehavior,CommonElevationBehavior,BackgroundColorBehavior
from kivymd.uix.behaviors import (
StencilBehavior,
CommonElevationBehavior,
BackgroundColorBehavior,
)
from kivymd.theming import ThemableBehavior
class AnimdlStreamDialog(ThemableBehavior,StencilBehavior,CommonElevationBehavior,BackgroundColorBehavior,ModalView):
def __init__(self,data,mpv,**kwargs):
class AnimdlStreamDialog(
ThemableBehavior,
StencilBehavior,
CommonElevationBehavior,
BackgroundColorBehavior,
ModalView,
):
"""The anime streaming dialog"""
def __init__(self, data, mpv, **kwargs):
super().__init__(**kwargs)
self.data = data
self.mpv=mpv
if title:=data["title"].get("romaji"):
self.mpv = mpv
if title := data["title"].get("romaji"):
self.ids.title_field.text = title
elif title:=data["title"].get("english"):
elif title := data["title"].get("english"):
self.ids.title_field.text = title
self.ids.quality_field.text = "best"
def stream_anime(self,app):
def _stream_anime(self, app):
if self.mpv:
streaming_cmds = {}
title = self.ids.title_field.text
@@ -27,7 +42,7 @@ class AnimdlStreamDialog(ThemableBehavior,StencilBehavior,CommonElevationBehavio
quality = self.ids.quality_field.text
if quality:
streaming_cmds["quality"] = quality
else:
else:
streaming_cmds["quality"] = "best"
app.watch_on_animdl(streaming_cmds)
@@ -38,14 +53,17 @@ class AnimdlStreamDialog(ThemableBehavior,StencilBehavior,CommonElevationBehavio
episodes_range = self.ids.range_field.text
if episodes_range:
cmds = [*cmds,"-r",episodes_range]
cmds = [*cmds, "-r", episodes_range]
latest = self.ids.latest_field.text
if latest:
cmds = [*cmds,"-s",latest]
cmds = [*cmds, "-s", latest]
quality = self.ids.quality_field.text
if quality:
cmds = [*cmds,"-q",quality]
cmds = [*cmds, "-q", quality]
app.watch_on_animdl(custom_options = cmds)
app.watch_on_animdl(custom_options=cmds)
def stream_anime(self, app):
Clock.schedule_once(lambda _: self._stream_anime(app))

View File

@@ -1,46 +1,56 @@
from kivy.properties import ObjectProperty,ListProperty
from kivy.clock import Clock
from kivy.properties import ObjectProperty, ListProperty
from kivymd.uix.boxlayout import MDBoxLayout
class AnimeCharacter(MDBoxLayout):
voice_actors = ObjectProperty({
"name":"",
"image":""
})
character = ObjectProperty({
"name":"",
"gender":"",
"dateOfBirth":"",
"image":"",
"age":"",
"description":""
})
"""an Anime character data"""
voice_actors = ObjectProperty({"name": "", "image": ""})
character = ObjectProperty(
{
"name": "",
"gender": "",
"dateOfBirth": "",
"image": "",
"age": "",
"description": "",
}
)
class AnimeCharacters(MDBoxLayout):
"""The anime characters card"""
container = ObjectProperty()
characters = ListProperty()
def on_characters(self,instance,characters):
format_date = lambda date_: f"{date_['day']}/{date_['month']}/{date_['year']}" if date_ else ""
def update_characters_card(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)
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"]
"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])
"name": ", ".join([actor["name"]["full"] for actor in actors])
}
# anime_character.voice_actor =
self.container.add_widget(anime_character)
def on_characters(self, *args):
Clock.schedule_once(lambda _: self.update_characters_card(*args))

View File

@@ -3,6 +3,7 @@
padding:"10dp"
spacing:"10dp"
pos_hint: {'center_x': 0.5}
# StackLayout:
MDButton:
on_press:
root.screen.add_to_user_anime_list()

View File

@@ -4,4 +4,6 @@ from kivymd.uix.boxlayout import MDBoxLayout
class Controls(MDBoxLayout):
"""The diferent controls available"""
screen = ObjectProperty()

View File

@@ -1,16 +1,3 @@
# <DescriptionHeader>
# adaptive_height:True
# md_bg_color:self.theme_cls.secondaryContainerColor
# MDLabel:
# text:root.text
# adaptive_height:True
# max_lines:0
# shorten:False
# bold:True
# font_style: "Body"
# role: "large"
# padding:"10dp"
<DescriptionContainer@MDBoxLayout>:
adaptive_height:True
md_bg_color:self.theme_cls.surfaceContainerLowColor

View File

@@ -4,5 +4,6 @@ from kivymd.uix.boxlayout import MDBoxLayout
class AnimeDescription(MDBoxLayout):
description = StringProperty()
"""The anime description"""
description = StringProperty()

View File

@@ -1,26 +1,41 @@
from kivy.uix.modalview import ModalView
from kivymd.uix.behaviors import StencilBehavior,CommonElevationBehavior,BackgroundColorBehavior
from kivymd.uix.behaviors import (
StencilBehavior,
CommonElevationBehavior,
BackgroundColorBehavior,
)
from kivymd.theming import ThemableBehavior
# from main import AniXStreamApp
class DownloadAnimeDialog(ThemableBehavior,StencilBehavior,CommonElevationBehavior,BackgroundColorBehavior,ModalView):
def __init__(self,data,**kwargs):
super(DownloadAnimeDialog,self).__init__(**kwargs)
class DownloadAnimeDialog(
ThemableBehavior,
StencilBehavior,
CommonElevationBehavior,
BackgroundColorBehavior,
ModalView,
):
"""The download anime dialog"""
def __init__(self, data, **kwargs):
super(DownloadAnimeDialog, self).__init__(**kwargs)
self.data = data
self.anime_id = self.data["id"]
if title:=data["title"].get("romaji"):
if title := data["title"].get("romaji"):
self.ids.title_field.text = title
elif title:=data["title"].get("english"):
elif title := data["title"].get("english"):
self.ids.title_field.text = title
self.ids.quality_field.text = "best"
def download_anime(self,app):
def download_anime(self, app):
default_cmds = {}
title=self.ids.title_field.text
title = self.ids.title_field.text
default_cmds["title"] = title
if episodes_range:=self.ids.range_field.text:
if episodes_range := self.ids.range_field.text:
default_cmds["episodes_range"] = episodes_range
if quality:=self.ids.range_field.text:
if quality := self.ids.range_field.text:
default_cmds["quality"] = quality
# print(title,episodes_range,latest,quality)
app.download_anime(self.anime_id,default_cmds)
app.download_anime(self.anime_id, default_cmds)

View File

@@ -1,7 +1,6 @@
<AnimeHeader>:
adaptive_height:True
orientation: 'vertical'
# padding:"10dp"
MDBoxLayout:
adaptive_height:True
md_bg_color:self.theme_cls.secondaryContainerColor

View File

@@ -6,4 +6,3 @@ from kivymd.uix.boxlayout import MDBoxLayout
class AnimeHeader(MDBoxLayout):
titles = StringProperty()
banner_image = StringProperty()

View File

@@ -6,9 +6,8 @@ from kivymd.uix.boxlayout import MDBoxLayout
class RankingsBar(MDBoxLayout):
rankings = DictProperty(
{
"Popularity":0,
"Favourites":0,
"AverageScore":0,
"Popularity": 0,
"Favourites": 0,
"AverageScore": 0,
}
)

View File

@@ -1,26 +1,29 @@
from kivy.properties import ObjectProperty,ListProperty
from kivy.properties import ObjectProperty, ListProperty
from kivy.clock import Clock
from kivymd.uix.boxlayout import MDBoxLayout
class AnimeReview(MDBoxLayout):
review = ObjectProperty({
"username":"",
"avatar":"",
"summary":""
})
review = ObjectProperty({"username": "", "avatar": "", "summary": ""})
class AnimeReviews(MDBoxLayout):
"""anime reviews"""
reviews = ListProperty()
container = ObjectProperty()
def on_reviews(self,instance,reviews):
def on_reviews(self, *args):
Clock.schedule_once(lambda _: self.update_reviews_card(*args))
def update_reviews_card(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"]
"username": review["user"]["name"],
"avatar": review["user"]["avatar"]["medium"],
"summary": review["summary"],
}
self.container.add_widget(review_)

View File

@@ -7,8 +7,6 @@
spacing:"10dp"
orientation: 'vertical'
pos_hint: {'center_x': 0.5}
<SideBarLabel>:
adaptive_height:True
max_lines:0

View File

@@ -1,4 +1,4 @@
from kivy.properties import ObjectProperty,StringProperty,DictProperty,ListProperty
from kivy.properties import ObjectProperty, StringProperty, DictProperty, ListProperty
from kivy.utils import get_hex_from_color
from kivy.factory import Factory
@@ -10,34 +10,42 @@ class HeaderLabel(MDBoxLayout):
text = StringProperty()
halign = StringProperty("center")
Factory.register("HeaderLabel", HeaderLabel)
class SideBarLabel(MDLabel):
pass
# TODO:Switch to using the kivy_markup_module
class AnimeSideBar(MDBoxLayout):
screen = ObjectProperty()
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":"",
})
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()
@@ -45,7 +53,7 @@ class AnimeSideBar(MDBoxLayout):
tags = ListProperty()
tags_container = ObjectProperty()
def on_statistics(self,instance,value):
def on_statistics(self, instance, value):
self.statistics_container.clear_widgets()
header = HeaderLabel()
header.text = "Rankings"
@@ -56,10 +64,11 @@ class AnimeSideBar(MDBoxLayout):
label.text = "[color={}]{}:[/color] {}".format(
get_hex_from_color(label.theme_cls.primaryColor),
stat[0].capitalize(),
f"{stat[1]}")
f"{stat[1]}",
)
self.statistics_container.add_widget(label)
def on_tags(self,instance,value):
def on_tags(self, instance, value):
self.tags_container.clear_widgets()
header = HeaderLabel()
header.text = "Tags"
@@ -69,11 +78,11 @@ class AnimeSideBar(MDBoxLayout):
label.text = "[color={}]{}:[/color] {}".format(
get_hex_from_color(label.theme_cls.primaryColor),
tag[0].capitalize(),
f"{tag[1]} %")
f"{tag[1]} %",
)
self.tags_container.add_widget(label)
def on_external_links(self,instance,value):
def on_external_links(self, instance, value):
self.external_links_container.clear_widgets()
header = HeaderLabel()
header.text = "External Links"
@@ -84,5 +93,6 @@ class AnimeSideBar(MDBoxLayout):
label.text = "[color={}]{}:[/color] {}".format(
get_hex_from_color(label.theme_cls.primaryColor),
site[0].capitalize(),
site[1])
site[1],
)
self.external_links_container.add_widget(label)

View File

@@ -3,6 +3,7 @@ from View.base_screen import BaseScreenView
class CrashLogScreenView(BaseScreenView):
"""The crash log screen"""
main_container = ObjectProperty()
def model_is_changed(self) -> None:
"""

View File

@@ -25,4 +25,4 @@
theme_text_color:"Secondary"
text:color_text(root.episodes_to_download,root.theme_cls.secondaryColor)
MDIcon:
icon:"check-bold"
icon:"download"

View File

@@ -4,29 +4,29 @@ from kivy.logger import Logger
from kivy.utils import format_bytes_to_human
from View.base_screen import BaseScreenView
from .components.task_card import TaskCard
from .components.task_card import TaskCard
class DownloadsScreenView(BaseScreenView):
main_container = ObjectProperty()
progress_bar = ObjectProperty()
download_progress_label = ObjectProperty()
def on_new_download_task(self,anime_title:str,episodes:str|None):
def on_new_download_task(self, anime_title: str, episodes: str | None):
if not episodes:
episodes = "All"
self.main_container.add_widget(TaskCard(anime_title,episodes))
Clock.schedule_once(
lambda _: self.main_container.add_widget(TaskCard(anime_title, episodes))
)
def on_episode_download_progress(self,current_bytes_downloaded,total_bytes,episode_info):
percentage_completion = round((current_bytes_downloaded/total_bytes)*100)
def on_episode_download_progress(
self, current_bytes_downloaded, total_bytes, episode_info
):
percentage_completion = round((current_bytes_downloaded / total_bytes) * 100)
progress_text = f"Downloading: {episode_info['anime_title']} - {episode_info['episode']} ({format_bytes_to_human(current_bytes_downloaded)}/{format_bytes_to_human(total_bytes)})"
if (percentage_completion%5)==0:
self.progress_bar.value= max(min(percentage_completion,100),0)
if (percentage_completion % 5) == 0:
self.progress_bar.value = max(min(percentage_completion, 100), 0)
self.download_progress_label.text = progress_text
Logger.info(f"Downloader: {progress_text}")
# def on_enter(self):
# Clock.schedule_once(lambda _:self.controller.requested_update_my_list_screen())
def update_layout(self,widget):
def update_layout(self, widget):
self.user_anime_list_container.add_widget(widget)

View File

@@ -1,8 +1,6 @@
#:import get_color_from_hex kivy.utils.get_color_from_hex
#:import StringProperty kivy.properties.StringProperty
<HelpCard@MDBoxLayout>
spacing:"10dp"
orientation:"vertical"

View File

@@ -4,11 +4,13 @@ from View.base_screen import BaseScreenView
from Utility.kivy_markup_helper import bolden, color_text, underline
from Utility.data import themes_available
class HelpScreenView(BaseScreenView):
main_container = ObjectProperty()
animdl_help = StringProperty()
installing_animdl_help = StringProperty()
available_themes = StringProperty()
def __init__(self, **kw):
super(HelpScreenView, self).__init__(**kw)
self.animdl_help = f"""

View File

@@ -1,4 +1,5 @@
from kivy.properties import ObjectProperty
from View.base_screen import BaseScreenView

View File

@@ -1,20 +1,21 @@
from kivy.properties import ObjectProperty,StringProperty,DictProperty
from kivy.properties import ObjectProperty, StringProperty, DictProperty
from kivy.clock import Clock
from View.base_screen import BaseScreenView
class MyListScreenView(BaseScreenView):
user_anime_list_container = 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 on_enter(self):
Clock.schedule_once(lambda _:self.controller.requested_update_my_list_screen())
def update_layout(self,widget):
self.user_anime_list_container.add_widget(widget)
def on_enter(self):
Clock.schedule_once(lambda _: self.controller.requested_update_my_list_screen())
def update_layout(self, widget):
self.user_anime_list_container.add_widget(widget)

View File

@@ -58,7 +58,6 @@ class Filters(MDBoxLayout):
"NOT_YET_RELEASED",
"CANCELLED",
"HIATUS",
]
case _:
items = []

View File

@@ -2,7 +2,7 @@ from kivy.properties import ObjectProperty, StringProperty
from kivymd.app import MDApp
from kivymd.uix.screen import MDScreen
from kivymd.uix.navigationrail import MDNavigationRail
from kivymd.uix.navigationrail import MDNavigationRail, MDNavigationRailItem
from kivymd.uix.boxlayout import MDBoxLayout
from kivymd.uix.button import MDIconButton
from kivymd.uix.tooltip import MDTooltip
@@ -26,6 +26,11 @@ class TooltipMDIconButton(Tooltip, MDIconButton):
tooltip_text = StringProperty()
class CommonNavigationRailItem(MDNavigationRailItem):
icon = StringProperty()
text = StringProperty()
class BaseScreenView(MDScreen, Observer):
"""
A base class that implements a visual representation of the model data.

View File

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

View File

@@ -4,18 +4,29 @@ from kivy.animation import Animation
from kivy.uix.modalview import ModalView
from kivymd.theming import ThemableBehavior
from kivymd.uix.behaviors import BackgroundColorBehavior,StencilBehavior,CommonElevationBehavior,HoverBehavior
from kivymd.uix.behaviors import (
BackgroundColorBehavior,
StencilBehavior,
CommonElevationBehavior,
HoverBehavior,
)
class MediaPopup(ThemableBehavior,HoverBehavior,StencilBehavior,CommonElevationBehavior,BackgroundColorBehavior,ModalView):
class MediaPopup(
ThemableBehavior,
HoverBehavior,
StencilBehavior,
CommonElevationBehavior,
BackgroundColorBehavior,
ModalView,
):
caller = ObjectProperty()
player = ObjectProperty()
def __init__(self, caller,*args,**kwarg):
def __init__(self, caller, *args, **kwarg):
self.caller = caller
super(MediaPopup,self).__init__(*args,**kwarg)
super(MediaPopup, self).__init__(*args, **kwarg)
def open(self, *_args, **kwargs):
"""Display the modal in the Window.
@@ -26,33 +37,32 @@ class MediaPopup(ThemableBehavior,HoverBehavior,StencilBehavior,CommonElevationB
"""
from kivy.core.window import Window
if self._is_open:
return
self._window = Window
self._is_open = True
self.dispatch('on_pre_open')
self.dispatch("on_pre_open")
Window.add_widget(self)
Window.bind(
on_resize=self._align_center,
on_keyboard=self._handle_keyboard)
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'))
self.fbind("center", self._align_center)
self.fbind("size", self._align_center)
if kwargs.get("animation", True):
ani = Animation(_anim_alpha=1.0, 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')
self._anim_alpha = 1.0
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 on_leave(self, *args):
def _leave(dt):
if not self.hovering:
self.dismiss()
Clock.schedule_once(_leave,2)
Clock.schedule_once(_leave, 2)

View File

@@ -1,8 +1,3 @@
<CommonNavigationRailItem@MDNavigationRailItem>
icon:""
text:""
<CommonNavigationRailItem>
MDNavigationRailItemIcon:
icon:root.icon