UNPKG

parse-osr

Version:

A simple parser for osu! replay (.osr) file format.

2 lines (1 loc) 1.31 kB
import{decodeUInt64 as d}from"leb";import{decompress as a}from"lzma";var l=new TextDecoder,s=0,n=[];function u(){return s++,n[s-1]}function o(r){return s+=r,n.slice(s-r,s).reduceRight((t,e)=>t*256+e)}function p(){if(n[s]===11){s++;let r=d(n.slice(s,s+8)),t=r.value;return s+=t+r.nextIndex,l.decode(Uint8Array.from(n.slice(s-t,s)))}return s++,""}function m(r,t=!1){s=0,n=[...r];let e=[];e.push(u()),e.push(o(4));for(let c=0;c<3;c++)e.push(p());for(let c=0;c<6;c++)e.push(o(2));e.push(o(4)),e.push(o(2)),e.push(u()),e.push(o(4)),e.push(p()),e.push(o(8));let i=o(4);return e.push(i),s+=i,t?e.push(""):e.push(a(n.slice(s-i,s))),e.push(o(8)),s+7<n.length&&e.push(o(8)),e}var f=r=>r.split(",").slice(0,-1).map(t=>t.split("|").map(e=>Number(e))),h=r=>new Date(Number((BigInt(r)-621355968000000000n)/10000n));function x(r){if(r===0)return 0;let t=[];for(let e=0;e<31;e++)(r&1<<e)>>e&&t.push(e);return t}function g(r,t){let e=[...r];return t.mods&&(e[14]=x(e[14])),t.lifeBar&&(e[15]=f(e[15])),t.time&&(e[16]=h(e[16])),t.replayData&&(e[18]=f(e[18])),e}var D=r=>Object.fromEntries(["mode","ver","map","name","hash","great","ok","meh","geki","katu","miss","score","combo","perfect","mods","lifeBar","time","length","data","id","tp"].map((t,e)=>[t,r[e]!==void 0?r[e]:null]));export{g as decode,D as objectify,m as parse};