def __init__(self, data) -> None: StatsAppend(erina.erinaParsingCount, "Erina") # Normalize to get the same type of data everytime if isinstance(data, list): "\n".join(data) else: data = str(data) self.data = data.split("\n") self.path = None self.anilist_id = None self.hash = None self.similarity = None self.cache_timestamp = None for element in self.data: element = str(element).replace("\n", "") if element[:5] == 'Path:': self.path = str(element[6:]) elif element[:11] == 'AniList ID:': self.anilist_id = utils.convert_to_int(element[12:]) elif element[:5] == 'Hash:': self.hash = str(element[6:]) elif element[:11] == 'Similarity:': self.similarity = utils.convert_to_float(element[12:]) elif element[:16] == 'Cache Timestamp:': self.cache_timestamp = self.CacheTimestamp(element[17:])
def addValue(timestamp, data=None): """ Adds a value to the results """ timestamp = timestamp.timestamp() if data is None: if timestamp in results[category][subcategory]["values"]: results[category][subcategory]["values"][ timestamp] += 1 else: results[category][subcategory]["values"][timestamp] = 1 if category == "search" and subcategory in [ "anilistIDSearchCount", "titleSearchCount", "imageSearchCount" ]: if timestamp in results["search"]["searchCount"][ "values"]: results["search"]["searchCount"]["values"][ timestamp] += 1 else: results["search"]["searchCount"]["values"][ timestamp] = 1 elif subcategory in [ "manamiDBTitleVectorLookups", "erinaDatabaseLookups" ]: if timestamp in results[category][subcategory]["values"]: results[category][subcategory]["values"][ timestamp] += convert_to_int( element.split(" ")[1]) else: results[category][subcategory]["values"][ timestamp] = convert_to_int( element.split(" ")[1]) elif subcategory == "cacheFilesCount": results[category][subcategory]["values"][ timestamp] = convert_to_int(element.split(" ")[1]) elif subcategory == "responsePolarity": if timestamp in results[category][subcategory]["values"]: results[category][subcategory]["values"][ timestamp].append( convert_to_float(element.split(" ")[1])) else: results[category][subcategory]["values"][timestamp] = [ convert_to_float(element.split(" ")[1]) ]
def addTiming(self, from_time=None, to=None, at=None) -> None: if from_time is not None: self.from_time = utils.convert_to_float(from_time) self.from_formatted = str(datetime.timedelta(seconds=self.from_time)).split(".")[0] else: self.from_time = None self.from_formatted = None if to is not None: self.to = utils.convert_to_float(to) self.to_formatted = str(datetime.timedelta(seconds=self.to)).split(".")[0] else: self.to = None self.to_formatted = None if at is not None: self.at = utils.convert_to_float(at) self.at_formatted = str(datetime.timedelta(seconds=self.at)).split(".")[0] else: self.at = None self.at_formatted = None
def __init__(self, data) -> None: StatsAppend(erina.erinaParsingCount, "SauceNAO") # Normalize to get the same type of data everytime if isinstance(data, list): "\n".join(data) else: data = str(data) self.data = data.split("\n") self.similarity = None self.database = None self.title = None self.link = None self.author = None self.thumbnail = None self.is_manga = None self.is_anime = None self.part = None self.year = None self.timing = None self.cache_timestamp = None for element in self.data: element = str(element).replace("\n", "") if element[:11] == 'Similarity:': self.similarity = utils.convert_to_float(element[12:]) elif element[:9] == 'Index ID:': self.database = self.Index(element[10:]) elif element[:6] == 'Title:': self.title = self.AnimeTitle(native_title=element[7:]) elif element[:4] == 'URL:': self.link = str(element[5:]) elif element[:7] == 'Author:': self.author = str(element[8:]) elif element[:10] == 'Thumbnail:': self.thumbnail = str(element[11:]) elif element[:8] == 'isManga:': self.is_manga = utils.convert_to_boolean(element[9:]) elif element[:5] == 'Part:': self.part = utils.convert_to_int(element[6:]) elif element[:8] == 'isAnime:': self.is_anime = utils.convert_to_boolean(element[9:]) elif element[: 8] == 'Episode:': #### COMPATIBILITY WITH OLD SAUCENAO CACHE self.part = utils.convert_to_int(element[9:]) elif element[:5] == 'Year:': self.year = utils.convert_to_int(element[6:]) elif element[:15] == 'Estimated Time:': self.timing = self.Timing(from_time=element[16:], to=element[16:], at=element[16:]) elif element[:16] == 'Cache Timestamp:': self.cache_timestamp = self.CacheTimestamp(element[17:])
def environ(erina_environ): """ Returns an env variable if it has the correct erina environ format """ if str(erina_environ)[:2] == "{{" and str(erina_environ)[-2:] == "}}": environResult = os.environ.get(str(erina_environ)[2:-2], None) if environResult is None: return erina_environ elif re.sub("[0-9-]", "", str(environResult)) == "": return convert_to_int(environResult) elif re.sub("[0-9.-]", "", str(environResult)) == "": return convert_to_float(environResult) else: return environResult else: return erina_environ
def __init__(self, key) -> None: self.key = str(key) self.authFile = TextFile(erina_dir + "/ErinaServer/Erina/auth/apiAuth/" + self.key + ".erina") self.name = None self.rate_limit = None self.stats = [] inStats = False for line in self.authFile: currentLine = line.replace("\n", "") if currentLine[:5] == "Name:": self.name = currentLine[6:] elif currentLine[:11] == "Rate Limit:": self.rate_limit = convert_to_float(currentLine[12:]) elif currentLine == "----STATS----": inStats = True elif inStats: self.stats.append(convert_to_int(currentLine))
def __init__(self, data) -> None: StatsAppend(erina.erinaParsingCount, "IQDB") # Normalize to get the same type of data everytime if isinstance(data, list): "\n".join(data) else: data = str(data) self.data = data.split("\n") self.tags = None self.link = None self.title = None self.size = None self.hentai = None self.similarity = None self.database = None self.author = None for element in self.data: element = str(element).replace("\n", "") if element[:10] == 'IQDB Tags:': self.tags = [ utils.capitalize_string(tag) for tag in str(element[11:]).split(':::') ] elif element[:4] == 'URL:': self.link = str(element[5:]) elif element[:6] == 'Title:': self.title = str(element[7:]) elif element[:5] == 'Size:': self.size = self.Size(element[6:]) elif element[:7] == 'isSafe:': self.hentai = utils.convert_to_boolean(element[8:]) elif element[:11] == 'Similarity:': self.similarity = utils.convert_to_float(element[12:]) elif element[:9] == 'Database:': self.database = str(element[10:]) elif element[:16] == 'Cache Timestamp:': self.cache_timestamp = self.CacheTimestamp(element[17:])
def __init__(self, data) -> None: StatsAppend(erina.erinaParsingCount, "ErinaDB") # Normalize to get the same type of data everytime if isinstance(data, list): "\n".join(data) else: data = str(data) self.data = data.split("\n") self.anilist_id = None self.title = None self.season = None self.episode = None self.first_frame = None self.last_frame = None self.timing = None self.hash = None self.hash_algorithm = None self.filename = None self.framerate = None self.episode_duration = None self.episode_framecount = None self.analyze_timestamp = None for element in self.data: element = str(element).replace("\n", "") if element[:11] == 'AniList ID:': self.anilist_id = utils.convert_to_int(element[12:]) elif element[:6] == 'Anime:': self.title = self.AnimeTitle(romaji_title=element[7:]) elif element[:7] == 'Season:': self.season = utils.convert_to_int(element[8:]) elif element[:8] == 'Episode:': self.episode = utils.convert_to_int(element[9:]) elif element[:12] == 'First Frame:': self.first_frame = utils.convert_to_int(element[13:]) elif element[:11] == 'Last Frame:': self.last_frame = utils.convert_to_int(element[12:]) elif element[:5] == 'From:': if self.timing is None: self.timing = self.Timing(from_time=element[6:]) else: self.timing.addTiming(from_time=element[6:]) elif element[:3] == 'To:': if self.timing is None: self.timing = self.Timing(to=element[4:]) else: self.timing.addTiming(to=element[4:]) elif element[:3] == 'At:': if self.timing is None: self.timing = self.Timing(at=element[4:]) else: self.timing.addTiming(at=element[4:]) elif element[:5] == 'Hash:': self.hash = str(element[6:]) elif element[:18] == 'Hashing Algorithm:': self.hash_algorithm = str(element[19:]) elif element[:9] == 'Filename:': self.filename = str(element[10:]) elif element[:18] == 'Episode Framerate:': self.framerate = utils.convert_to_float(element[19:]) elif element[:17] == 'Episode Duration:': self.episode_duration = utils.convert_to_float(element[18:]) elif element[:20] == 'Episode Frame Count:': self.episode_framecount = utils.convert_to_int(element[21:]) elif element[:13] == 'Analyze Date:': self.analyze_timestamp = self.AnalyzeTimestamp(element[14:])
def __init__(self, timestamp) -> None: self.datetime = datetime.datetime.fromtimestamp(utils.convert_to_float(timestamp)) self.timestamp = timestamp self.formatted = f"{str(self.datetime.year)}-{str(self.datetime.month)}-{str(self.datetime.day)} at {str(self.datetime.hour)}:{str(self.datetime.minute)}:{str(self.datetime.second)}"
def __init__(self, data) -> None: StatsAppend(erina.erinaParsingCount, "AniList") # Normalize to get the same type of data everytime if isinstance(data, list): "\n".join(data) else: data = str(data) self.data = data.split("\n") episode_fallback = 0 ### Data initialization self.anilist_id = None self.myanimelist_id = None self.title = None self.type = None self.format = None self.status = None self.description = None self.season = None self.year = None self.number_of_episodes = None self.episode_duration = None self.first_episode_release_date = None self.last_episode_release_date = None self.country = None self.source_type = None self.licensed = None self.hentai = None self.twitter_hashtag = None self.average_score = None self.cover_image = None self.average_cover_color = None self.banner_image = None self.trailer = None self.genres = None self.studios = None self.tags = None self.relations = None self.characters = None self.staff = None self.recommendations = None self.link = None self.streaming_links = None self.external_links = None self.cache_timestamp = None for element in self.data: element = str(element).replace("\n", "") #print(element) if element[:11] == "AniList ID:": self.anilist_id = utils.convert_to_int(element[12:]) elif element[:15] == "MyAnimeList ID:": self.myanimelist_id = utils.convert_to_int(element[16:]) elif element[:13] == 'Romaji Title:': if self.title is None: self.title = self.AnimeTitle(element[14:]) else: self.title.addTitle(romaji_title=element[14:]) elif element[:14] == 'English Title:': if self.title is None: self.title = self.AnimeTitle(english_title=element[15:]) else: self.title.addTitle(english_title=element[15:]) elif element[:13] == 'Native Title:': if self.title is None: self.title = self.AnimeTitle(native_title=element[14:]) else: self.title.addTitle(native_title=element[14:]) elif element[:21] == 'Alternative Title(s):': if self.title is None: self.title = self.AnimeTitle( alternative_titles=element[22:].split(':::')) else: self.title.addAlternativeTitle(element[22:].split(':::')) elif element[:5] == 'Type:': self.type = str(element[6:]) elif element[:7] == 'Format:': self.format = str(element[8:]) elif element[:7] == 'Status:': self.status = str(element[8:]) elif element[:12] == 'Description:': self.description = self.AnimeDescription(element[13:]) elif element[:7] == 'Season:': self.season = str(element[8:]) elif element[:5] == 'Year:': self.year = utils.convert_to_int(element[6:]) elif element[:9] == 'Episodes:': self.number_of_episodes = utils.convert_to_int(element[10:]) elif element[:17] == 'Average Duration:': self.episode_duration = utils.convert_to_int(element[18:]) elif element[:27] == 'First Episode Release Date:': self.first_episode_release_date = self.AnimeDate(element[28:]) elif element[:26] == 'Last Episode Release Date:': self.last_episode_release_date = self.AnimeDate(element[27:]) elif element[:8] == 'Country:': self.country = str(element[9:]) elif element[:18] == 'Source Media Type:': self.source_type = str(element[19:]) elif element[:9] == 'Licensed?': self.licensed = utils.convert_to_boolean(element[10:]) elif element[:7] == 'Hentai?': self.hentai = utils.convert_to_boolean(element[8:]) elif element[:16] == 'Twitter Hashtag:': self.twitter_hashtag = str(element[17:]) elif element[:14] == 'Average Score:': self.average_score = utils.convert_to_int(element[15:]) elif element[:12] == 'Cover Image:': self.cover_image = str(element[13:]) elif element[:20] == 'Average Cover Color:': self.average_cover_color == str(element[21:]) elif element[:13] == 'Banner Image:': self.banner_image = str(element[14:]) elif element[:8] == 'Trailer:': self.trailer = str(element[9:]) elif element[:7] == 'Genres:': self.genres = self.AnimeGenres(element[8:].split(':::')) elif element[:8] == '[STUDIO]': if self.studios is None: self.studios = [self.AnimeStudio(element[9:].split('|||'))] else: self.studios.append( self.AnimeStudio(element[9:].split('|||'))) elif element[:5] == '[TAG]': if self.tags is None: self.tags = [self.AnimeTag(element[6:].split('|||'))] else: self.tags.append(self.AnimeTag(element[6:].split('|||'))) elif element[:10] == '[RELATION]': if self.relations is None: self.relations = [ self.AnimeRelation(element[11:].split('|||')) ] else: self.relations.append( self.AnimeRelation(element[11:].split('|||'))) elif element[:11] == '[CHARACTER]': if self.characters is None: self.characters = [ self.AnimeCharacter(element[12:].split('|||')) ] else: self.characters.append( self.AnimeCharacter(element[12:].split('|||'))) elif element[:7] == '[STAFF]': if self.staff is None: self.staff = [self.AnimeStaff(element[8:].split('|||'))] else: self.staff.append(self.AnimeStaff( element[8:].split('|||'))) elif element[:16] == '[RECOMMENDATION]': if self.recommendations is None: self.recommendations = [ self.AnimeRecommendation(element[17:].split('|||')) ] else: self.recommendations.append( self.AnimeRecommendation(element[17:].split('|||'))) elif element[:16] == '[streaming link]': episode_fallback += 1 # Info extraction try: element = element[17:] link = re.findall("(https?:\/\/\S+)", element)[0] if link.find('www.crunchyroll.com') != -1: element = element.split(": http")[0].split(" - ") episode = utils.convert_to_int( element[0].lower().replace("episode", "")) title = str(element[1]) else: element = element.split(": http")[0] episode = episode_fallback + 1 title = str(element[0]) # Appending results if self.streaming_links is None: self.streaming_links = [ self.AnimeStreamingLink(link=link, episode=episode, title=title) ] else: self.streaming_links.append( self.AnimeStreamingLink(link=link, episode=episode, title=title)) except: pass elif element[:15] == '[external link]': element = element[16:] link = re.findall("(https?:\/\/\S+)", element)[0] site = element.split(": ")[0] if self.external_links is None: self.external_links = [ self.AnimeExternalLink(link=link, site=site) ] else: self.external_links.append( self.AnimeExternalLink(link=link, site=site)) elif element[:16] == 'Cache Timestamp:': self.cache_timestamp = self.CacheTimestamp( utils.convert_to_float(element[17:])) if self.anilist_id is not None: self.link = "https://anilist.co/anime/" + str(self.anilist_id)
def __init__(self, data) -> None: StatsAppend(erina.erinaParsingCount, "trace.moe") # Normalize to get the same type of data everytime if isinstance(data, list): "\n".join(data) else: data = str(data) self.data = data.split("\n") self.anilist_id = None self.myanimelist_id = None self.title = None self.season = None self.episode = None self.hentai = None self.filename = None self.timing = None self.similarity = None self.tokenthumb = None self.cache_timestamp = None for element in self.data: element = str(element).replace("\n", "") if element[:11] == 'AniList ID:': self.anilist_id = utils.convert_to_int(element[12:]) elif element[:15] == 'MyAnimeList ID:': self.myanimelist_id = utils.convert_to_int(element[16:]) elif element[:6] == 'Title:': self.title = self.AnimeTitle(romaji_title=element[7:]) elif element[:13] == 'Title Native:': if self.title is not None: self.title.addTitle(native_title=element[14:]) else: self.title = self.AnimeTitle(native_title=element[14:]) elif element[:14] == 'Title Chinese:': if self.title is not None: self.title.addTitle(chinese_title=element[15:]) else: self.title = self.AnimeTitle(chinese_title=element[15:]) elif element[:14] == 'Title English:': if self.title is not None: self.title.addTitle(english_title=element[15:]) else: self.title = self.AnimeTitle(english_title=element[15:]) elif element[:13] == 'Title Romaji:': if self.title is not None: self.title.addTitle(romaji_title=element[14:]) else: self.title = self.AnimeTitle(romaji_title=element[14:]) elif element[:6] == 'Anime:': if self.title is not None: self.title.addAlternativeTitle(element[7:]) else: self.title = self.AnimeTitle( alternative_titles=element[7:]) elif element[:9] == 'Synonyms:': if self.title is not None: self.title.addAlternativeTitle(element[10:].split(':::')) else: self.title = self.AnimeTitle( alternative_titles=element[10:].split(':::')) elif element[:17] == 'Synonyms Chinese:': if self.title is not None: self.title.addAlternativeTitle(element[18:].split(':::')) else: self.title = self.AnimeTitle( alternative_titles=element[18:].split(':::')) elif element[:7] == 'Season:': self.season = str(element[8:]) elif element[:8] == 'Episode:': self.episode = utils.convert_to_int(element[9:]) elif element[:8] == 'isAdult:': self.hentai = utils.convert_to_boolean(element[9:]) elif element[:9] == 'Filename:': self.filename = str(element[10:]) elif element[:5] == 'From:': if self.timing is None: self.timing = self.Timing(from_time=element[6:]) else: self.timing.addTiming(from_time=element[6:]) elif element[:3] == 'To:': if self.timing is None: self.timing = self.Timing(to=element[4:]) else: self.timing.addTiming(to=element[4:]) elif element[:3] == 'At:': if self.timing is None: self.timing = self.Timing(at=element[4:]) else: self.timing.addTiming(at=element[4:]) elif element[:11] == 'Similarity:': self.similarity = utils.convert_to_float(element[12:]) elif element[:11] == 'TokenThumb:': self.tokenthumb = str(element[12:]) elif element[:16] == 'Cache Timestamp:': self.cache_timestamp = self.CacheTimestamp(element[17:])