示例#1
0
    def getlocalscores(self, mods):
        try:
            scores = getscores(self.beatmaphash,
                               os.path.join(self.settings.osu, "scores.db"))
        except Exception as e:
            logger.error("from scoreboard: %s", repr(e))
            return

        for i in range(len(scores["scores"])):
            score = scores["scores"][i]

            if int(
                    score["score"]
            ) == self.playerscore and score["player"] == self.playername:
                continue

            summods = getsummods(mods)
            if summods != score["mods"]["modFlags"] and summods != "*":
                continue

            strscore = re.sub(r'(?<!^)(?=(\d{3})+$)', r'.',
                              str(score["score"]))  # add dot to every 3 digits
            strcombo = re.sub(r'(?<!^)(?=(\d{3})+$)', r'.',
                              str(score["max_combo"]))
            self.scoreboards.append(
                BoardInfo(strscore, strcombo, score["score"],
                          score["max_combo"], score["player"], None, None,
                          None, i))
        self.oldrankid = None
示例#2
0
    def getmapid(self, meta, maphash):
        if "BeatmapID" in meta:
            return meta["BeatmapID"]

        if not self.settings.settings["Global leaderboard"]:
            return -1

        k = self.settings.settings["api key"]
        if k is None:
            logger.error(
                "\n\n YOU DID NOT ENTERED THE API KEY. GET THE API HERE https://osu.ppy.sh/p/api/\n\n"
            )
            return

        data = {'k': k, 'h': maphash}
        r = requests.post("https://osu.ppy.sh/api/get_beatmaps", data=data)
        try:
            data = json.loads(r.text)
        except json.decoder.JSONDecodeError:
            return
        if type(data).__name__ == "list":
            if len(data) == 0:
                return
            return data[0].get("beatmap_id", -1)
        return data.get("beatmap_id", -1)
def getaudiofromfile(filename,
                     path,
                     defaultpath,
                     settings,
                     volume=1.0,
                     speed=1.0):
    fmts = ["wav", "mp3", "ogg"]
    for fmt in fmts:
        try:
            return read(os.path.join(path, filename + "." + fmt),
                        settings,
                        volume=volume,
                        speed=speed)
        except FileNotFoundError:
            pass

        except exceptions.CouldntDecodeError as e:
            logger.error(
                repr(e) + " filename " +
                os.path.join(path, filename + "." + fmt))
            return 1, np.zeros((0, 2), dtype=np.float32)

    logger.warning("file not found %s, using default skin", filename)

    if defaultpath is not None:
        return getaudiofromfile(filename,
                                defaultpath,
                                None,
                                settings,
                                volume=volume,
                                speed=speed)

    logger.error("file not found %s", filename)
    return 1, np.zeros((0, 2), dtype=np.float32)
示例#4
0
 def parse_timingpoints(self):
     timing = self.info["TimingPoints"]
     timing = timing.split("\n")
     inherited = 0
     for line in timing:
         my_dict = {}
         try:
             line = line.strip()
             if line == '':
                 continue
             items = line.split(",")
             my_dict["Offset"] = float(items[0])
             if len(items) < 7 or int(items[6]) == 1:
                 my_dict["BeatDuration"] = float(items[1])
                 inherited = my_dict["BeatDuration"]
             else:
                 my_dict["BeatDuration"] = max(
                     10.0, min(1000.0, -float(items[1]))) * inherited / 100
             my_dict["Base"] = inherited
             my_dict["Meter"] = int(items[2])
             my_dict["SampleSet"] = items[3]
             my_dict["SampleIndex"] = items[4]
             my_dict["Volume"] = float(items[5])
         except Exception as e:
             my_dict["Meter"] = my_dict.get("Meter", 0)
             my_dict["SampleSet"] = my_dict.get("SampleSet", "0")
             my_dict["SampleIndex"] = my_dict.get("SampleIndex", "0")
             my_dict["Volume"] = my_dict.get("Volume", 100)
             self.timing_point.append(my_dict)
             logger.error(repr(e))
             continue
         # my_dict["Kiai"] = int(items[7])
         self.timing_point.append(my_dict)
     self.timing_point.append({"Offset": float('inf')})
     self.timing_point.append({"Offset": float('inf')})
示例#5
0
def parseString(db, offset):
	existence = unpack_from('b', db, offset)[0]
	if existence == 0x00:
		return ("", offset + 1)
	elif existence == 0x0b:
		# decode ULEB128
		length = 0
		shift = 0
		offset += 1
		while True:
			val = unpack_from('B', db, offset)[0]
			length |= ((val & 0x7F) << shift)
			offset += 1
			if (val & (1 << 7)) == 0:
				break
			shift += 7

		string = unpack_from(str(length) + 's', db, offset)[0]
		offset += length

		unic = u''
		try:
			unic = str(string, 'utf-8')
		except UnicodeDecodeError:
			logger.error("Could not parse UTF-8 string, returning empty string.")

		return (unic, offset)
示例#6
0
    def loadimg(self):
        char = [str(x) for x in range(10)]
        char.append(".")
        char.append(" ")
        frames = prepare_text(
            char,
            self.countersettings[self.prefix + "Size"] * self.settings.scale,
            self.countersettings[self.prefix + "Rgb"],
            self.settings,
            alpha=self.countersettings[self.prefix + "Alpha"],
            fontpath=self.countersettings[self.prefix + "Font"])

        for i in frames:
            self.frames[int(i) if i.isdigit() else i] = frames[i]

        try:
            self.background = Image.open(
                self.countersettings[self.prefix +
                                     "Background"]).convert("RGBA")
            scale = self.settings.scale * self.countersettings[self.prefix +
                                                               "Size"] / 20
            self.background = imageproc.change_size(self.background, scale,
                                                    scale)
        except Exception as e:
            logger.error(repr(e))
            self.background = Image.new("RGBA", (1, 1))
示例#7
0
def write_frame(shared, conn, filename, settings, iii):
	try:
		write(shared, conn, filename, settings, iii)
	except Exception as e:
		tb = traceback.format_exc()
		with open("error.txt", "w") as fwrite:  # temporary fix
			fwrite.write(repr(e))
		logger.error("{} from {}\n{}\n\n\n".format(tb, filename, repr(e)))
		raise
def processaudio(my_info, beatmap, offset, endtime, mods, settings):
    try:
        audioprc(my_info, beatmap, offset, endtime, mods, settings)
    except Exception as e:
        error = repr(e)
        with open("error.txt", "w") as fwrite:  # temporary fix
            fwrite.write(repr(e))
        logger.error("{} from audio\n\n\n".format(error))
        raise
示例#9
0
def draw_frame(shared, conn, beatmap, replay_info, resultinfo, videotime,
               settings, showranking):
    try:
        draw(shared, conn, beatmap, replay_info, resultinfo, videotime,
             settings, showranking)
    except Exception as e:
        tb = traceback.format_exc()
        with open("error.txt", "w") as fwrite:  # temporary fix
            fwrite.write(repr(e))
        logger.error("{} from {}\n{}\n\n\n".format(tb, videotime, repr(e)))
        raise
示例#10
0
    def getglobalscores(self, mods):
        k = self.settings.settings["api key"]
        if k is None:
            logger.error(
                "\n\n YOU DID NOT ENTERED THE API KEY. GET THE API HERE https://osu.ppy.sh/p/api/\n\n"
            )
            self.getlocalscores(mods)
            return

        if mods == "*":
            data = {'k': k, 'b': self.beatmapid}
        else:
            summods = getsummods(mods)
            data = {'k': k, 'b': self.beatmapid, 'mods': summods}

        r = requests.post("https://osu.ppy.sh/api/get_scores", data=data)
        try:
            data = json.loads(r.text)
        except json.decoder.JSONDecodeError:
            return

        if "error" in data:
            logger.error("\n\n {} \n\n".format(data["error"]))
            self.getlocalscores(mods)
            return

        for i in range(len(data)):
            score = data[i]

            if score["username"] == self.playername:
                if int(score["score"]) == self.playerscore:
                    self.removeone = 1
                continue

            if len(score["username"]) > 13:
                score["username"] = score["username"][:13] + ".."

            keepgoing = self.filter(score["user_id"], int(score["score"]))

            if not keepgoing:
                continue

            strscore = re.sub(r'(?<!^)(?=(\d{3})+$)', r'.',
                              str(score["score"]))  # add dot to every 3 digits
            strcombo = re.sub(r'(?<!^)(?=(\d{3})+$)', r'.',
                              str(score["maxcombo"]))
            self.scoreboards.append(
                BoardInfo(strscore, strcombo, int(score["score"]),
                          int(score["maxcombo"]), score["username"], None,
                          None, None, i))
        self.oldrankid = None
示例#11
0
 def cleanup(self):
     try:
         if self.drawers is not None:
             for x in range(len(self.drawers)):
                 self.drawers[x].terminate()
                 self.writers[x].terminate()
                 conn1, conn2 = self.pipes[x]
                 conn1.close()
                 conn2.close()
         if self.audio is not None:
             self.audio.terminate()
     except Exception as e:
         logger.error(repr(e))
     cleanup(self.settings)
示例#12
0
def pydubtonumpy(audiosegment):
    y = np.array(audiosegment.get_array_of_samples())
    if audiosegment.channels == 2:
        y = y.reshape((-1, 2))
    if audiosegment.channels == 1:
        y1 = np.zeros((len(y), 2), dtype=y.dtype)
        y1[:, 0] = y * 0.5
        y1[:, 1] = y * 0.5
        y = y1
    try:
        h = max(2, audiosegment.sample_width) * 8
        maxvalue = max(np.amax(y), 2**h)
    except ValueError as e:
        logger.error(repr(e))
        maxvalue = 1
    return audiosegment.frame_rate, np.float64(y) / maxvalue
示例#13
0
    def parse_timingpoints(self):
        timings = self.info["TimingPoints"].split("\n")
        inherited = 0
        for line in timings:
            timing = {}
            try:
                line = line.strip()
                if not line:
                    continue

                items = line.split(",")
                timing["Offset"] = float(items[0])

                if len(items) < 7 or int(items[6]) == 1:
                    timing["BeatDuration"] = float(items[1])
                    inherited = timing["BeatDuration"]
                else:
                    timing["BeatDuration"] = max(
                        10.0, min(1000.0, -float(items[1]))) * inherited / 100

                timing["Base"] = inherited
                timing["Meter"] = int(items[2])
                timing["SampleSet"] = items[3]
                timing["SampleIndex"] = items[4]
                timing["Volume"] = float(items[5])

            except Exception as e:
                timing["Meter"] = timing.get("Meter", 0)
                timing["SampleSet"] = timing.get("SampleSet", "0")
                timing["SampleIndex"] = timing.get("SampleIndex", "0")
                timing["Volume"] = timing.get("Volume", 100)
                self.timing_point.append(timing)
                logger.error(repr(e))
                continue

            # my_dict["Kiai"] = int(items[7])
            self.timing_point.append(timing)

        self.timing_point.append({"Offset": float('inf')})
        self.timing_point.append({"Offset":
                                  float('inf')})  # FireRedz: mega sus
示例#14
0
def prepare_text(texts, size, color, settings, alpha=1, fontpath=""):
    if fontpath == "":
        fontpath = os.path.join(settings.path, "res/Aller_Rg.ttf")
    size = int(size)
    try:
        font = ImageFont.truetype(fontpath, size=size)
    except Exception as e:
        font = ImageFont.truetype(os.path.join(settings.path,
                                               "res/Aller_Rg.ttf"),
                                  size=size)
        logger.error(repr(e))

    img = Image.new("RGBA", (settings.width, settings.height))
    imgdraw = ImageDraw.Draw(img)
    imgs = {}
    for text in texts:
        img.paste((0, 0, 0, 0), (0, 0, img.size[0], img.size[1]))
        s = imgdraw.textsize(text, font=font)
        imgdraw.text((0, 0), text, color, font=font, spacing=size)
        imgs[text] = imageproc.newalpha(img.crop((0, 0, s[0], s[1])), alpha)

    return imgs
示例#15
0
def prepare_background(backgroundname, settings):
    """
	:param backgroundname: string
	:return: PIL.Image
	"""
    try:
        img = Image.open(backgroundname).convert("RGBA")
    except Exception as e:
        logger.error(repr(e))
        img = Image.open(os.path.join(settings.path,
                                      "res/bg.png")).convert("RGBA")

    width = settings.width
    height = settings.height
    ratiow = width / height
    ratioh = height / width

    w = min(img.size[0], int(img.size[1] * ratiow))
    h = min(img.size[1], int(img.size[0] * ratioh))
    x, y = (img.size[0] - w) // 2, (img.size[1] - h) // 2
    img = img.crop((x, y, x + w, y + h))

    scale = width / w
    img = imageproc.change_size(img, scale, scale)
    imgs = [Image.new("RGBA", (1, 1))]

    dim = max(0, min(100, (100 - settings.settings["Background dim"]))) * 2.55
    color = np.array([dim, dim, dim])
    interval = int(1000 / 45)
    c_interval = max(0, (settings.settings["Background dim"] - 50) * 2.55 /
                     interval)
    color[:] = color[:] - c_interval
    for x in range(interval):
        color[:] = color[:] + c_interval
        a = imageproc.add_color(img, color)
        imgs.append(a)
    return imgs