diff --git a/.gitignore b/.gitignore index f76730e9..18454588 100644 --- a/.gitignore +++ b/.gitignore @@ -21,3 +21,4 @@ yarn-debug.log* yarn-error.log* public/screenshots +metadata/ diff --git a/index.json b/index.json new file mode 100644 index 00000000..7d400613 --- /dev/null +++ b/index.json @@ -0,0 +1,33 @@ +{ index: + AlgoliaSearchNodeJS { + applicationID: 'HQ9I5Z6IM5', + apiKey: 'f5357f4070cdb6ed652d9c3feeede89f', + hosts: { read: [Array], write: [Array] }, + _timeouts: { connect: 2000, read: 5000, write: 30000 }, + _hostIndexes: { read: 0, write: 0 }, + _timeoutMultiplier: 1, + _shuffleResult: [ 2, 1, 3 ], + extraHeaders: {}, + cache: {}, + _ua: 'Algolia for Node.js 3.30.0', + _useCache: false, + _useRequestCache: false, + _useFallback: true, + _setTimeout: undefined, + _Agent: + Agent { + _events: [Object], + _eventsCount: 1, + _maxListeners: undefined, + defaultPort: 443, + protocol: 'https:', + options: [Object], + requests: {}, + sockets: {}, + freeSockets: {}, + keepAliveMsecs: 1000, + keepAlive: true, + maxSockets: Infinity, + maxFreeSockets: 256, + maxCachedSessions: 100, + _sessionCache: [Object] } } } diff --git a/names.json b/names.json new file mode 100644 index 00000000..7a8a2c58 --- /dev/null +++ b/names.json @@ -0,0 +1,750 @@ +[ + ["shufflerep.bmp", 1], + ["12universe2", 1], + ["24k winamp", 1], + ["volume_bu.bmp", 1], + ["52.bmp", 1], + ["52amp.avs", 1], + ["52ampbeta.avs", 1], + ["52amp", 1], + ["52logo.bmp", 1], + ["9mm", 1], + ["rlosingplacehi.jpeg", 1], + ["otorinolaringologija 2 (askin mix).avs", 1], + ["abyss", 1], + ["bladez", 1], + ["pokece~1.txt", 1], + ["adidas 2004", 1], + ["adventure", 1], + ["!!asbestos - aesthetomatic", 1], + ["vero - aftershock2003.avs", 1], + ["ahrgonthis_breed_frezorer", 1], + ["eqmain_with display.bmp", 1], + ["nfo.txt", 1], + ["numbers22.bmp", 1], + ["akh'faer", 1], + ["titlebar arb.bmp", 1], + ["all_screen.bmp", 1], + ["all_screen_min.bmp", 1], + ["pledit_big_screen.bmp", 1], + ["blockcr.txt", 1], + ["alex", 1], + ["information.txt", 1], + ["wswin.cur", 1], + ["alf", 1], + ["alu", 1], + ["aluminum", 1], + ["alysseum readme.txt", 1], + ["amber", 1], + ["splash.bmp", 1], + ["angelsanc", 1], + ["anokha - the construct", 1], + ["anokha - the next level", 1], + ["baseskin.zip", 1], + ["screen.jpg", 1], + ["screener.jpg", 1], + ["ceciltech - anthology", 1], + ["region-fx.txt", 1], + ["aqua", 1], + ["aqualizer", 1], + ["!!asbestos - aquaticatalyst", 1], + ["acumen_aqueous", 1], + ["aquila_v1_by_frezorer", 1], + ["aquila_frezorer.avs", 1], + ["arcane technology", 1], + ["region (old version).txt", 1], + ["archon 1.zip", 1], + ["posbar01.bmp", 1], + ["arcticlogo.jpg", 1], + ["ws_ftp.log", 1], + ["areslogo.jpg", 1], + ["reademe.txt", 1], + ["dunebig.jpg", 1], + ["dunesmall.jpg", 1], + ["artec_skinned", 1], + ["ascii_amp_5.0", 1], + ["ascii_amp5.0.txt", 1], + ["aselyum_v1_by_frezorer", 1], + ["atech", 1], + ["atmo-atf.avs", 1], + ["atonement", 1], + ["topdark.bmp", 1], + ["toplight.bmp", 1], + ["!!asbestos - aux element", 1], + ["avatar.txt", 1], + ["avatar.htm", 1], + ["avatar.gif", 1], + ["avatar ce.txt", 1], + ["a_x_i_d_e_n_t_e", 1], + ["axidente.bmp", 1], + ["bnkgothl.ttf", 1], + ["copia de pledit.bmp", 1], + ["copia de wsposbar.cur", 1], + ["cuadrado.bmp", 1], + ["axlar", 1], + ["btev3.psd", 1], + ["b-simple", 1], + ["b29", 1], + ["b30.jpg", 1], + ["b30", 1], + ["baldursgate2", 1], + ["ballzzz_2_futura", 1], + ["vampires", 1], + ["mb.psd", 1], + ["bassdrive", 1], + ["baz", 1], + ["main._bm", 1], + ["numbers._bm", 1], + ["playpaus._bm", 1], + ["text._bm", 1], + ["posbar._bm", 1], + ["monoster._bm", 1], + ["titlebar._bm", 1], + ["shufrep._bm", 1], + ["volume._bm", 1], + ["eqmain._bm", 1], + ["pledit._bm", 1], + ["mb._bm", 1], + ["video._bm", 1], + ["gen._bm", 1], + ["genex._bm", 1], + ["bdr", 1], + ["beamp-v291", 1], + ["bedfx.zip", 1], + ["beamp", 1], + ["below zero", 1], + ["bend", 1], + ["benderamppro.bmp", 1], + ["benedict", 1], + ["beton", 1], + ["bilens", 1], + ["posting blurb.txt", 1], + ["kerrys billy talent skin", 1], + ["bio-s_by_frezorer", 1], + ["b00.txt", 1], + ["copy of nums_ex.bmp", 1], + ["nums_ex_type2.bmp", 1], + ["biohazard", 1], + ["bl00dyamp v1.1", 1], + ["black screenshot.bmp", 1], + ["dialogs.txt", 1], + ["black_compact", 1], + ["blackhole.jpg", 1], + ["blackpolishedchrome", 1], + ["useless info.txt", 1], + ["blacktran", 1], + ["mbinner copy.bmp", 1], + ["wipeouter - blacksteel", 1], + ["blair_razor_project", 1], + ["imagemain.jpg", 1], + ["thumb.jpg", 1], + ["main-backup.bmp", 1], + ["bleach 3�_002.jpg", 1], + ["bleach skin", 1], + ["blister", 1], + ["new_001", 1], + ["blue fatale", 1], + ["region.bak", 1], + ["bls.bmp", 1], + ["blue_light_special_we", 1], + ["bluemateria12", 1], + ["blue wind paradise", 1], + ["main.xcf.gz", 1], + ["pledit.xcf.gz", 1], + ["shufrep.xcf.gz", 1], + ["bluecurve", 1], + ["bluemateria2", 1], + ["bluemetal2", 1], + ["move.cur", 1], + ["eqmain copy.bmp", 1], + ["diwa", 1], + ["bluexp", 1], + ["pvsnormal.cur", 1], + ["z8amp.txt", 1], + ["boneyard", 1], + ["background.bmp", 1], + ["boosterdesigns wa2", 1], + ["eject.bmp", 1], + ["broken glass", 1], + ["coredare key", 1], + ["canicule", 1], + ["mb_cardinal.htm", 1], + ["homelogo.bmp", 1], + ["orange.avs", 1], + ["orange2_ldm.wsz", 1], + ["text_2.bmp", 1], + ["caution", 1], + ["cb4", 1], + ["-cell-", 1], + ["chaotic.obsolescence", 1], + ["aitrinitiy.jpg", 1], + ["checkered", 1], + ["c.bmp", 1], + ["cheepplastic", 1], + ["eq_ex .bmp", 1], + ["chiral", 1], + ["s.bmp", 1], + ["chromium", 1], + ["swinbut.cur", 1], + ["circuit", 1], + ["skinwerk", 1], + ["vero - citric.avs", 1], + ["citrus glutton", 1], + ["templatedfx.zip", 1], + ["cityskin_1x.jpg", 1], + ["cityskin_1x_t.jpg", 1], + ["genex2 (experimental).bmp", 1], + ["cityskin 1.x", 1], + ["classic brick 1.3", 1], + ["36.jpg", 1], + ["cleanamp", 1], + ["cleanamp_v2", 1], + ["clearlooks_06", 1], + ["thurtheme", 1], + ["final_fantasy_vii_advent_children-lg.gif", 1], + ["image1.jpg", 1], + ["image11.gif", 1], + ["image15.bmp", 1], + ["image4.gif", 1], + ["cloud strife", 1], + ["clouds.bmp", 1], + ["clouds.nfo", 1], + ["mecha-blue.jpg", 1], + ["coldnuke", 1], + ["viscolor.txt.bak", 1], + ["new file.txt", 1], + ["pledit.txt.bak", 1], + ["cbuttons_2.bmp", 1], + ["pledit.bak", 1], + ["titlebar2.bmp", 1], + ["play.bmp", 1], + ["connection2.jpg", 1], + ["conundrum", 1], + ["coober_polyp_wa_shot.jpg", 1], + ["psize.cur.cur", 1], + ["core liq", 1], + ["諻�� (2) main.bmp", 1], + ["諻�� main.bmp", 1], + ["ck", 1], + ["cursores\\close.cur", 1], + ["cursores\\eqclose.cur", 1], + ["cursores\\eqnormal.cur", 1], + ["cursores\\eqslid.cur", 1], + ["cursores\\eqtitle.cur", 1], + ["cursores\\mainmenu.cur", 1], + ["cursores\\min.cur", 1], + ["cursores\\mmenu.cur", 1], + ["cursores\\normal.cur", 1], + ["cursores\\pclose.cur", 1], + ["cursores\\pnormal.cur", 1], + ["cursores\\posbar.cur", 1], + ["cursores\\psize.cur", 1], + ["cursores\\ptbar.cur", 1], + ["cursores\\pvscroll.cur", 1], + ["cursores\\pwinbut.cur", 1], + ["cursores\\pwsnorm.cur", 1], + ["cursores\\pwssize.cur", 1], + ["cursores\\songname.cur", 1], + ["cursores\\titlebar.cur", 1], + ["cursores\\volbal.cur", 1], + ["cursores\\volbar.cur", 1], + ["cursores\\winbut.cur", 1], + ["cursores\\wsclose.cur", 1], + ["cursores\\wsmin.cur", 1], + ["cursores\\wsnormal.cur", 1], + ["cursores\\wsposbar.cur", 1], + ["cursores\\wswinbut.cur", 1], + ["corona revamp m2.txt", 1], + ["cosmos", 1], + ["couchart", 1], + ["cain-inbloom", 1], + ["cox", 1], + ["crapco_final", 1], + ["crashing wav", 1], + ["!!asbestos - crimsonite", 1], + ["rayusskin", 1], + ["crossifixo v1", 1], + ["cryotank", 1], + ["cryotank-screenshot.jpg", 1], + ["plclose.cur", 1], + ["pwnorm.cur", 1], + ["vis_tmsvu.bmp", 1], + ["rcmix.txt", 1], + ["cupernicus", 1], + ["history.jpg", 1], + ["red lily", 1], + ["czarny", 1], + ["x10.jpg", 1], + ["!!asbestos - dark injection", 1], + ["darkmateria", 1], + ["dark shine.txt", 1], + ["the dark side", 1], + ["darkness.nfo", 1], + ["dav3.txt", 1], + ["dawns_early.bmp", 1], + ["dbsk - shim changmin", 1], + ["worstprev.bmp", 1], + ["copy of a - deli - llama amp", 1], + ["delta sleeper", 1], + ["delta sleeper.txt", 1], + ["niks.txt", 1], + ["niks.bmp", 1], + ["denon v1.0.txt", 1], + ["denuclos_by_frezorer_ice", 1], + ["permission.txt", 1], + ["descimate", 1], + ["descimate-screenshot.jpg", 1], + ["genex info.txt", 1], + ["desert rose", 1], + ["desertampv1", 1], + ["info skin.txt", 1], + ["eqmain.psp", 1], + ["devil", 1], + ["digitalbreeze", 1], + ["digital destination", 1], + ["dungeon.ttf", 1], + ["ds.jpg", 1], + ["nitez by raoul", 1], + ["djfellax", 1], + ["eqw.bmp", 1], + ["pld.bmp", 1], + ["dolt_rei ayanami", 1], + ["concept.ufo", 1], + ["dottedlines-winamp", 1], + ["double0seven", 1], + ["fairyland2105.jpg", 1], + ["new", 1], + ["e t e r n i t y", 1], + ["e t e r n i t y - f r o z e n", 1], + ["eq_ex copy.bmp", 1], + ["pwssize.cur.cur", 1], + ["elec", 1], + ["cursor.cur", 1], + ["treehuggingfriends", 1], + ["monoster copy.bmp", 1], + ["x.bmp", 1], + ["entire", 1], + ["shufrep �����.bmp", 1], + ["erosion", 1], + ["essence", 1], + ["border.bmp", 1], + ["additionalcomponents.zip", 1], + ["forever amp", 1], + ["everglow", 1], + ["evo", 1], + ["evolardnas", 1], + ["redmcwhitepants.jpg", 1], + ["overall.bmp", 1], + ["exile_extortion", 1], + ["expensive hi-fi.txt", 1], + ["expensive_hi-fi_1.1.txt", 1], + ["dropskin", 1], + ["fallamp", 1], + ["tactics_logo.bmp", 1], + ["fire_breath", 1], + ["flak", 1], + ["forever", 1], + ["titlebar.jpg", 1], + ["eqcelentius.bmp", 1], + ["fractamp-1.0.3", 1], + ["framed surrealism", 1], + ["frantic", 1], + ["frio__pary", 1], + ["bug", 1], + ["froggy", 1], + ["fruitloops", 1], + ["frozonandburnt", 1], + ["����", 1], + ["archee.bmp", 1], + ["futech.txt", 1], + ["g&g", 1], + ["gray.gif", 1], + ["gaia.winamp_classic", 1], + ["copy of eqmain.bmp", 1], + ["link.gif", 1], + ["link.bmp", 1], + ["gcubewa", 1], + ["gemz - sapphire", 1], + ["genaxis", 1], + ["generic ghost", 1], + ["freshbot.ttf", 1], + ["glass on metal.avs", 1], + ["glass on metal.txt", 1], + ["glass_on_metal", 1], + ["gojyo", 1], + ["goldenring.avs", 1], + ["gorilla", 1], + ["granitized v1.0.txt", 1], + ["graphite", 1], + ["skin-by o'connor.bmp", 1], + ["w a n t e d", 1], + ["~ps58.tmp", 1], + ["greenius", 1], + ["korn.bmp", 1], + ["greyscale", 1], + ["grillamp", 1], + ["gryphon.txt", 1], + ["gubbe4.avs", 1], + ["guilty gear x- holy order (ky kiske)", 1], + ["gymnasium", 1], + ["halloweenamp", 1], + ["scanpsd.txt", 1], + ["n8.jpg", 1], + ["new folder (2)", 1], + ["communityskin.txt", 1], + ["heavye.avs", 1], + ["eqslide.cur", 1], + ["hello kitty winamp skin by dantestyle.se", 1], + ["eqmain - with eq.bmp", 1], + ["hotline 1.9 amp", 1], + ["houston_rockets", 1], + ["hydroponics_2", 1], + ["hydroponics2", 1], + ["7 -- david -- skin -- i-winamp", 1], + ["iamp", 1], + ["sav1b76.tmp", 1], + ["sav63b.tmp", 1], + ["sav153e.tmp", 1], + ["volume2.bmp", 1], + ["viscolo2r.txt", 1], + ["boostr.bmp", 1], + ["iced cream", 1], + ["icespire", 1], + ["iflex amp", 1], + ["igziabeher", 1], + ["readme.nfo", 1], + ["_x__x_.bmp", 1], + ["__asdasd.bmp", 1], + ["altpledit.txt", 1], + ["bakaswat.bmp", 1], + ["noname3.bmp", 1], + ["normal.bmp", 1], + ["in2media", 1], + ["v-et", 1], + ["v-etbase.psp", 1], + ["industrialamp.png", 1], + ["viscolor1.txt", 1], + ["initialtheory", 1], + ["inlet", 1], + ["copia de eqmain.bmp", 1], + ["insomnia", 1], + ["insurrection", 1], + ["international", 1], + ["pledit2.bmp", 1], + ["industriel sewer", 1], + ["cursor.ico", 1], + ["iota preview.png", 1], + ["volbar.bmp", 1], + ["seguibk.ttf", 1], + ["video copy.bmp", 1], + ["ironcore_dfx.zip", 1], + ["coz.bmp", 1], + ["ironise", 1], + ["big_image.jpg", 1], + ["small_image.jpg", 1], + ["i4_small.jpg", 1], + ["ithaki_says_hi.gif", 1], + ["ithaki4_wallpaper.jpg", 1], + ["avs copy.bmp", 1], + ["jadetube4", 1], + ["journey", 1], + ["k-aus037", 1], + ["k-ausblack", 1], + ["k-ausblu", 1], + ["k-auserror", 1], + ["sav327.tmp", 1], + ["k10k", 1], + ["kago-amp 1", 1], + ["kago-amp 2", 1], + ["kago-amp 3", 1], + ["lalalala", 1], + ["kaoruxtakaheartbreak", 1], + ["kevito ampdeck.txt", 1], + ["stillwater - blue - underwater cave creature.milk", 1], + ["stillwater - blue - through the rings of neptune.milk", 1], + ["stillwater - blue - inside the tree.milk", 1], + ["stillwater - blue - hovering over neptune.milk", 1], + ["stillwater - blue - horizontology.milk", 1], + ["stillwater - blue - escape.milk", 1], + ["stillwater - blue - amongst the spirits.milk", 1], + ["stillwater - blue - 29000000000 bc.milk", 1], + ["juliette binoche.bmp", 1], + ["kingrickamp[red]", 1], + ["kispius", 1], + ["work_ice.ani", 1], + ["kiyone", 1], + ["numbers_orig.bmp", 1], + ["playpaus_orig.bmp", 1], + ["koyna", 1], + ["cursor.png", 1], + ["video.png", 1], + ["l-target metal", 1], + ["untitled-1 copy.png", 1], + ["l0b0t0my", 1], + ["landofthekirby", 1], + ["land of the kirby - starkirby", 1], + ["lbf", 1], + ["leprechaun", 1], + ["light.nfo", 1], + ["id skin", 1], + ["lbsamp", 1], + ["aquafont.ttf", 1], + ["linser", 1], + ["linser.jpg", 1], + ["yuck fou.txt", 1], + ["face.bmp", 1], + ["showcover.bmp", 1], + ["title.bmp", 1], + ["lxuryamp", 1], + ["header.bmp", 1], + ["madigi.avs", 1], + ["magatsu.jpg", 1], + ["beta - majs", 1], + ["marauding spat", 1], + ["chalk.cur", 1], + ["shot_hr_150.jpg", 1], + ["shot_hr_178.jpg", 1], + ["shot_hr_275.jpg", 1], + ["mavro_big.gif", 1], + ["mavro_small.gif", 1], + ["mc", 1], + ["permissions.txt", 1], + ["viscolor.bmp", 1], + ["titlebarvidaskin copy.bmp", 1], + ["media_amp", 1], + ["copy of main.bmp", 1], + ["sony copy.bmp", 1], + ["medilex", 1], + ["titlebar copy.jpg", 1], + ["asbestos - mephistoplatypus", 1], + ["nums-ex.bmp", 1], + ["untitled-2.bmp", 1], + ["merregnon", 1], + ["metabolic_v1.0", 1], + ["ev�l frezorer.txt", 1], + ["screen.gif", 1], + ["screen2.gif", 1], + ["smar-metalscale", 1], + ["metallacism", 1], + ["metallic", 1], + ["metatopi.skin_v1.0", 1], + ["komplett.bmp", 1], + ["eqmain.psd", 1], + ["!readme.txt", 1], + ["readme!!!.txt", 1], + ["mil-amp", 1], + ["plugin.ini", 1], + ["milleniumex", 1], + ["volumeb.bmp", 1], + ["andyb.ttf", 1], + ["minimal", 1], + ["mircrystec", 1], + ["misanthrope_iii", 1], + ["mmamp", 1], + ["mnemonic", 1], + ["mohamp", 1], + ["moonskin.bmp", 1], + ["mtl", 1], + ["copia de balance.bmp", 1], + ["copia de volume.bmp", 1], + ["main copia.bmp", 1], + ["index.php.htm", 1], + ["viscolor_bu.txt", 1], + ["n3o", 1], + ["n3on_(c)_deaddreamer_2007 v1.0", 1], + ["nameless one", 1], + ["naquila", 1], + ["license.rtf", 1], + ["equalizer.eqf", 1], + ["dotneostep1-winamp", 1], + ["neuro", 1], + ["new sky", 1], + ["nightfly", 1], + ["nike 2005", 1], + ["mbinnercopy.bmp", 1], + ["7th-meta-amp-test", 2], + ["main.psp", 2], + ["a400.txt", 2], + ["akuradfx.zip", 2], + ["pltext.bmp", 2], + ["glitch_alienmorph_v2", 2], + ["lyrics.txt", 2], + ["credit.txt", 2], + ["trish & koekoeh.jpg", 2], + ["pmenu.cur", 2], + ["skeletons2.bmp", 2], + ["kids.ttf", 2], + ["__readme_first.txt", 2], + ["cbuttons._bm", 2], + ["eq_ex._bm", 2], + ["sidamp.bmp", 2], + ["whatsnew.txt", 2], + ["file_id.diz", 2], + ["pledit_example.txt", 2], + ["skining updates.txt", 2], + ["pwsize.cur", 2], + ["exeed", 2], + ["titlebar copy.bmp", 2], + ["blade", 2], + ["viscolor.bak", 2], + ["mb2.bmp", 2], + ["bitmapz", 2], + ["other", 2], + ["other - eng", 2], + ["cropper.bmp", 2], + ["frames.bmp", 2], + ["genexinfo.txt", 2], + ["handgotl.ttf", 2], + ["readnow.txt", 2], + ["mbinner.txt", 2], + ["bitmaps", 2], + ["misc", 2], + ["cursors", 2], + ["misc - eng", 2], + ["tarnished", 2], + ["dantestyle.se ix winamp skin", 2], + ["dark blue skin", 2], + ["new light winamp 2", 2], + ["balance1.bmp", 2], + ["winshade.bmp", 2], + ["pmin.cur", 2], + ["main1.bmp", 2], + ["posbar2.bmp", 2], + ["06j.jpg", 2], + ["05.jpg", 2], + ["numback.bmp", 2], + ["foto grande jamiroquai.png", 2], + ["foto grande.png", 2], + ["region1.txt", 2], + ["green-dimension_v.2", 2], + ["eqmain_boxes.bmp", 2], + ["largei.jpg", 2], + ["pobar.cur", 2], + ["smalli.jpg", 2], + ["ibidamp.txt", 2], + ["cbutton.bmp", 2], + ["new folder", 2], + ["volba.cur", 2], + ["untitled", 2], + ["eqbut.cur", 2], + ["oldvolbal.cur", 2], + ["oldvolbar.cur", 2], + ["playlist.bmp", 2], + ["rep.bmp", 2], + ["shuf.bmp", 2], + ["!! asbestos - marine machine", 2], + ["mavro_says_hi.gif", 2], + ["grad.bmp", 2], + ["preview.bmp", 2], + ["readme_espa�ol.txt", 3], + ["l33t.txt", 3], + ["main.psd", 3], + ["eqmain1.bmp", 3], + ["mbbg.bmp", 3], + ["font.bmp", 3], + ["eq.bmp", 3], + ["main2.bmp", 3], + ["num_ex.bmp", 3], + ["eqmin.cur", 3], + ["text3.bmp", 3], + ["text4.bmp", 3], + ["text5.bmp", 3], + ["normal1.cur", 3], + ["pnormal1.cur", 3], + ["titlebar1.cur", 3], + ["wsnormal1.cur", 3], + ["methis", 3], + ["logo.bmp", 4], + ["buttons.bmp", 4], + ["skeletons.bmp", 4], + ["wclose.cur", 4], + ["spec.bmp", 4], + ["hoog0553.ttf", 4], + ["genex.txt", 4], + ["browser.bmp", 4], + ["preview.jpg", 4], + ["about.txt", 4], + ["1001winampskins.com.url", 4], + ["em.gif", 4], + ["text2.bmp", 4], + ["eqmain2.bmp", 5], + ["preview.gif", 5], + ["covertag.txt", 6], + ["genex-dots.txt", 6], + ["skin info.txt", 6], + ["21.ico", 6], + ["covertag.bmp", 8], + ["readme!.txt", 8], + ["mb.ini", 8], + ["author.txt", 9], + ["desktop.ini", 9], + ["pwsnormal.cur", 11], + ["albumlist.bmp", 12], + ["info.txt", 12], + ["vidamp.bmp", 14], + ["credits.txt", 14], + ["albumlist.txt", 15], + ["1001winampskins.com.txt", 15], + ["eqwinbut.cur", 15], + ["amarok.bmp", 17], + ["read me.txt", 19], + ["pspbrwse.jbf", 31], + ["winampmb.htm", 34], + ["mbinner.bmp", 67], + ["winampmb.txt", 87], + ["mikro.bmp", 113], + ["mmenu.cur", 131], + ["thumbs.db", 174], + ["volbar.cur", 227], + ["wsclose.cur", 236], + ["wsmin.cur", 238], + ["wswinbut.cur", 239], + ["pwsnorm.cur", 277], + ["pwssize.cur", 279], + ["wsposbar.cur", 279], + ["pwinbut.cur", 280], + ["pvscroll.cur", 281], + ["wsnormal.cur", 281], + ["mainmenu.cur", 282], + ["psize.cur", 283], + ["min.cur", 284], + ["eqclose.cur", 285], + ["songname.cur", 285], + ["titlebar.cur", 285], + ["pclose.cur", 286], + ["volbal.cur", 286], + ["close.cur", 287], + ["ptbar.cur", 287], + ["eqtitle.cur", 288], + ["posbar.cur", 288], + ["eqslid.cur", 289], + ["eqnormal.cur", 290], + ["normal.cur", 290], + ["pnormal.cur", 291], + ["winbut.cur", 292], + ["region.txt", 337], + ["nums_ex.bmp", 407], + ["genex.bmp", 409], + ["video.bmp", 414], + ["gen.bmp", 421], + ["avs.bmp", 605], + ["readme.txt", 643], + ["mb.bmp", 684], + ["numbers.bmp", 711], + ["balance.bmp", 985], + ["eq_ex.bmp", 1017], + ["playpaus.bmp", 1020], + ["monoster.bmp", 1021], + ["volume.bmp", 1021], + ["viscolor.txt", 1021], + ["titlebar.bmp", 1025], + ["eqmain.bmp", 1026], + ["pledit.txt", 1026], + ["pledit.bmp", 1027], + ["shufrep.bmp", 1027], + ["cbuttons.bmp", 1028], + ["text.bmp", 1028], + ["main.bmp", 1029], + ["posbar.bmp", 1029], + ["", 4709] +] diff --git a/package.json b/package.json index edf01737..811283db 100644 --- a/package.json +++ b/package.json @@ -3,9 +3,13 @@ "version": "0.1.0", "private": true, "dependencies": { + "algoliasearch": "^3.30.0", "async": "^2.6.0", "dominant-color": "^0.0.1", + "glob": "^7.1.3", "image-average-color": "^1.0.0", + "lodash": "^4.17.11", + "md5-file": "^4.0.0", "react": "^16.2.0", "react-dom": "^16.2.0", "react-redux": "^5.1.1", @@ -20,7 +24,7 @@ "test": "react-scripts test --env=jsdom", "eject": "react-scripts eject", "build-index": "node ./scripts/findSkins.js", - "create-search-index": "node ./scripts/createSearchIndex.js > index.json", + "create-search-index": "node ./scripts/createSearchIndex.js", "extract": "find ../webamp/experiments/automatedScreenshots/skins \"(\" -name \"*.wsz\" -o -name \"*.zip\" \")\" -exec node ./scripts/extractSkinText.js \"{}\" \\;" }, "prettier": {}, diff --git a/scripts/allFileNames.js b/scripts/allFileNames.js new file mode 100644 index 00000000..056b896a --- /dev/null +++ b/scripts/allFileNames.js @@ -0,0 +1,59 @@ +var glob = require("glob"); +const path = require("path"); +var { exec } = require("child_process"); +const _ = require("lodash"); + +function allSkinPaths() { + return new Promise((resolve, reject) => { + glob( + path.join( + __dirname, + "../../webamp/experiments/automatedScreenshots/skins/", + "**/*.wsz" + ), + function(err, files) { + if (err != null) { + reject(err); + return; + } + resolve(files); + } + ); + }); +} + +async function filenamesForSkin(skinPath) { + const paths = await new Promise((resolve, reject) => { + exec(`zipinfo -1 ${skinPath}`, function(error, stdout, stderr) { + if (error != null) { + //reject(error); + //return; + } + resolve(stdout); + }); + }); + return paths.split("\n"); +} + +async function allFilenames() { + const skins = await allSkinPaths(); + const paths = _.flatten( + await Promise.all( + skins.map(skin => { + return filenamesForSkin(skin); + }) + ) + ); + + const fileNames = paths.map(p => path.basename(p).toLowerCase()); + const uniqueFileNames = {}; + for (fileName of fileNames) { + uniqueFileNames[fileName] = + uniqueFileNames[fileName] == null ? 1 : uniqueFileNames[fileName] + 1; + } + const entries = Object.entries(uniqueFileNames); + const sorted = _.sortBy(entries, ([filename, count]) => count); + console.log(JSON.stringify(sorted, null, 2)); +} + +allFilenames(); diff --git a/scripts/createSearchIndex.js b/scripts/createSearchIndex.js index 918aace5..f2a0be6b 100644 --- a/scripts/createSearchIndex.js +++ b/scripts/createSearchIndex.js @@ -1,9 +1,35 @@ const skins = require("../src/skins.json"); +const algoliasearch = require("algoliasearch"); +const { getSkinMetadata } = require("./utils"); -const indexes = []; +const client = algoliasearch("HQ9I5Z6IM5", "f5357f4070cdb6ed652d9c3feeede89f"); +const index = client.initIndex("Skins"); -Object.entries(skins).forEach(([hash, { fileName }]) => { - indexes.push({ objectID: hash, fileName }); -}); +async function buildSkinIndex(hash) { + const textMetadata = await getSkinMetadata(hash, "extracted-data"); + return { + objectID: hash, + fileName: skins[hash].fileName, + emails: textMetadata.emails, + readmeText: textMetadata.raw.slice(0, 1000) + }; +} -console.log(JSON.stringify(indexes, null, 2)); +const indexesPromise = Promise.all( + Object.keys(skins).map(hash => { + return buildSkinIndex(hash); + }) +); + +async function go() { + const indexes = await indexesPromise; + + return new Promise((resolve, reject) => { + index.saveObjects(indexes, function(err, content) { + if (err != null) reject(err); + resolve(content); + }); + }); +} + +go().then(content => console.log(content)); diff --git a/scripts/extractSkinText.js b/scripts/extractSkinText.js index 4023bf8c..2e532a53 100644 --- a/scripts/extractSkinText.js +++ b/scripts/extractSkinText.js @@ -1,6 +1,61 @@ const path = require("path"); +const fs = require("fs"); +const md5File = require("md5-file"); var { exec } = require("child_process"); +const METADATA_ROOT = path.join(__dirname, "../metadata/"); + +function getSkinMetadataPath(md5, key) { + return path.join(METADATA_ROOT, md5, `${key}.json`); +} + +function getSkinMetadata(md5, key) { + const skinMetadataPath = getSkinMetadataPath(md5, key); + return new Promise((resolve, reject) => { + fs.readFile(skinMetadataPath, "utf8", (err, data) => { + if (err != null) reject(err); + resolve(data); + }); + }); +} + +function ensureDirectoryExistence(filePath) { + var dirname = path.dirname(filePath); + if (fs.existsSync(dirname)) { + return true; + } + ensureDirectoryExistence(dirname); + fs.mkdirSync(dirname); +} + +async function writeSkinMetadata(md5, key, data) { + const skinMetadataPath = getSkinMetadataPath(md5, key); + ensureDirectoryExistence(skinMetadataPath); + return new Promise((resolve, reject) => { + fs.writeFile( + skinMetadataPath, + JSON.stringify(data, null, 2), + "utf8", + err => { + if (err != null) { + reject(err); + } + resolve(skinMetadataPath); + } + ); + }); +} + +function getFileMd5(filePath) { + return new Promise((resolve, reject) => { + md5File(filePath, (err, hash) => { + if (err) reject(err); + + resolve(hash); + }); + }); +} + async function extractTextData(path) { const reg = /[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/g; const extract = value => (value && value.match(reg)) || []; @@ -42,11 +97,11 @@ async function extractTextData(path) { return { raw, emails: extract(raw) }; } -const skinPath = path.join(process.cwd(), process.argv[2]); +async function writeTextData(skinPath) { + const data = await extractTextData(skinPath); + const md5 = await getFileMd5(skinPath); + const skinMetadataPath = await writeSkinMetadata(md5, "extracted-data", data); + console.log("Done", skinMetadataPath); +} -extractTextData(skinPath).then(data => { - if (data.emails.length) { - // console.log(data.emails); - } - console.log(data); -}); +writeTextData(path.join(process.cwd(), process.argv[2])); diff --git a/scripts/utils.js b/scripts/utils.js new file mode 100644 index 00000000..a1fd3c72 --- /dev/null +++ b/scripts/utils.js @@ -0,0 +1,62 @@ +const path = require("path"); +const fs = require("fs"); +const md5File = require("md5-file"); +var { exec } = require("child_process"); + +const METADATA_ROOT = path.join(__dirname, "../metadata/"); + +function getSkinMetadataPath(md5, key) { + return path.join(METADATA_ROOT, md5, `${key}.json`); +} + +function getSkinMetadata(md5, key) { + const skinMetadataPath = getSkinMetadataPath(md5, key); + return new Promise((resolve, reject) => { + fs.readFile(skinMetadataPath, "utf8", (err, data) => { + if (err != null) reject(err); + resolve(JSON.parse(data)); + }); + }); +} + +function ensureDirectoryExistence(filePath) { + var dirname = path.dirname(filePath); + if (fs.existsSync(dirname)) { + return true; + } + ensureDirectoryExistence(dirname); + fs.mkdirSync(dirname); +} + +async function writeSkinMetadata(md5, key, data) { + const skinMetadataPath = getSkinMetadataPath(md5, key); + ensureDirectoryExistence(skinMetadataPath); + return new Promise((resolve, reject) => { + fs.writeFile( + skinMetadataPath, + JSON.stringify(data, null, 2), + "utf8", + err => { + if (err != null) { + reject(err); + } + resolve(skinMetadataPath); + } + ); + }); +} + +function getFileMd5(filePath) { + return new Promise((resolve, reject) => { + md5File(filePath, (err, hash) => { + if (err) reject(err); + + resolve(hash); + }); + }); +} + +module.exports = { + getSkinMetadata, + writeSkinMetadata +}; diff --git a/todo.md b/todo.md index 2e1bc243..2d5d70b0 100644 --- a/todo.md +++ b/todo.md @@ -23,10 +23,12 @@ - "No results" page - Keyboard navigation? Previous and next skin when focused? - Move images to CDN. Currently it's just s3 directly -- Add Google Analytics +- Disable Google Analytics in dev - Make Webamp clean up after itself - Update title when you pick a skin - Setup Sentry +- Press "/" to focus search +- Restore focus when leaving the modal ## Requires a server @@ -34,3 +36,9 @@ - Drag in a skin to upload! - We should detect if we have it or not - Allow users to add tags/author info + +## Future features + +- Skin explorer + - List files within the zip and let users download them + - Special viewer for txt files and bmp files diff --git a/yarn.lock b/yarn.lock index 2043b308..34f721c1 100644 --- a/yarn.lock +++ b/yarn.lock @@ -942,6 +942,10 @@ address@1.0.3, address@^1.0.1: version "1.0.3" resolved "https://registry.yarnpkg.com/address/-/address-1.0.3.tgz#b5f50631f8d6cec8bd20c963963afb55e06cbce9" +agentkeepalive@^2.2.0: + version "2.2.0" + resolved "http://registry.npmjs.org/agentkeepalive/-/agentkeepalive-2.2.0.tgz#c5d1bd4b129008f1163f236f86e5faea2026e2ef" + ajv-errors@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.0.tgz#ecf021fa108fd17dfb5e6b383f2dd233e31ffc59" @@ -971,6 +975,26 @@ ajv@^6.1.0, ajv@^6.5.3, ajv@^6.5.5: json-schema-traverse "^0.4.1" uri-js "^4.2.2" +algoliasearch@^3.30.0: + version "3.30.0" + resolved "https://registry.yarnpkg.com/algoliasearch/-/algoliasearch-3.30.0.tgz#355585e49b672e5f71d45b9c2b371ecdff129cd1" + dependencies: + agentkeepalive "^2.2.0" + debug "^2.6.8" + envify "^4.0.0" + es6-promise "^4.1.0" + events "^1.1.0" + foreach "^2.0.5" + global "^4.3.2" + inherits "^2.0.1" + isarray "^2.0.1" + load-script "^1.0.0" + object-keys "^1.0.11" + querystring-es3 "^0.2.1" + reduce "^1.0.1" + semver "^5.1.0" + tunnel-agent "^0.6.0" + align-text@^0.1.1, align-text@^0.1.3: version "0.1.4" resolved "https://registry.yarnpkg.com/align-text/-/align-text-0.1.4.tgz#0cd90a561093f35d0a99256c22b7069433fad117" @@ -2662,6 +2686,10 @@ dom-serializer@0: domelementtype "~1.1.1" entities "~1.1.1" +dom-walk@^0.1.0: + version "0.1.1" + resolved "https://registry.yarnpkg.com/dom-walk/-/dom-walk-0.1.1.tgz#672226dc74c8f799ad35307df936aba11acd6018" + domain-browser@^1.1.1: version "1.2.0" resolved "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz#3d31f50191a6749dd1375a7f522e823d42e54eda" @@ -2802,6 +2830,13 @@ entities@~1.1.1: version "1.1.1" resolved "https://registry.yarnpkg.com/entities/-/entities-1.1.1.tgz#6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0" +envify@^4.0.0: + version "4.1.0" + resolved "https://registry.yarnpkg.com/envify/-/envify-4.1.0.tgz#f39ad3db9d6801b4e6b478b61028d3f0b6819f7e" + dependencies: + esprima "^4.0.0" + through "~2.3.4" + errno@^0.1.3, errno@~0.1.7: version "0.1.7" resolved "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz#4684d71779ad39af177e3f007996f7c67c852618" @@ -2848,6 +2883,10 @@ es-to-primitive@^1.1.1: is-date-object "^1.0.1" is-symbol "^1.0.1" +es6-promise@^4.1.0: + version "4.2.5" + resolved "https://registry.yarnpkg.com/es6-promise/-/es6-promise-4.2.5.tgz#da6d0d5692efb461e082c14817fe2427d8f5d054" + escape-html@~1.0.3: version "1.0.3" resolved "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz#0258eae4d3d0c0974de1c169188ef0051d1d1988" @@ -3051,7 +3090,7 @@ eventemitter3@1.x.x: version "1.2.0" resolved "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-1.2.0.tgz#1c86991d816ad1e504750e73874224ecf3bec508" -events@^1.0.0: +events@^1.0.0, events@^1.1.0: version "1.1.1" resolved "https://registry.yarnpkg.com/events/-/events-1.1.1.tgz#9ebdb7635ad099c70dcc4c2a1f5004288e8bd924" @@ -3609,6 +3648,17 @@ glob@^7.0.3, glob@^7.0.5, glob@^7.1.1, glob@^7.1.2: once "^1.3.0" path-is-absolute "^1.0.0" +glob@^7.1.3: + version "7.1.3" + resolved "https://registry.yarnpkg.com/glob/-/glob-7.1.3.tgz#3960832d3f1574108342dafd3a67b332c0969df1" + dependencies: + fs.realpath "^1.0.0" + inflight "^1.0.4" + inherits "2" + minimatch "^3.0.4" + once "^1.3.0" + path-is-absolute "^1.0.0" + global-modules@1.0.0, global-modules@^1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/global-modules/-/global-modules-1.0.0.tgz#6d770f0eb523ac78164d72b5e71a8877265cc3ea" @@ -3627,6 +3677,13 @@ global-prefix@^1.0.1: is-windows "^1.0.1" which "^1.2.14" +global@^4.3.2: + version "4.3.2" + resolved "https://registry.yarnpkg.com/global/-/global-4.3.2.tgz#e76989268a6c74c38908b1305b10fc0e394e9d0f" + dependencies: + min-document "^2.19.0" + process "~0.5.1" + globals@^11.1.0, globals@^11.7.0: version "11.9.0" resolved "https://registry.yarnpkg.com/globals/-/globals-11.9.0.tgz#bde236808e987f290768a93d065060d78e6ab249" @@ -4458,6 +4515,10 @@ isarray@1.0.0, isarray@^1.0.0, isarray@~1.0.0: version "1.0.0" resolved "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz#bb935d48582cba168c06834957a54a3e07124f11" +isarray@^2.0.1: + version "2.0.4" + resolved "https://registry.yarnpkg.com/isarray/-/isarray-2.0.4.tgz#38e7bcbb0f3ba1b7933c86ba1894ddfc3781bbb7" + isemail@3.x.x: version "3.2.0" resolved "https://registry.yarnpkg.com/isemail/-/isemail-3.2.0.tgz#59310a021931a9fb06bbb51e155ce0b3f236832c" @@ -5130,6 +5191,10 @@ load-json-file@^2.0.0: pify "^2.0.0" strip-bom "^3.0.0" +load-script@^1.0.0: + version "1.0.0" + resolved "https://registry.yarnpkg.com/load-script/-/load-script-1.0.0.tgz#0491939e0bee5643ee494a7e3da3d2bac70c6ca4" + loader-fs-cache@^1.0.0: version "1.0.1" resolved "https://registry.yarnpkg.com/loader-fs-cache/-/loader-fs-cache-1.0.1.tgz#56e0bf08bd9708b26a765b68509840c8dec9fdbc" @@ -5208,7 +5273,7 @@ lodash.uniq@^4.5.0: version "4.17.5" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.5.tgz#99a92d65c0272debe8c96b6057bc8fbfa3bed511" -lodash@^4.13.1, lodash@^4.17.10, lodash@^4.17.5: +lodash@^4.13.1, lodash@^4.17.10, lodash@^4.17.11, lodash@^4.17.5: version "4.17.11" resolved "https://registry.yarnpkg.com/lodash/-/lodash-4.17.11.tgz#b39ea6229ef607ecd89e2c8df12536891cac9b8d" @@ -5282,6 +5347,10 @@ map-visit@^1.0.0: dependencies: object-visit "^1.0.0" +md5-file@^4.0.0: + version "4.0.0" + resolved "https://registry.yarnpkg.com/md5-file/-/md5-file-4.0.0.tgz#f3f7ba1e2dd1144d5bf1de698d0e5f44a4409584" + md5.js@^1.3.4: version "1.3.4" resolved "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.4.tgz#e9bdbde94a20a5ac18b04340fc5764d5b09d901d" @@ -5423,6 +5492,12 @@ mimic-fn@^1.0.0: version "1.2.0" resolved "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz#820c86a39334640e99516928bd03fca88057d022" +min-document@^2.19.0: + version "2.19.0" + resolved "https://registry.yarnpkg.com/min-document/-/min-document-2.19.0.tgz#7bd282e3f5842ed295bb748cdd9f1ffa2c824685" + dependencies: + dom-walk "^0.1.0" + mini-css-extract-plugin@0.4.3: version "0.4.3" resolved "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.4.3.tgz#98d60fcc5d228c3e36a9bd15a1d6816d6580beb8" @@ -5783,7 +5858,7 @@ object-hash@^1.1.4: version "1.2.0" resolved "https://registry.yarnpkg.com/object-hash/-/object-hash-1.2.0.tgz#e96af0e96981996a1d47f88ead8f74f1ebc4422b" -object-keys@^1.0.11: +object-keys@^1.0.11, object-keys@~1.0.0: version "1.0.12" resolved "https://registry.yarnpkg.com/object-keys/-/object-keys-1.0.12.tgz#09c53855377575310cca62f55bb334abff7b3ed2" @@ -6794,6 +6869,10 @@ process@^0.11.10: version "0.11.10" resolved "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz#7332300e840161bda3e69a1d1d91a7d4bc16f182" +process@~0.5.1: + version "0.5.2" + resolved "https://registry.yarnpkg.com/process/-/process-0.5.2.tgz#1638d8a8e34c2f440a91db95ab9aeb677fc185cf" + progress@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/progress/-/progress-2.0.0.tgz#8a1be366bf8fc23db2bd23f10c6fe920b4389d1f" @@ -6907,7 +6986,7 @@ qs@6.5.2, qs@~6.5.2: version "6.5.2" resolved "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz#cb3ae806e8740444584ef154ce8ee98d403f3e36" -querystring-es3@^0.2.0: +querystring-es3@^0.2.0, querystring-es3@^0.2.1: version "0.2.1" resolved "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz#9ec61f79049875707d69414596fd907a4d711e73" @@ -7199,6 +7278,12 @@ recursive-readdir@2.2.2: dependencies: minimatch "3.0.4" +reduce@^1.0.1: + version "1.0.1" + resolved "https://registry.yarnpkg.com/reduce/-/reduce-1.0.1.tgz#14fa2e5ff1fc560703a020cbb5fbaab691565804" + dependencies: + object-keys "~1.0.0" + redux@^4.0.1: version "4.0.1" resolved "https://registry.yarnpkg.com/redux/-/redux-4.0.1.tgz#436cae6cc40fbe4727689d7c8fae44808f1bfef5" @@ -7572,7 +7657,7 @@ selfsigned@^1.9.1: version "5.5.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.5.0.tgz#dc4bbc7a6ca9d916dee5d43516f0092b58f7b8ab" -semver@^5.5.0, semver@^5.5.1: +semver@^5.1.0, semver@^5.5.0, semver@^5.5.1: version "5.6.0" resolved "https://registry.yarnpkg.com/semver/-/semver-5.6.0.tgz#7e74256fbaa49c75aa7c7a205cc22799cac80004" @@ -8170,7 +8255,7 @@ through2@^2.0.0: readable-stream "~2.3.6" xtend "~4.0.1" -through@^2.3.6: +through@^2.3.6, through@~2.3.4: version "2.3.8" resolved "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz#0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5"