uyitroa / osr2mp4-core Goto Github PK
View Code? Open in Web Editor NEWA program to convert osu replay file osr to mp4. Sample: https://www.youtube.com/watch?v=5ugu_9yDSg0
License: MIT License
A program to convert osu replay file osr to mp4. Sample: https://www.youtube.com/watch?v=5ugu_9yDSg0
License: MIT License
Happened when rendering with system volume set to 0
EDIT 1
Tried to render again with same condition with volume 0, it rendered but with NO audio
Trying to record this score on this map, and it would appear that the audio file is not copied into the temp directory. Any ideas why that might be? This is the first time I'm running into this, other beatmaps/scores have been fine.
Here's my recording code:
import os
from pathlib import Path
from tempfile import mkstemp
from osr2mp4.osr2mp4 import Osr2mp4
def record(beatmap: Path, replay: Path) -> Path:
_, output = mkstemp(suffix=".mp4")
data = {
"osu! path": "/",
"Skin path": os.environ["OSU_SKIN_PATH"],
"Beatmap path": beatmap.as_posix(),
".osr path": replay.as_posix(),
"Default skin path": os.environ["OSU_SKIN_PATH"],
"Output path": output,
"Width": 1280,
"Height": 720,
"FPS": 60,
"Start time": 0,
"End time": -1,
"Video codec": "XVID",
"Process": 2,
"ffmpeg path": "ffmpeg",
}
settings = {
"Show scoreboard": False,
"Song volume": 100,
"Effect volume": 100,
"Use FFmpeg video writer": True,
"api key": "",
}
osr = Osr2mp4(data, settings)
osr.startall()
osr.joinall()
return Path(output)
And here are the logs:
bot_1 | 2020-10-12 17:55:47,667:INFO:osr2mp4.osr2mp4.Osr2mp4:__init__:test
bot_1 | 2020-10-12 17:55:47,697:TRACE:osr2mp4.Utils.Setup:setupglobals:CALL *({'osu! path': '/', 'Skin path': '/root/skin', 'Beatmap path': '/tmp/tmp9n1bqai9', '.osr path': '/tmp/downloads/replay-osu_2082010_3275936453.osr', 'Default skin path': '/root/skin', 'Output path': '/tmp/tmp_ny585qg.mp4', 'Width': 1280, 'Height': 720, 'FPS': 60, 'Start time': 0, 'End time': -1, 'Video codec': 'XVID', 'Process': 2, 'ffmpeg path': 'ffmpeg'}, {'Show scoreboard': False, 'Song volume': 100, 'Effect volume': 100, 'Use FFmpeg video writer': True, 'api key': None, 'Custom mods': ''}, frozenset({<Mod.NoMod: 0>}), <osr2mp4.global_var.Settings object at 0x7f104d2f0850>) **{'ppsettings': {'x': 1320, 'y': 725, 'Size': 25, 'Rgb': [255, 255, 255], 'Alpha': 1, 'Font': 'arial.ttf', 'Background': '/root/osr2mp4/res/pptemplate.png', 'Hitresult x': 50, 'Hitresult y': 150, 'Hitresult Size': 16, 'Hitresult Rgb': [255, 255, 255], 'Hitresult Alpha': 1, 'Hitresult Font': 'arial.ttf', 'Hitresult Background': '/root/osr2mp4/res/hitresulttemplate.png', 'Hitresult Gap': 3}}
bot_1 | 1000
bot_1 | 2020-10-12 17:55:47,701:TRACE:root:read:{'Name': 'CirclePeople', 'Author': '- Zayin -', 'CursorRotate': '0', 'CursorExpand': '1', 'CursorCentre': '1', 'HitCircleOverlayAboveNumer': '1', 'SliderStyle': '2', 'Version': 'latest'}
bot_1 | 2020-10-12 17:55:47,701:TRACE:root:read:{'Combo1': '242,216,223', 'Combo2': '0,255,168', 'Combo3': '231,232,226', 'SliderBorder': '255,110,0', 'SliderTrackOverride': '0,30,70', 'SpinnerApproachCircle': '255,255,255'}
bot_1 | 2020-10-12 17:55:47,701:TRACE:root:read:{'HitCirclePrefix': 'default', 'HitCircleOverlap': '8', 'ScorePrefix': 'score', 'ScoreOverlap': '6'}
bot_1 | 2020-10-12 17:55:47,701:TRACE:osr2mp4.Utils.Setup:setupglobals:RETURN None
bot_1 | 2020-10-12 17:55:47,836:TRACE:root:__init__:Settings vars {'skin_path': '/root/skin', 'default_path': 'root/osr2mp4/res/default/', 'skin_ini': <osr2mp4.Parser.skinparser.Skin object at 0x7f104cba15b0>, 'default_skin_ini': <osr2mp4.Parser.skinparser.Skin object at 0x7f104cba15b0>, 'format': '.png', 'x2': '@2x', 'ffmpeg': 'ffmpeg', 'output': '/tmp/tmp_ny585qg.mp4', 'beatmap': '/tmp/tmp9n1bqai9', 'osu': '/', 'path': 'root/osr2mp4/', 'temp': 'root/osr2mp4/286ae3ae-0cb4-11eb-a23f-0242ac130002temp/', 'width': 1280, 'height': 720, 'fps': 60, 'scale': 0.9375, 'playfieldscale': 1.453857421875, 'playfieldwidth': 744.375, 'playfieldheight': 558.28125, 'movedown': 85, 'moveright': 255, 'timeframe': 1000, 'settings': {'Show scoreboard': False, 'Song volume': 100, 'Effect volume': 100, 'Use FFmpeg video writer': True, 'api key': None, 'Custom mods': '', 'Cursor size': 1, 'In-game interface': True, 'Background dim': 100, 'Rotate sliderball': False, 'Always show key overlay': True, 'Automatic cursor size': False, 'Show mods icon': True, 'Enable PP counter': False, 'Score meter size': 1, 'Show score meter': True, 'Ignore beatmap hitsounds': False, "Use skin's sound samples": False, 'Song delay': 0, 'Global leaderboard': False, 'Mods leaderboard': '*', 'FFmpeg codec': 'libx264', 'FFmpeg custom commands': '-preset ultrafast -crf 23', 'Audio bitrate': 500, 'Slider quality': 2}, 'ppsettings': {'x': 1320, 'y': 725, 'Size': 25, 'Rgb': [255, 255, 255], 'Alpha': 1, 'Font': 'arial.ttf', 'Background': '/root/osr2mp4/res/pptemplate.png', 'Hitresult x': 50, 'Hitresult y': 150, 'Hitresult Size': 16, 'Hitresult Rgb': [255, 255, 255], 'Hitresult Alpha': 1, 'Hitresult Font': 'arial.ttf', 'Hitresult Background': '/root/osr2mp4/res/hitresulttemplate.png', 'Hitresult Gap': 3}, 'codec': 'XVID', 'audiocodec': 'aac', 'process': 2, 'enablelog': True}
bot_1 | 2020-10-12 17:55:47,836:TRACE:osr2mp4.osr2mp4.Osr2mp4:startall:CALL *() **{}
bot_1 | 2020-10-12 17:55:47,836:TRACE:osr2mp4.osr2mp4.Osr2mp4:analyse_replay:CALL *() **{}
bot_1 | 2020-10-12 17:55:47,933:TRACE:root:__init__:Diff {'CircleSize': 4.0, 'OverallDifficulty': 9.3, 'HPDrainRate': 4.4, 'BaseHPDrainRate': 4.4, 'BaseCircleSize': 4.0, 'BaseOverallDifficulty': 9.3, 'ApproachRate': 9.9, 'BaseApproachRate': 9.9, 'SliderMultiplier': 2.0, 'BaseSliderMultiplier': 2.0, 'SliderTickRate': 1.0, 'BaseSliderTickRate': 1.0}
bot_1 | 2020-10-12 17:55:47,963:DEBUG:root:checkmain:Start check
bot_1 | 2020-10-12 17:55:48,539:DEBUG:root:checkmain:check done
bot_1 | 2020-10-12 17:55:48,539:TRACE:root:checkmain:RETURN Info(time=150379, combo=1, combostatus=1, showscore=84088786, score=84088786, accuracy={300: 1629, 100: 17, 50: 0, 0: 2}, clicks=[629, 1029, 1, 0], hitresult=100, timestamp=150324, id=1647, hp=0.9190240000000001, maxcombo=2141, more=Circle(state=<States.FADEOUT: 2>, deltat=55, followstate=False, sliderhead=False, x=236.0, y=189.0))
bot_1 | 2020-10-12 17:55:48,539:TRACE:osr2mp4.osr2mp4.Osr2mp4:analyse_replay:RETURN None
bot_1 | 2020-10-12 17:55:48,539:TRACE:osr2mp4.osr2mp4.Osr2mp4:startvideo:CALL *() **{}
bot_1 | 2020-10-12 17:55:48,539:DEBUG:root:create_frame:entering preparedframes
bot_1 | 2020-10-12 17:55:48,558:DEBUG:root:create_frame:Starting process
bot_1 | 2020-10-12 17:55:48,561:DEBUG:root:create_frame:Start drawer 0
bot_1 | 2020-10-12 17:55:48,562:TRACE:root:draw:CALL (0, 6370), False
bot_1 | 2020-10-12 17:55:48,562:DEBUG:root:draw:process start
bot_1 | 2020-10-12 17:55:48,563:DEBUG:root:create_frame:Start writer 0
bot_1 | 2020-10-12 17:55:48,564:DEBUG:root:write:root/osr2mp4/286ae3ae-0cb4-11eb-a23f-0242ac130002temp/output0.mp4
bot_1 |
bot_1 | 2020-10-12 17:55:48,566:DEBUG:root:create_frame:Starting process
bot_1 | 2020-10-12 17:55:48,566:DEBUG:root:__init__:start preparing cursor
bot_1 | 2020-10-12 17:55:48,568:DEBUG:root:create_frame:Start drawer 1
bot_1 | 2020-10-12 17:55:48,569:TRACE:root:draw:CALL (6370, 12740), True
bot_1 | 2020-10-12 17:55:48,569:DEBUG:root:draw:process start
bot_1 | 2020-10-12 17:55:48,571:DEBUG:root:create_frame:Start writer 1
bot_1 | 2020-10-12 17:55:48,571:TRACE:osr2mp4.osr2mp4.Osr2mp4:startvideo:RETURN None
bot_1 | 2020-10-12 17:55:48,572:TRACE:osr2mp4.osr2mp4.Osr2mp4:startaudio:CALL *() **{}
bot_1 | 2020-10-12 17:55:48,572:DEBUG:root:write:root/osr2mp4/286ae3ae-0cb4-11eb-a23f-0242ac130002temp/output1.mp4
bot_1 |
bot_1 | 2020-10-12 17:55:48,574:DEBUG:root:__init__:start preparing cursor
bot_1 | 2020-10-12 17:55:48,604:DEBUG:root:__init__:start preparing cursormiddle
bot_1 | 2020-10-12 17:55:48,604:DEBUG:root:__init__:start preparing cursormiddle
bot_1 | 2020-10-12 17:55:48,604:DEBUG:root:__init__:start preparing cursortrail
bot_1 | 2020-10-12 17:55:48,604:DEBUG:root:__init__:start preparing cursortrail
bot_1 | 2020-10-12 17:55:48,611:DEBUG:root:__init__:start preparing scorenetry
bot_1 | 2020-10-12 17:55:48,611:DEBUG:root:__init__:start preparing scorenetry
bot_1 | 2020-10-12 17:55:48,671:DEBUG:root:__init__:start preparing scorenumber
bot_1 | 2020-10-12 17:55:48,677:DEBUG:root:__init__:start preparing scorenumber
bot_1 | cur_index 0
bot_1 |
bot_1 |
bot_1 | OFFSET: 3865.0
bot_1 | 0.9375
bot_1 | 2020-10-12 17:55:48,694:DEBUG:root:__init__:start preparing accuracy
bot_1 | 0.9375
bot_1 | 2020-10-12 17:55:48,694:DEBUG:root:__init__:start preparing accuracy
bot_1 | 2020-10-12 17:55:48,697:TRACE:osr2mp4.osr2mp4.Osr2mp4:startaudio:RETURN None
bot_1 | 2020-10-12 17:55:48,698:TRACE:osr2mp4.osr2mp4.Osr2mp4:startall:RETURN None
bot_1 | 2020-10-12 17:55:48,698:TRACE:osr2mp4.osr2mp4.Osr2mp4:joinall:CALL *() **{}
bot_1 | 2020-10-12 17:55:48,698:TRACE:osr2mp4.osr2mp4.Osr2mp4:joinvideo:CALL *() **{}
bot_1 | 2020-10-12 17:55:48,698:DEBUG:root:joinvideo:True
bot_1 | 2020-10-12 17:55:48,698:DEBUG:root:joinvideo:True
bot_1 | Start write
bot_1 | 2020-10-12 17:55:48,847:DEBUG:root:write:start writing: 0.275004
bot_1 | Start write
bot_1 | 2020-10-12 17:55:48,847:DEBUG:root:write:start writing: 0.282898
bot_1 | 2020-10-12 17:55:49,003:DEBUG:root:__init__:start preparing circle
bot_1 | 2020-10-12 17:55:49,017:DEBUG:root:__init__:start preparing circle
bot_1 | 2020-10-12 17:55:49,306:ERROR:root:processaudio:KeyError('42') from audio
bot_1 |
bot_1 |
bot_1 |
bot_1 | Process Process-5:
bot_1 | Traceback (most recent call last):
bot_1 | File "/usr/local/lib/python3.8/multiprocessing/process.py", line 315, in _bootstrap
bot_1 | self.run()
bot_1 | File "/usr/local/lib/python3.8/multiprocessing/process.py", line 108, in run
bot_1 | self._target(*self._args, **self._kwargs)
bot_1 | File "/root/osr2mp4/AudioProcess/CreateAudio.py", line 166, in processaudio
bot_1 | audioprc(my_info, beatmap, offset, endtime, mods, settings)
bot_1 | File "/root/osr2mp4/AudioProcess/CreateAudio.py", line 193, in audioprc
bot_1 | filenames = getfilenames(beatmap, settings.settings["Ignore beatmap hitsounds"])
bot_1 | File "/root/osr2mp4/AudioProcess/Utils.py", line 174, in getfilenames
bot_1 | f = getfilename(beatmap.timing_point[timingpoint_i], soundinfo, sampleset, hitsound, soundset, objtype)
bot_1 | File "/root/osr2mp4/AudioProcess/Utils.py", line 58, in getfilename
bot_1 | sample_name = sampleset[samplekey]
bot_1 | KeyError: '42'
bot_1 | done
bot_1 | 2020-10-12 17:55:49,526:DEBUG:root:__init__:start preparing background
bot_1 | done
bot_1 | 2020-10-12 17:55:49,526:DEBUG:root:__init__:start preparing background
bot_1 | 2020-10-12 17:55:49,753:DEBUG:root:__init__:start preparing sections
bot_1 | 2020-10-12 17:55:49,762:DEBUG:root:__init__:start preparing sections
bot_1 | 2020-10-12 17:55:49,773:DEBUG:root:__init__:start preparing scoreboard
bot_1 | 2020-10-12 17:55:49,774:DEBUG:root:__init__:start preparing scoreboard
bot_1 | 2020-10-12 17:55:49,860:DEBUG:root:__init__:start preparing done
bot_1 | 5 8 0.6961069335937501
bot_1 | 2020-10-12 17:55:49,873:ERROR:root:prepare_text:OSError('cannot open resource')
bot_1 | 2020-10-12 17:55:49,881:ERROR:root:prepare_text:OSError('cannot open resource')
bot_1 | cur_index 0
bot_1 | 2020-10-12 17:55:49,889:TRACE:root:draw:PROCESS (0, 6370), <osr2mp4.VideoProcess.Draw.Drawer object at 0x7f104c8963d0>
bot_1 | 2020-10-12 17:55:49,889:DEBUG:root:draw:setup done
bot_1 | Loading default path YImagesss menu-back
bot_1 | 2020-10-12 17:55:50,085:DEBUG:root:__init__:start preparing ur ranking
bot_1 | 2020-10-12 17:55:50,098:DEBUG:root:__init__:start preparing done
bot_1 | 5 8 0.6961069335937501
bot_1 | 2020-10-12 17:55:50,130:ERROR:root:prepare_text:OSError('cannot open resource')
bot_1 | 2020-10-12 17:55:50,137:ERROR:root:prepare_text:OSError('cannot open resource')
bot_1 | cur_index 6250
bot_1 | done
bot_1 | 2020-10-12 17:55:50,156:TRACE:root:draw:PROCESS (6370, 12740), <osr2mp4.VideoProcess.Draw.Drawer object at 0x7f104cfbc340>
bot_1 | 2020-10-12 17:55:50,156:DEBUG:root:draw:setup done
bot_1 | Starting draw
bot_1 | End draw 71.43674492835999
bot_1 | 2020-10-12 17:56:59,999:DEBUG:root:draw:
bot_1 | process done (0, 6370), <osr2mp4.VideoProcess.Draw.Drawer object at 0x7f104c8963d0>
bot_1 | 2020-10-12 17:56:59,999:DEBUG:root:draw:Drawing time: 0
bot_1 | 2020-10-12 17:56:59,999:DEBUG:root:draw:Total time: 71.43704152107239
bot_1 | 2020-10-12 17:56:59,999:DEBUG:root:draw:Waiting time: 8.521287679672241
bot_1 | 2020-10-12 17:56:59,999:DEBUG:root:draw:Changing value time: 0.33205676078796387
bot_1 | --- Logging error ---
bot_1 | Traceback (most recent call last):
bot_1 | File "/root/osr2mp4/ImageProcess/Objects/Components/Scoreboard.py", line 243, in getlocalscores
bot_1 | scores = getscores(self.beatmaphash, os.path.join(self.settings.osu, "scores.db"))
bot_1 | File "/root/osr2mp4/Parser/scoresparser.py", line 373, in getscores
bot_1 | scoresDb = open(dbpath, "rb")
bot_1 | FileNotFoundError: [Errno 2] No such file or directory: '/scores.db'
bot_1 |
bot_1 | During handling of the above exception, another exception occurred:
bot_1 |
bot_1 | Traceback (most recent call last):
bot_1 | File "/usr/local/lib/python3.8/logging/__init__.py", line 1081, in emit
bot_1 | msg = self.format(record)
bot_1 | File "/usr/local/lib/python3.8/logging/__init__.py", line 925, in format
bot_1 | return fmt.format(record)
bot_1 | File "/usr/local/lib/python3.8/logging/__init__.py", line 664, in format
bot_1 | record.message = record.getMessage()
bot_1 | File "/usr/local/lib/python3.8/logging/__init__.py", line 369, in getMessage
bot_1 | msg = msg % self.args
bot_1 | TypeError: not all arguments converted during string formatting
bot_1 | Call stack:
bot_1 | File "/usr/local/lib/python3.8/runpy.py", line 194, in _run_module_as_main
bot_1 | return _run_code(code, main_globals, None,
bot_1 | File "/usr/local/lib/python3.8/runpy.py", line 87, in _run_code
bot_1 | exec(code, run_globals)
bot_1 | File "/root/bot/__main__.py", line 12, in <module>
bot_1 | video = record(beatmap_path, replay_path)
bot_1 | File "/root/bot/recorder.py", line 35, in record
bot_1 | osr.startall()
bot_1 | File "/usr/local/lib/python3.8/site-packages/autologging.py", line 1039, in autologging_traced_instancemethod_delegator
bot_1 | return proxy(method, args, keywords)
bot_1 | File "/usr/local/lib/python3.8/site-packages/autologging.py", line 1196, in __call__
bot_1 | value = function(*args, **keywords)
bot_1 | File "/root/osr2mp4/osr2mp4.py", line 208, in startall
bot_1 | self.startvideo()
bot_1 | File "/usr/local/lib/python3.8/site-packages/autologging.py", line 1039, in autologging_traced_instancemethod_delegator
bot_1 | return proxy(method, args, keywords)
bot_1 | File "/usr/local/lib/python3.8/site-packages/autologging.py", line 1196, in __call__
bot_1 | value = function(*args, **keywords)
bot_1 | File "/root/osr2mp4/osr2mp4.py", line 177, in startvideo
bot_1 | self.drawers, self.writers, self.pipes, self.sharedarray = create_frame(self.settings, self.beatmap,
bot_1 | File "/root/osr2mp4/VideoProcess/CreateFrames.py", line 62, in create_frame
bot_1 | drawer.start()
bot_1 | File "/usr/local/lib/python3.8/multiprocessing/process.py", line 121, in start
bot_1 | self._popen = self._Popen(self)
bot_1 | File "/usr/local/lib/python3.8/multiprocessing/context.py", line 224, in _Popen
bot_1 | return _default_context.get_context().Process._Popen(process_obj)
bot_1 | File "/usr/local/lib/python3.8/multiprocessing/context.py", line 277, in _Popen
bot_1 | return Popen(process_obj)
bot_1 | File "/usr/local/lib/python3.8/multiprocessing/popen_fork.py", line 19, in __init__
bot_1 | self._launch(process_obj)
bot_1 | File "/usr/local/lib/python3.8/multiprocessing/popen_fork.py", line 75, in _launch
bot_1 | code = process_obj._bootstrap(parent_sentinel=child_r)
bot_1 | File "/usr/local/lib/python3.8/multiprocessing/process.py", line 315, in _bootstrap
bot_1 | self.run()
bot_1 | File "/usr/local/lib/python3.8/multiprocessing/process.py", line 108, in run
bot_1 | self._target(*self._args, **self._kwargs)
bot_1 | File "/root/osr2mp4/VideoProcess/Draw.py", line 182, in draw_frame
bot_1 | draw(shared, conn, beatmap, replay_info, resultinfo, videotime, settings, showranking)
bot_1 | File "/root/osr2mp4/VideoProcess/Draw.py", line 207, in draw
bot_1 | drawer = Drawer(shared, beatmap, frames, replay_info, resultinfo, videotime, settings)
bot_1 | File "/root/osr2mp4/VideoProcess/Draw.py", line 47, in __init__
bot_1 | self.setup_draw()
bot_1 | File "/root/osr2mp4/VideoProcess/Draw.py", line 61, in setup_draw
bot_1 | self.component = FrameObjects(self.frames, self.settings, self.beatmap.diff, light_replay_info, self.beatmap.meta, self.beatmap.hash, map_time)
bot_1 | File "/root/osr2mp4/VideoProcess/AFrames.py", line 215, in __init__
bot_1 | self.scoreboard = Scoreboard(frames.scoreboard, frames.scoreboardscore, frames.scoreboardeffect, replay_info, meta, maphash, settings)
bot_1 | File "/root/osr2mp4/ImageProcess/Objects/Components/Scoreboard.py", line 120, in __init__
bot_1 | self.getscores()
bot_1 | File "/root/osr2mp4/ImageProcess/Objects/Components/Scoreboard.py", line 194, in getscores
bot_1 | self.getlocalscores(mod)
bot_1 | File "/root/osr2mp4/ImageProcess/Objects/Components/Scoreboard.py", line 245, in getlocalscores
bot_1 | logging.error("from scoreboard", repr(e))
bot_1 | Message: 'from scoreboard'
bot_1 | Arguments: ("FileNotFoundError(2, 'No such file or directory')",)
bot_1 | 2020-10-12 17:57:00,008:DEBUG:root:joinvideo:Joined drawers 0
bot_1 | Release write
bot_1 | End write
bot_1 | 2020-10-12 17:57:00,023:DEBUG:root:write:
bot_1 | Writing done root/osr2mp4/286ae3ae-0cb4-11eb-a23f-0242ac130002temp/output0.mp4
bot_1 | 2020-10-12 17:57:00,023:DEBUG:root:write:Writing time: 12.312196969985962
bot_1 | 2020-10-12 17:57:00,024:DEBUG:root:write:Total time: 71.45969772338867
bot_1 | 2020-10-12 17:57:00,024:DEBUG:root:write:Waiting time: 54.33728504180908
bot_1 | 2020-10-12 17:57:00,024:DEBUG:root:write:Changing value time: 4.47427225112915
bot_1 | 2020-10-12 17:57:00,030:DEBUG:root:joinvideo:Joined writers 0
bot_1 | 2020-10-12 17:57:00,031:DEBUG:root:joinvideo:Closed conn 0
bot_1 | 2020-10-12 17:57:00,031:DEBUG:root:joinvideo:True
bot_1 | 2020-10-12 17:57:00,031:DEBUG:root:joinvideo:True
bot_1 | Starting draw
bot_1 | End draw 78.02247762680054
bot_1 | 2020-10-12 17:57:06,592:DEBUG:root:draw:
bot_1 | process done (6370, 12740), <osr2mp4.VideoProcess.Draw.Drawer object at 0x7f104cfbc340>
bot_1 | 2020-10-12 17:57:06,592:DEBUG:root:draw:Drawing time: 0
bot_1 | 2020-10-12 17:57:06,592:DEBUG:root:draw:Total time: 78.02273297309875
bot_1 | 2020-10-12 17:57:06,592:DEBUG:root:draw:Waiting time: 8.14038896560669
bot_1 | 2020-10-12 17:57:06,592:DEBUG:root:draw:Changing value time: 0.3120119571685791
bot_1 | --- Logging error ---
bot_1 | Traceback (most recent call last):
bot_1 | File "/root/osr2mp4/ImageProcess/Objects/Components/Scoreboard.py", line 243, in getlocalscores
bot_1 | scores = getscores(self.beatmaphash, os.path.join(self.settings.osu, "scores.db"))
bot_1 | File "/root/osr2mp4/Parser/scoresparser.py", line 373, in getscores
bot_1 | scoresDb = open(dbpath, "rb")
bot_1 | FileNotFoundError: [Errno 2] No such file or directory: '/scores.db'
bot_1 |
bot_1 | During handling of the above exception, another exception occurred:
bot_1 |
bot_1 | Traceback (most recent call last):
bot_1 | File "/usr/local/lib/python3.8/logging/__init__.py", line 1081, in emit
bot_1 | msg = self.format(record)
bot_1 | File "/usr/local/lib/python3.8/logging/__init__.py", line 925, in format
bot_1 | return fmt.format(record)
bot_1 | File "/usr/local/lib/python3.8/logging/__init__.py", line 664, in format
bot_1 | record.message = record.getMessage()
bot_1 | File "/usr/local/lib/python3.8/logging/__init__.py", line 369, in getMessage
bot_1 | msg = msg % self.args
bot_1 | TypeError: not all arguments converted during string formatting
bot_1 | Call stack:
bot_1 | File "/usr/local/lib/python3.8/runpy.py", line 194, in _run_module_as_main
bot_1 | return _run_code(code, main_globals, None,
bot_1 | File "/usr/local/lib/python3.8/runpy.py", line 87, in _run_code
bot_1 | exec(code, run_globals)
bot_1 | File "/root/bot/__main__.py", line 12, in <module>
bot_1 | video = record(beatmap_path, replay_path)
bot_1 | File "/root/bot/recorder.py", line 35, in record
bot_1 | osr.startall()
bot_1 | File "/usr/local/lib/python3.8/site-packages/autologging.py", line 1039, in autologging_traced_instancemethod_delegator
bot_1 | return proxy(method, args, keywords)
bot_1 | File "/usr/local/lib/python3.8/site-packages/autologging.py", line 1196, in __call__
bot_1 | value = function(*args, **keywords)
bot_1 | File "/root/osr2mp4/osr2mp4.py", line 208, in startall
bot_1 | self.startvideo()
bot_1 | File "/usr/local/lib/python3.8/site-packages/autologging.py", line 1039, in autologging_traced_instancemethod_delegator
bot_1 | return proxy(method, args, keywords)
bot_1 | File "/usr/local/lib/python3.8/site-packages/autologging.py", line 1196, in __call__
bot_1 | value = function(*args, **keywords)
bot_1 | File "/root/osr2mp4/osr2mp4.py", line 177, in startvideo
bot_1 | self.drawers, self.writers, self.pipes, self.sharedarray = create_frame(self.settings, self.beatmap,
bot_1 | File "/root/osr2mp4/VideoProcess/CreateFrames.py", line 62, in create_frame
bot_1 | drawer.start()
bot_1 | File "/usr/local/lib/python3.8/multiprocessing/process.py", line 121, in start
bot_1 | self._popen = self._Popen(self)
bot_1 | File "/usr/local/lib/python3.8/multiprocessing/context.py", line 224, in _Popen
bot_1 | return _default_context.get_context().Process._Popen(process_obj)
bot_1 | File "/usr/local/lib/python3.8/multiprocessing/context.py", line 277, in _Popen
bot_1 | return Popen(process_obj)
bot_1 | File "/usr/local/lib/python3.8/multiprocessing/popen_fork.py", line 19, in __init__
bot_1 | self._launch(process_obj)
bot_1 | File "/usr/local/lib/python3.8/multiprocessing/popen_fork.py", line 75, in _launch
bot_1 | code = process_obj._bootstrap(parent_sentinel=child_r)
bot_1 | File "/usr/local/lib/python3.8/multiprocessing/process.py", line 315, in _bootstrap
bot_1 | self.run()
bot_1 | File "/usr/local/lib/python3.8/multiprocessing/process.py", line 108, in run
bot_1 | self._target(*self._args, **self._kwargs)
bot_1 | File "/root/osr2mp4/VideoProcess/Draw.py", line 182, in draw_frame
bot_1 | draw(shared, conn, beatmap, replay_info, resultinfo, videotime, settings, showranking)
bot_1 | File "/root/osr2mp4/VideoProcess/Draw.py", line 207, in draw
bot_1 | drawer = Drawer(shared, beatmap, frames, replay_info, resultinfo, videotime, settings)
bot_1 | File "/root/osr2mp4/VideoProcess/Draw.py", line 47, in __init__
bot_1 | self.setup_draw()
bot_1 | File "/root/osr2mp4/VideoProcess/Draw.py", line 61, in setup_draw
bot_1 | self.component = FrameObjects(self.frames, self.settings, self.beatmap.diff, light_replay_info, self.beatmap.meta, self.beatmap.hash, map_time)
bot_1 | File "/root/osr2mp4/VideoProcess/AFrames.py", line 215, in __init__
bot_1 | self.scoreboard = Scoreboard(frames.scoreboard, frames.scoreboardscore, frames.scoreboardeffect, replay_info, meta, maphash, settings)
bot_1 | File "/root/osr2mp4/ImageProcess/Objects/Components/Scoreboard.py", line 120, in __init__
bot_1 | self.getscores()
bot_1 | File "/root/osr2mp4/ImageProcess/Objects/Components/Scoreboard.py", line 194, in getscores
bot_1 | self.getlocalscores(mod)
bot_1 | File "/root/osr2mp4/ImageProcess/Objects/Components/Scoreboard.py", line 245, in getlocalscores
bot_1 | logging.error("from scoreboard", repr(e))
bot_1 | Message: 'from scoreboard'
bot_1 | Arguments: ("FileNotFoundError(2, 'No such file or directory')",)
bot_1 | 2020-10-12 17:57:06,600:DEBUG:root:joinvideo:Joined drawers 1
bot_1 | Release write
bot_1 | End write
bot_1 | 2020-10-12 17:57:06,604:DEBUG:root:write:
bot_1 | Writing done root/osr2mp4/286ae3ae-0cb4-11eb-a23f-0242ac130002temp/output1.mp4
bot_1 | 2020-10-12 17:57:06,604:DEBUG:root:write:Writing time: 12.81538438796997
bot_1 | 2020-10-12 17:57:06,604:DEBUG:root:write:Total time: 78.03226280212402
bot_1 | 2020-10-12 17:57:06,604:DEBUG:root:write:Waiting time: 60.06943345069885
bot_1 | 2020-10-12 17:57:06,604:DEBUG:root:write:Changing value time: 4.2786948680877686
bot_1 | 2020-10-12 17:57:06,607:DEBUG:root:joinvideo:Joined writers 1
bot_1 | 2020-10-12 17:57:06,607:DEBUG:root:joinvideo:Closed conn 1
bot_1 | 2020-10-12 17:57:06,608:TRACE:osr2mp4.osr2mp4.Osr2mp4:joinvideo:RETURN None
bot_1 | 2020-10-12 17:57:06,608:TRACE:osr2mp4.osr2mp4.Osr2mp4:joinaudio:CALL *() **{}
bot_1 | 2020-10-12 17:57:06,608:TRACE:osr2mp4.osr2mp4.Osr2mp4:joinaudio:RETURN None
bot_1 | ffmpeg version 4.1.6-1~deb10u1 Copyright (c) 2000-2020 the FFmpeg developers
bot_1 | built with gcc 8 (Debian 8.3.0-6)
bot_1 | configuration: --prefix=/usr --extra-version='1~deb10u1' --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --arch=amd64 --enable-gpl --disable-stripping --enable-avresample --disable-filter=resample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libjack --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librsvg --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-lv2 --enable-omx --enable-openal --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libx264 --enable-shared
bot_1 | libavutil 56. 22.100 / 56. 22.100
bot_1 | libavcodec 58. 35.100 / 58. 35.100
bot_1 | libavformat 58. 20.100 / 58. 20.100
bot_1 | libavdevice 58. 5.100 / 58. 5.100
bot_1 | libavfilter 7. 40.101 / 7. 40.101
bot_1 | libavresample 4. 0. 0 / 4. 0. 0
bot_1 | libswscale 5. 3.100 / 5. 3.100
bot_1 | libswresample 3. 3.100 / 3. 3.100
bot_1 | libpostproc 55. 3.100 / 55. 3.100
bot_1 | [mov,mp4,m4a,3gp,3g2,mj2 @ 0x55bf626f1600] Auto-inserting h264_mp4toannexb bitstream filter
bot_1 | Input #0, concat, from '/root/osr2mp4/286ae3ae-0cb4-11eb-a23f-0242ac130002temp/listvideo.txt':
bot_1 | Duration: N/A, start: 0.000000, bitrate: 7982 kb/s
bot_1 | Stream #0:0(und): Video: h264 (Constrained Baseline) (avc1 / 0x31637661), yuv420p, 1280x720, 7982 kb/s, 60 fps, 60 tbr, 15360 tbn, 120 tbc
bot_1 | Metadata:
bot_1 | handler_name : VideoHandler
bot_1 | Output #0, mp4, to 'root/osr2mp4/286ae3ae-0cb4-11eb-a23f-0242ac130002temp/outputf.mp4':
bot_1 | Metadata:
bot_1 | encoder : Lavf58.20.100
bot_1 | Stream #0:0(und): Video: h264 (Constrained Baseline) (avc1 / 0x31637661), yuv420p, 1280x720, q=2-31, 7982 kb/s, 60 fps, 60 tbr, 15360 tbn, 15360 tbc
bot_1 | Metadata:
bot_1 | handler_name : VideoHandler
bot_1 | Stream mapping:
bot_1 | Stream #0:0 -> #0:0 (copy)
bot_1 | Press [q] to stop, [?] for help
bot_1 | [mov,mp4,m4a,3gp,3g2,mj2 @ 0x55bf627878c0] Auto-inserting h264_mp4toannexb bitstream filter
bot_1 | frame= 9156 fps=0.0 q=-1.0 Lsize= 149529kB time=00:02:32.58 bitrate=8028.0kbits/s speed= 737x
bot_1 | video:149491kB audio:0kB subtitle:0kB other streams:0kB global headers:0kB muxing overhead: 0.025910%
bot_1 | ffmpeg version 4.1.6-1~deb10u1 Copyright (c) 2000-2020 the FFmpeg developers
bot_1 | built with gcc 8 (Debian 8.3.0-6)
bot_1 | configuration: --prefix=/usr --extra-version='1~deb10u1' --toolchain=hardened --libdir=/usr/lib/x86_64-linux-gnu --incdir=/usr/include/x86_64-linux-gnu --arch=amd64 --enable-gpl --disable-stripping --enable-avresample --disable-filter=resample --enable-avisynth --enable-gnutls --enable-ladspa --enable-libaom --enable-libass --enable-libbluray --enable-libbs2b --enable-libcaca --enable-libcdio --enable-libcodec2 --enable-libflite --enable-libfontconfig --enable-libfreetype --enable-libfribidi --enable-libgme --enable-libgsm --enable-libjack --enable-libmp3lame --enable-libmysofa --enable-libopenjpeg --enable-libopenmpt --enable-libopus --enable-libpulse --enable-librsvg --enable-librubberband --enable-libshine --enable-libsnappy --enable-libsoxr --enable-libspeex --enable-libssh --enable-libtheora --enable-libtwolame --enable-libvidstab --enable-libvorbis --enable-libvpx --enable-libwavpack --enable-libwebp --enable-libx265 --enable-libxml2 --enable-libxvid --enable-libzmq --enable-libzvbi --enable-lv2 --enable-omx --enable-openal --enable-opengl --enable-sdl2 --enable-libdc1394 --enable-libdrm --enable-libiec61883 --enable-chromaprint --enable-frei0r --enable-libx264 --enable-shared
bot_1 | libavutil 56. 22.100 / 56. 22.100
bot_1 | libavcodec 58. 35.100 / 58. 35.100
bot_1 | libavformat 58. 20.100 / 58. 20.100
bot_1 | libavdevice 58. 5.100 / 58. 5.100
bot_1 | libavfilter 7. 40.101 / 7. 40.101
bot_1 | libavresample 4. 0. 0 / 4. 0. 0
bot_1 | libswscale 5. 3.100 / 5. 3.100
bot_1 | libswresample 3. 3.100 / 3. 3.100
bot_1 | libpostproc 55. 3.100 / 55. 3.100
bot_1 | Input #0, mov,mp4,m4a,3gp,3g2,mj2, from 'root/osr2mp4/286ae3ae-0cb4-11eb-a23f-0242ac130002temp/outputf.mp4':
bot_1 | Metadata:
bot_1 | major_brand : isom
bot_1 | minor_version : 512
bot_1 | compatible_brands: isomiso2avc1mp41
bot_1 | encoder : Lavf58.20.100
bot_1 | Duration: 00:02:32.60, start: 0.000000, bitrate: 8027 kb/s
bot_1 | Stream #0:0(und): Video: h264 (Constrained Baseline) (avc1 / 0x31637661), yuv420p, 1280x720, 8025 kb/s, 60 fps, 60 tbr, 15360 tbn, 120 tbc (default)
bot_1 | Metadata:
bot_1 | handler_name : VideoHandler
bot_1 | root/osr2mp4/286ae3ae-0cb4-11eb-a23f-0242ac130002temp/audio.mp3: No such file or directory
Reproduction:
Insert linked cusortrail to a skin folder https://i.imgur.com/ciiGngP.png
Use any settings
Behavior:
Gives TypeError( Cannot handle this data type: (1, 1, 4), <u2')
I tried converting one of my replays and it takes a really long time. I've waited for 30 minutes and the replay hasn't been converted. How do I speed up the conversion?
I want to use more modern codec than xvid but can't find instructions about possible variants.
Not sure if I've done something wrong, but I whenever I try to convert a video in 1080p 240 FPS, the video acts stangely. The hitsounds are higher pitched for the beginning, and after a few slight lagspikes it looks like the video is put in half speed, while the audio still stays the original speed. So the video and audio don't match at all, there are some weird artifacts in the video, and the sound is higher pitched/distorted
When I start the process of converting a replay it just gives out this error:
TypeError("object of type 'NoneType' has no len()")object of type 'NoneType' has no len() Traceback (most recent call last):
File "libs/pythonlib/lib/site-packages/osr2mp4app/run_osu.py", line 92, in
run()
File "libs/pythonlib/lib/site-packages/osr2mp4app/run_osu.py", line 50, in run
converter = Osr2mp4(filedata=config, filesettings=settings, filepp=ppsettings, logtofile=True, logpath=logpath)
File "C:\Users\Darius\Desktop\osr2mp4\libs\pythonlib\lib\site-packages\autologging.py", line 1041, in autologging_traced_instancemethod_delegator
return method(*args, **keywords)
File "C:\Users\Darius\Desktop\osr2mp4\libs\pythonlib\lib\site-packages\osr2mp4\osr2mp4.py", line 141, in init
self.replay_event, self.cur_time = setup_replay(replaypath, self.beatmap, reverse=reverse_replay)
File "C:\Users\Darius\Desktop\osr2mp4\libs\pythonlib\lib\site-packages\osr2mp4\Parser\osrparser.py", line 40, in setup_replay
for index in range(len(replay_info.play_data)):
TypeError: object of type 'NoneType' has no len()
I'm clueless and really wanna use the converter.
After going through all the stuff in the master repo, I cannot enable FFMPEG writer as python setup build_ext --inplace
cannot find the file.
For some strange reason, the video that gets produced doesn't match the replay I gave the program.
At the start of the video, you can see that the cursor does some strange thing, teleporting across the screen. It shows me getting a miss and a few 100s. The strange thing is, even the end screen acknowledges I SS'd.
Replay: https://t89.s3-us-west-1.amazonaws.com/2020/12/nXhZXFUh/faulty.osr
Video: https://t89.s3-us-west-1.amazonaws.com/2020/12/xxJPx3jt/faulty.avi
Map: https://osu.ppy.sh/beatmapsets/444335
In theory it shouldn't be too hard to draw another cursor on top of an existing replay
In the osu! replay I clearly died, but in the osr2mp4 i have more than 50% hp? is this lazer hp?
title
bruh i set mac osu folder in ./Desktop/osu!.app/Contents/Resources/drive_c/osu! and output in ./Movies and then this popped up. i did all the installing instructions BUT this keeps happening when i am tryna convert .osr file to mp4, i need help please.
Test using my skin Trail 1.1a.zip
Whenever i try to convert something it fails and says this.
CalledProcessError(1, ['ffmpeg', '-i', 'D:/osu!/Songs/147962 UPLIFT SPICE - Omega Rhythm\UPLIFT SPICE-01 - .mp3', '-ar', '44100', 'libs\pythonlib\lib\site-packages\osr2mp4/1c5b419a-5fc1-11eb-92af-208984e37d70temp/converted.wav', '-y'])
The replay shows the FL mod icon but doesn't show the gameplay in FL itself lol
oops, pressed submit by accident
terminate called after throwing an instance of 'std::bad_alloc'
what(): std::bad_alloc
Was trying to record this play, which also makes oppai fail so I suppose this shouldn't be too surprising. I don't know what the map looks like but it's probably wacky.
I could never wrap my head around this issue. Looked up ways to fix these types of issues, but haven't seen a proper one so I thought I would bring it up.
in src\Curves\curve.py line 6 is from scipy.misc import comb
but SciPy >=0.19 uses from scipy.special import comb
instead. source: scikit-learn/scikit-learn#9046
Every time I try to render a failed replay it goes to 99% then gives me this error
Process Process-3:
Traceback (most recent call last):
File "C:\Users\alchzh\osr2mp4\libs\pythonlib\lib\multiprocessing\process.py", line 297, in _bootstrap
self.run()
File "C:\Users\alchzh\osr2mp4\libs\pythonlib\lib\multiprocessing\process.py", line 99, in run
self._target(*self._args, **self._kwargs)
File "C:\Users\alchzh\osr2mp4\libs\pythonlib\lib\site-packages\osr2mp4\VideoProcess\Draw.py", line 190, in draw_frame
draw(shared, conn, beatmap, replay_info, resultinfo, videotime, settings, showranking)
File "C:\Users\alchzh\osr2mp4\libs\pythonlib\lib\site-packages\osr2mp4\VideoProcess\Draw.py", line 218, in draw
status = drawer.render_draw()
File "C:\Users\alchzh\osr2mp4\libs\pythonlib\lib\site-packages\osr2mp4\VideoProcess\Draw.py", line 88, in render_draw
in_break = check_break(self.beatmap, self.component, self.frame_info, self.updater, self.settings)
File "C:\Users\alchzh\osr2mp4\libs\pythonlib\lib\site-packages\osr2mp4\VideoProcess\calc.py", line 122, in check_break
component.sections.startbreak(1, breakperiod["Start"], updater.resultinfo[updater.info_index].hp)
IndexError: list index out of range
yh
In the osu! client, spinners don't move the combo color forward even though they're treated as their own combos. In osr2mp4 every time there's a spinner the combo color gets shifted incorrectly forward by one. This is pretty bad if there are color hax.
ComboOffset bits also shouldn't do anything if on a spinner, and the notes after the spinner should always be a new combo (the editor will correct these errors on save ppy/osu-stable-issues#733 )
https://gyazo.com/f9f93af0c3da11b08e499d962af87ac0
In both my tests I've done, in both cases the export appears as if I'm using mouse inputs even though they were disabled and not used in actual game. This isn't a big problem, but thought of it as an issue worth raising
Steps to reproduce:
Pick any replay with Touchscreen mod
What happens:
Traceback (most recent call last): File "main.py", line 24, in <module> main() File "main.py", line 15, in main osr2mp4.startall() File "C:\Users\Hazuki-san\AppData\Local\Programs\Python\Python36\lib\site-packages\autologging.py", line 1039, in autologging_traced_instancemethod_delegator return proxy(method, args, keywords) File "C:\Users\Hazuki-san\AppData\Local\Programs\Python\Python36\lib\site-packages\autologging.py", line 1196, in __call__ value = function(*args, **keywords) File "E:\GitHub\osr2mp4-core\osr2mp4\osr2mp4.py", line 153, in startall self.analyse_replay() File "C:\Users\Hazuki-san\AppData\Local\Programs\Python\Python36\lib\site-packages\autologging.py", line 1039, in autologging_traced_instancemethod_delegator return proxy(method, args, keywords) File "C:\Users\Hazuki-san\AppData\Local\Programs\Python\Python36\lib\site-packages\autologging.py", line 1196, in __call__ value = function(*args, **keywords) File "E:\GitHub\osr2mp4-core\osr2mp4\osr2mp4.py", line 144, in analyse_replay self.resultinfo = checkmain(self.beatmap, self.replay_info, self.settings) File "E:\GitHub\osr2mp4-core\osr2mp4\CheckSystem\checkmain.py", line 107, in checkmain hitobjectchecker = HitObjectChecker(beatmap, settings, replay_info.mod_combination, tests) File "E:\GitHub\osr2mp4-core\osr2mp4\CheckSystem\HitObjectChecker.py", line 71, in __init__ self.mod_multiplier = getmultiplier(mods) File "E:\GitHub\osr2mp4-core\osr2mp4\CheckSystem\HitObjectChecker.py", line 40, in getmultiplier result *= multiplier[m] KeyError: <Mod.NoVideo: 4>
Did this work on a previous version?
No
https://osu.ppy.sh/beatmapsets/37563#osu/130500 - EZHD and EZHDDT leaderboards do not load on this map, but do on others.
latest osr2mp4-gui release (0.1 x64)
Steps to reproduce:
Choose a replay with the relax mod in the config file.
The bug will occur with any relax play.
What happens:
The video shows a 0% accuracy full miss replay, as if no keys had been pressed during the playthrough.
Did this work on a previous version?
No
Additional information:
When the replay is opened in game, the 300s/100s/50s/misses are displayed but they show up as zeroes in the console osr2mp4 is launched in.
uhh cython isnt working right
cdef int mid = 0
cdef int left = 0
cdef int right = len(v)
while left < right:
mid = left + (right - left)/2
^
ccurves.pyx:31:13: Cannot assign type 'double' to 'int'
The score glitch starts at 1:44
### Additional information:
Video: https://www.youtube.com/watch?v=PCOAObgicxE
Replay: https://gofile.io/d/uVZAyR
Beatmap: https://osu.ppy.sh/s/1187071
only things that I saw with this program being wrong is:
scorebar (if you have it to change the lower your HP gets) and the amount of hp left
the spacing between numbers on the ending screen (accuracy,score, 100 count and so on)
amazing program regardless
When I set up a Osr2mp4
instance with default kwargs, it changes a bunch of logging settings and seemingly turns the global logging level to DEBUG
. Could we make this module use its own logger?
license file or section in readme.md should be added. open source repository without license cannot be looked at.
Replay has a sliderbreak on 0:45 horizontal slider but on video there no sliderbreak.
You can donwload osr and original video in description.
https://youtu.be/yYD_33wEwQ0
A declarative, efficient, and flexible JavaScript library for building user interfaces.
๐ Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. ๐๐๐
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google โค๏ธ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.