예제 #1
0
def AnimeList(List: list):
    AnimeLists = AnimeListsStruct.AnimeLists()
    size_list = len(List)
    completedList = 0
    for anime in List:
        node: dict = anime.get("node")
        id = node.get("id")
        print(f"Formatting MAL id: {id}")
        title = node.get("title")
        main_picture = node.get("main_picture")
        medium_picture = main_picture.get("medium")
        large_picture = main_picture.get("large")

        list_status: dict = anime.get("list_status")
        status = list_status.get("status")
        score = list_status.get("score")
        num_episodes_watched = list_status.get("num_episodes_watched")
        is_rewatching = list_status.get("is_rewatching")
        updated_at = list_status.get("updated_at")

        PureAnime = AnimeStruct.Anime()
        MetaID = GenericStruct.MetaID(PluginName="MAL", id=str(id))
        PureAnime.id.list.append(MetaID)

        Name = GenericStruct.Text(Text=title, Localization=DefaultLocalization)
        PureAnime.names.list.append(Name)

        Medium_Image = GenericStruct.Image(url=medium_picture)
        Large_Image = GenericStruct.Image(url=large_picture)
        # Todo: save the images as well, need to develop new cache
        PureAnime.images.list.append(Medium_Image)
        PureAnime.images.list.append(Large_Image)

        State_Mapper = {
            'watching': AnimeStruct.LibraryState.Watching,
            'completed': AnimeStruct.LibraryState.Completed,
            'on_hold': AnimeStruct.LibraryState.Hold,
            'dropped': AnimeStruct.LibraryState.Dropped,
            'plan_to_watch': AnimeStruct.LibraryState.PlanToWatch
        }
        updated_at_datetime = datetime.datetime.fromisoformat(updated_at)
        PureAnime.libraryStatus = AnimeStruct.LibraryStatus(
            state=State_Mapper[status],
            episodesWatched=num_episodes_watched,
            lastUpdated=updated_at_datetime)

        PureAnime.personalRating.rated = score

        AnimeLists.append(anime=PureAnime)
        completedList += 1
        print(f"Formatted {completedList} of {size_list}")

    return AnimeLists
예제 #2
0
 def namesMetadata(namesList: List[dict]):
     names = AnimeStruct.Names()
     for name in namesList:
         text = name.get('text')
         localization = localizationMetadata(name.get('localization'))
         Name = GenericStruct.Text(text, localization)
         names.list.append(Name)
     return names
예제 #3
0
def AnimeMetadata(metadata, oldAnime: AnimeStruct.Anime) -> AnimeStruct.Anime:
    Anime = AnimeStruct.Anime()
    Anime.hash = oldAnime.hash

    id: str = str(metadata.get("id"))
    title: str = metadata.get("title")
    main_picture: dict = metadata.get("main_picture")
    medium_picture: str = main_picture.get("medium")
    large_picture: str = main_picture.get("large")
    alternative_titles: dict = metadata.get("alternative_titles")
    synonyms: List[str] = alternative_titles.pop("synonyms")
    start_date: str = metadata.get("start_date")
    end_date: str = metadata.get("end_date")
    synopsis: str = metadata.get("synopsis")
    mean: float = float(metadata.get("mean", 0))
    rank: int = int(metadata.get("rank", 0))
    popularity: int = int(metadata.get("popularity"))
    num_list_users: str = metadata.get("num_list_users")
    num_scoring_users: str = metadata.get("num_scoring_users")
    nsfw: str = metadata.get("nsfw")
    created_at: str = metadata.get("created_at")
    updated_at: str = metadata.get("updated_at")
    media_type: str = metadata.get("media_type")
    status: str = metadata.get("status")
    genres: List[dict] = metadata.get("genres")
    my_list_status: dict = metadata.get("my_list_status")
    list_status: str = my_list_status.get("status")
    score: float = float(my_list_status.get("score"))
    num_episodes_watched: int = int(my_list_status.get("num_episodes_watched"))
    is_rewatching: bool = bool(my_list_status.get("is_rewatching"))
    updated_at: str = my_list_status.get("updated_at")
    num_episodes: int = int(metadata.get("num_episodes"))
    start_season: dict = metadata.get("start_season")
    if start_season:
        year: int = int(start_season.get("year"))
        season: str = start_season.get("season")
    broadcast: dict = metadata.get("broadcast")
    if broadcast:
        day_of_the_week: str = broadcast.get("day_of_the_week")
        start_time: str = broadcast.get("start_time")
    source: str = metadata.get("source")
    average_episode_duration: str = str(
        metadata.get("average_episode_duration"))
    rating: str = str(metadata.get("rating"))
    pictures: List[dict] = metadata.get("pictures")
    background: str = metadata.get("background")
    related_anime: List = metadata.get(
        "related_anime")  # Todo: get more info on this
    related_manga: List = metadata.get("related_manga")
    recommendations: List[dict] = metadata.get(
        "recommendations")  # Note To Self: I'm ignoring this for now
    studios: List[dict] = metadata.get("studios")
    statistics: dict = metadata.get("statistics")
    statistics_status: dict = statistics.get("status")
    watching: str = statistics_status.get("watching")
    completed: str = statistics_status.get("completed")
    on_hold: str = statistics_status.get("on_hold")
    dropped: str = statistics_status.get("dropped")
    plan_to_watch: str = statistics_status.get("plan_to_watch")
    num_list_users: str = str(statistics_status.get("num_list_users"))

    if nsfw != "white" and nsfw != "gray":
        raise Exception("First time seeing Non White, pls help")
    ageRatingDict = {"pg_13": 13}
    Anime.ageRating = AnimeStruct.AgeRating(Age=ageRatingDict["pg_13"],
                                            Tag=rating)

    status_dict: AnimeStruct.ReleaseStatus = {
        "currently_airing": AnimeStruct.ReleaseStatus.ONGOING,
        "not_yet_aired": AnimeStruct.ReleaseStatus.SCHEDULED,
        "finished_airing": AnimeStruct.ReleaseStatus.COMPLETED
    }
    Anime.status = status_dict[status]

    Anime.publicRating = AnimeStruct.Rating(rated=mean,
                                            rank=rank,
                                            popularity=popularity)
    Anime.publicRating.hash = oldAnime.publicRating.hash

    libraryState_dict: AnimeStruct.LibraryState = {
        "watching": AnimeStruct.LibraryState.Watching,
        "on_hold": AnimeStruct.LibraryState.Hold,
        "dropped": AnimeStruct.LibraryState.Dropped,
        "plan_to_watch": AnimeStruct.LibraryState.PlanToWatch,
        "completed": AnimeStruct.LibraryState.Completed
    }
    Anime.libraryStatus = AnimeStruct.LibraryStatus(
        state=libraryState_dict[list_status],
        episodesWatched=num_episodes_watched,
        lastUpdated=datetime.datetime.fromisoformat(updated_at))
    Anime.libraryStatus.hash = oldAnime.libraryStatus.hash

    Anime.personalRating = AnimeStruct.Rating(rated=score)
    Anime.personalRating.hash = oldAnime.personalRating.hash

    # Todo: add new id if the metadata provider differs from the initial id provider
    Anime.id = oldAnime.id

    # Todo: maybe add a script_Dic to map languages to script (Latin, japanese only)
    names = AnimeStruct.Names()
    Name = GenericStruct.Text(Text=title, Localization=DefaultLocalization)
    names.list.append(Name)
    for language in alternative_titles:
        title = alternative_titles[language]
        Country = "Unknown"
        Language = pycountry.languages.get(alpha_2=language).name
        Script = "Unknown"
        Localization = GenericStruct.Localization(Language=Language,
                                                  Script=Script)
        Name = GenericStruct.Text(Text=title, Localization=DefaultLocalization)
        names.list.append(Name)
    for title in synonyms:
        Language = "Unknown"
        Script = "Unknown"
        Localization = GenericStruct.Localization(Language=Language,
                                                  Script=Script)
        Name = GenericStruct.Text(Text=title, Localization=DefaultLocalization)
        names.list.append(Name)
    Anime.names = names
    Anime.names.hash = oldAnime.names.hash

    images = AnimeStruct.Images()
    if medium_picture:
        Medium_Image = GenericStruct.Image(url=medium_picture)
        images.list.append(Medium_Image)
    if large_picture:
        Large_Image = GenericStruct.Image(url=large_picture)
        images.list.append(Large_Image)
    for image_info in pictures:
        Medium_Image = GenericStruct.Image(url=image_info.get("medium"))
        if Medium_Image:
            images.list.append(Medium_Image)
        Large_Image = GenericStruct.Image(url=image_info.get("large"))
        if Large_Image:
            images.list.append(Large_Image)
    Anime.images = images
    Anime.images.hash = oldAnime.images.hash

    tags = AnimeStruct.Tags()
    # Todo: See if exists in database a tag with same name but different aliases
    tags.list = [AnimeStruct.Tag(name=genre.get("name")) for genre in genres]
    Anime.tags = tags
    Anime.tags.hash = oldAnime.tags.hash

    Anime.description = AnimeStruct.Description(synopsis)
    Anime.description.hash = oldAnime.description.hash

    typeDict = {
        "tv": AnimeStruct.AnimeType.TV,
        "ona": AnimeStruct.AnimeType.ONA,
        "ova": AnimeStruct.AnimeType.OVA,
        "special": AnimeStruct.AnimeType.SPECIAL,
        "unknown": AnimeStruct.AnimeType.UNKNOWN,
        "movie": AnimeStruct.AnimeType.MOVIE
    }
    Anime.type = typeDict[media_type]

    # episodes = AnimeStruct.Episodes()
    # for episode_number in range(num_episodes):
    #     text = AnimeStruct.Text("Unknown", DefaultLocalization)
    #     names = AnimeStruct.Names()
    #     names.list.append(text)
    #     episode = AnimeStruct.Episode(names=names)
    #     episode.type = AnimeStruct.EpisodeType.UNKNOWN
    #     episodes.list.append(episode)
    # Anime.episodes = episodes
    # Anime.episodes.hash = oldAnime.episodes.hash

    runnings = AnimeStruct.Runnings()
    since = to = None
    strpTypeDict = {1: "%Y", 2: "%Y-%m", 3: "%Y-%m-%d"}
    if start_date:
        strptype = len(start_date.split("-"))
        since = datetime.datetime.strptime(start_date, strpTypeDict[strptype])
    if end_date:
        strptype = len(end_date.split("-"))
        to = datetime.datetime.strptime(end_date, strpTypeDict[strptype])
    runnings.list.append(AnimeStruct.Running(since=since, to=to))
    Anime.runnings = runnings
    Anime.runnings.hash = oldAnime.runnings.hash

    seasonDict = {
        "winter": AnimeStruct.Seasons.Winter,
        "spring": AnimeStruct.Seasons.Spring,
        "summer": AnimeStruct.Seasons.Summer,
        "fall": AnimeStruct.Seasons.Fall
    }

    if start_season:
        Anime.season = AnimeStruct.Season(Year=AnimeStruct.Year(year),
                                          SeasonName=seasonDict[season])

    studioss = AnimeStruct.Studios()
    for studio in studios:
        name = studio.get("name")
        names = AnimeStruct.Names()
        names.list.append(
            AnimeStruct.Text(Text=name, Localization=DefaultLocalization))
        studioss.list.append(AnimeStruct.Studio(names))
    Anime.studios = studioss
    Anime.studios.hash = oldAnime.studios.hash

    return Anime
예제 #4
0
from typing import List
import pycountry
import datetime
import Core.Structures.List as AnimeListsStruct
import Core.Structures.Anime as AnimeStruct
import Core.Structures.Generic as GenericStruct

DefaultCountry = pycountry.countries.get(name='Japan').name
DefaultLanguage = pycountry.languages.get(name='Japanese').name
DefaultScript = pycountry.scripts.get(name='Latin').name
DefaultTag = 'jpn-Latn'
DefaultLocalization = GenericStruct.Localization(Tag=DefaultTag)


def AnimeList(List: list):
    AnimeLists = AnimeListsStruct.AnimeLists()
    size_list = len(List)
    completedList = 0
    for anime in List:
        node: dict = anime.get("node")
        id = node.get("id")
        print(f"Formatting MAL id: {id}")
        title = node.get("title")
        main_picture = node.get("main_picture")
        medium_picture = main_picture.get("medium")
        large_picture = main_picture.get("large")

        list_status: dict = anime.get("list_status")
        status = list_status.get("status")
        score = list_status.get("score")
        num_episodes_watched = list_status.get("num_episodes_watched")
예제 #5
0
 def localizationMetadata(localization: dict):
     tag = None
     if localization.get('tag'):
         tag = localization.get('tag')
     return GenericStruct.Localization(tag)
예제 #6
0
def AnimeMetadata(metadata, oldAnime: AnimeStruct.Anime) -> AnimeStruct.Anime:
    Anime = AnimeStruct.Anime()
    Anime.hash = oldAnime.hash

    id: str = str(metadata.get("id"))
    # Todo: Add restrictions
    # Todo: Add releases
    ageRatingsList: List[dict] = metadata.get("ageRatings")
    status = metadata.get("status")
    # Todo: Add relations
    # Todo: Add partOfCanonicals
    genresList: List[dict] = metadata.get("genres")
    # Todo: Add soundtracks
    voiceActingsList: List[dict] = metadata.get("voiceActings")
    staffList: List[dict] = metadata.get("staff")
    starringList: List[dict] = metadata.get("starring")
    namesList: List[dict] = metadata.get("names")
    aliasesList: List[dict] = metadata.get("aliases")
    descriptionsList: List[dict] = metadata.get("descriptions")
    imagesList: List[dict] = metadata.get("images")
    crossrefsList: List[dict] = metadata.get("crossrefs")
    websitesList: List[dict] = metadata.get("websites")
    selfLink = metadata.get("selfLink")
    animeType = metadata.get("type")
    videosList: List[dict] = metadata.get("videos")
    episodesList: List[dict] = metadata.get("episodes")
    runningsList: List[dict] = metadata.get("runnings")

    def localizationMetadata(localization: dict):
        tag = None
        if localization.get('tag'):
            tag = localization.get('tag')
        return GenericStruct.Localization(tag)

    def namesMetadata(namesList: List[dict]):
        names = AnimeStruct.Names()
        for name in namesList:
            text = name.get('text')
            localization = localizationMetadata(name.get('localization'))
            Name = GenericStruct.Text(text, localization)
            names.list.append(Name)
        return names

    if ageRatingsList:
        ageRating = ageRatingsList[0]
        Anime.ageRating = AnimeStruct.AgeRating(Age=ageRating.get('age'),
                                                Tag=ageRating.get('tag'))
    if status:
        Anime.status = AnimeStruct.ReleaseStatus[status]
    if genresList:
        tags = AnimeStruct.Tags()
        for genre in genresList:
            # Todo: See if exists in database a tag with same name but different aliases
            tag = AnimeStruct.Tag(name=genre.get("names")[0].get("text"))
            tags.list.append(tag)
        Anime.tags = tags
    if voiceActingsList:
        voiceActings = AnimeStruct.VoiceActings()
        voiced = None
        actor = None
        for voiceActing in voiceActingsList:
            Voiced = voiceActing.get('voiced')
            Actor = voiceActing.get('actor')
            if Voiced:
                birthday = Voiced.get('birthday')
                # Note To Self: want example of how it comes out
                country = Voiced.get('hometown')
                gender = PersonStruct.Gender[Voiced.get('gender')]
                age = Voiced.get('age')
                name = None
                for tryname in Voiced.get('names'):
                    if tryname.get('localization').get(
                            'script') and tryname.get('localization').get(
                                'script').get('code') == 'Latn':
                        name = tryname.get('text')
                if name is None:
                    name = Voiced.get('names')[0].get('text')
                voiced = PersonStruct.Person(name=name,
                                             birthday=birthday,
                                             country=country,
                                             gender=gender,
                                             age=age)
            if Actor:
                birthday = Actor.get('birthday')
                # Note To Self: want example of how it comes out
                country = Actor.get('hometown')
                gender = PersonStruct.Gender[Actor.get('gender')]
                age = Actor.get('age')
                name = None
                for tryname in Actor.get('names'):
                    if tryname.get('localization').get('script'):
                        if tryname.get('localization').get('script').get(
                                'code') == 'Latn':
                            name = tryname.get('text')
                            break
                if name is None:
                    name = Actor.get('names')[0].get('text')
                actor = PersonStruct.Person(name=name,
                                            birthday=birthday,
                                            country=country,
                                            gender=gender,
                                            age=age)
                voiceActing = AnimeStruct.VoiceActing(actor=actor,
                                                      voiced=voiced)
            voiceActings.list.append(voiceActing)
        Anime.voiceActings = voiceActings
    if staffList:
        studios = AnimeStruct.Studios()
        for staff in staffList:
            # Todo: investigate studio tags
            studioNames = AnimeStruct.Names()
            if staff.get('role').get('tag') == 'animation-works':
                Name = namesMetadata(staff.get('collaborator').get('names'))
                studioNames.list.append(Name)
        Anime.status = studios
    if starringList:
        for starring in starringList:
            relation = starring.get('relation')
            Character = starring.get('character')
            birthday = Character.get('birthday')
            # Note To Self: want example of how it comes out
            country = Character.get('hometown')
            gender = PersonStruct.Gender[Character.get('gender')]
            age = Character.get('age')
            name = None
            for tryname in Character.get('names'):
                if tryname.get('localization').get('script'):
                    if tryname.get('localization').get('script').get(
                            'code') == 'Latn':
                        name = tryname.get('text')
                        break
            if name is None:
                name = Character.get('names')[0].get('text')
            character = PersonStruct.Person(name=name,
                                            birthday=birthday,
                                            country=country,
                                            gender=gender,
                                            age=age)

    if namesList:
        Anime.names = namesMetadata(namesList)
    if aliasesList:
        names = namesMetadata(aliasesList)
        Anime.names.list.extend(names.list)
    if descriptionsList:
        if len(descriptionsList) > 1:
            raise Exception('Need to add localizations to descriptions')
        Anime.description = AnimeStruct.Description(
            descriptionsList[0].get('text'))
    if imagesList:
        files_type_priority = {'webp': 0, "png": 1, 'jpg': 2}
        images = GenericStruct.Images()
        for image in imagesList:
            type = image.get('type')
            files: dict = image.get('image').get('files')
            file_list = [file.get('publicUri') for file in files]
            file_list.sort(
                key=lambda i: files_type_priority.get(i.split('.')[-1], 100))
            images.list.append(GenericStruct.Image(file_list[0]))
        Anime.images = images
    # Note To Self: I'm ignoring crossrefs, may be needed in the future tho
    # Note To Self: I'm ignoring websites, may be needed in the future tho
    # Note To Self: I'm ignoring selflink, may be needed in the future tho
    Anime.type = AnimeStruct.AnimeType[animeType]
    if videosList:
        videos = AnimeStruct.Videos()
        for video in videosList:
            url = video.get('video').get('files')[0].get('publicUri')
            Video = AnimeStruct.Video(
                url=url, type=AnimeStruct.VideoType[video.get('type')])
            videos.list.append(Video)
        Anime.videos = videos
    if episodesList:
        episodes = AnimeStruct.Episodes()
        for episode in episodesList:
            type = AnimeStruct.EpisodeType[episode.get('type')]
            index = episode.get('identifier')
            releasedate = None
            if episode.get('releaseDate'):
                # '2020-12-04T00:00:00Z'
                releasedate = datetime.datetime.strptime(
                    episode.get('releaseDate')[:-2], "%Y-%m-%dT%H:%M:%S")
            names = namesMetadata(episode.get('names'))
            # Ignoring AgeRating, websites and videos
            Episode = AnimeStruct.Episode(names=names,
                                          releaseDate=releasedate,
                                          type=type,
                                          index=index)
            episodes.list.append(Episode)
        Anime.episodes = episodes
    if runningsList:
        runnings = AnimeStruct.Runnings()
        for running in runningsList:
            since = datetime.datetime.strptime(
                runningsList[0].get('from')[:-2], "%Y-%m-%dT%H:%M:%S")
            if runningsList[0].get('to'):
                to = datetime.datetime.strptime(runningsList[0].get('to')[:-2],
                                                "%Y-%m-%dT%H:%M:%S")
            else:
                to = datetime.datetime.utcfromtimestamp(0)
            Running = AnimeStruct.Running(since=since, to=to)
            runnings.list.append(Running)
        Anime.runnings = runnings

    Anime.libraryStatus = oldAnime.libraryStatus
    Anime.id = oldAnime.id
    Anime.ageRating.hash = oldAnime.ageRating.hash
    Anime.publicRating.hash = oldAnime.publicRating.hash
    Anime.personalRating.hash = oldAnime.personalRating.hash
    Anime.names.hash = oldAnime.names.hash
    Anime.images.hash = oldAnime.images.hash
    Anime.soundtracks.hash = oldAnime.soundtracks.hash
    Anime.voiceActings.hash = oldAnime.voiceActings.hash
    Anime.crossRefs.hash = oldAnime.crossRefs.hash
    Anime.videos.hash = oldAnime.videos.hash
    Anime.tags.hash = oldAnime.tags.hash
    Anime.description.hash = oldAnime.description.hash
    Anime.episodes.hash = oldAnime.episodes.hash
    Anime.runnings.hash = oldAnime.runnings.hash
    Anime.studios.hash = oldAnime.studios.hash

    return Anime