{"id":80222,"date":"2020-05-04T13:42:18","date_gmt":"2020-05-04T11:42:18","guid":{"rendered":"https:\/\/prohoster.info\/blog\/administrirovanie\/museria-deczentralizovannoe-hranilishhe-muzyki"},"modified":"2020-05-04T13:42:18","modified_gmt":"2020-05-04T11:42:18","slug":"museria-deczentralizovannoe-hranilishhe-muzyki","status":"publish","type":"post","link":"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/museria-deczentralizovannoe-hranilishhe-muzyki","title":{"rendered":"Museria \u2014 decentralizovan\u00e9 \u00falo\u017ei\u0161t\u011b hudby","gt_translate_keys":[{"key":"rendered","format":"text"}]},"content":{"rendered":"<p><img decoding=\"async\" alt=\"Museria \u2014 decentralizovan\u00e9 \u00falo\u017ei\u0161t\u011b hudby\" src=\"\/wp-content\/uploads\/2020\/05\/e5323f70f0df3f3bb6fb92ae0544ad2f.jpg\" style=\"display:block;margin: 0 auto;\" \/><br \/>\n<br \/>\nJednou jsem se rozhodl napsat aplikaci pro v\u00fdb\u011br hudby, kterou bych mohl poslouchat doma, venku, p\u0159i tr\u00e9ninku atd. A abych to v\u0161echno mohl m\u00edt v jednom toku s minim\u00e1ln\u00edm zapojen\u00edm z m\u00e9 strany. Vymyslel jsem architekturu, nakreslil prototyp a nakonec jsem narazil na jeden \"mal\u00fd probl\u00e9m\". <br \/>\n<noindex><a rel=\"nofollow\" name=\"habracut\"><\/a><\/noindex><br \/>\nAle nebylo jasn\u00e9, odkud vz\u00edt samotn\u00e9 soubory p\u00edsn\u00ed. Do t\u00e9 doby VKontakte ji\u017e uzav\u0159elo API, na velk\u00fdch hudebn\u00edch port\u00e1lech to tak\u00e9 ztichlo, dokonce i p\u00edsn\u011b se poskytovaly po \u010d\u00e1stech, aby se nedaly parsovat. Z\u016fst\u00e1valy pouze n\u011bjak\u00e9 jednor\u00e1zov\u00e9 weby s tuny reklamy a r\u016fzn\u00fdmi nepo\u0159\u00e1dky, r\u016fzn\u00e9 pochyben\u00e9 programy-grabbery a dal\u0161\u00ed \"\u0161pinav\u00e9\" varianty. Ve zkratce, \u017e\u00e1dn\u00e9 skute\u010dn\u011b dobr\u00e9 \u0159e\u0161en\u00ed. Samoz\u0159ejm\u011b, mohu si zakoupit p\u0159edplatn\u00e9 na n\u011bjakou Yandex Music nebo podobn\u00e9. Ale op\u011bt, nikde tam nen\u00ed otev\u0159en\u00e9 ve\u0159ejn\u00e9 API a nem\u00e1\u0161 p\u0159\u00edstup k hudb\u011b programov\u011b. N\u011bkolik velk\u00fdch spole\u010dnost\u00ed v podstat\u011b omezilo ostatn\u00ed v p\u0159\u00edstupu k hudb\u011b. Pro\u010d se to v\u016fbec stalo? Kdy\u017e jsem se pono\u0159il hloub\u011bji, bylo jasn\u00e9, \u017ee hlavn\u00ed probl\u00e9m spo\u010d\u00edv\u00e1 v autorsk\u00fdch pr\u00e1vech. Sou\u010dasn\u00e9 \u0159e\u0161en\u00ed v podob\u011b p\u0159edplatn\u00e9ho vyhovuje mnoha komer\u010dn\u00edm autor\u016fm hudebn\u00edch d\u011bl a t\u011bmto spole\u010dnostem. P\u0159itom nekomer\u010dn\u00ed a podm\u00edn\u011bn\u011b komer\u010dn\u00ed hudba tak\u00e9 pat\u0159\u00ed do obecn\u00e9ho seznamu. Bu\u010f plat\u00ed\u0161 za v\u0161echno, nebo nesly\u0161\u00ed\u0161 v\u016fbec nic.<\/p>\n<p>A za\u010dal jsem p\u0159em\u00fd\u0161let, co s t\u00edm v\u0161\u00edm d\u011blat. Jak mohu organizovat voln\u00e9 \u0161\u00ed\u0159en\u00ed hudby? Co bych d\u011blal, kdybych s\u00e1m vytv\u00e1\u0159el hudbu a cht\u011bl na tom vyd\u011bl\u00e1vat? L\u00edbilo by se mi, kdyby se moje p\u00edsn\u011b za\u010daly \u0161\u00ed\u0159it pir\u00e1tsky? Jak\u00e9 v\u016fbec existuje alternativn\u00ed \u0159e\u0161en\u00ed? <\/p>\n<p>Nakonec se objevily dv\u011b hlavn\u00ed probl\u00e9my, kter\u00e9 je t\u0159eba \u0159e\u0161it:<\/p>\n<ul>\n<li>Organizace voln\u00e9ho \u0161\u00ed\u0159en\u00ed hudby pohodln\u00fdmi metodami pro v\u011bt\u0161inu lid\u00ed, v\u010detn\u011b programov\u00fdch.<\/li>\n<li>Nab\u00eddka alternativ pro tv\u016frce hudby na v\u00fdd\u011blek<\/li>\n<\/ul>\n<p><\/p>\n<h3>Glob\u00e1ln\u00ed decentralizovan\u00e9 \u00falo\u017ei\u0161t\u011b hudby<\/h3>\n<p>\nZpo\u010d\u00e1tku jsem se pokusil naj\u00edt existuj\u00edc\u00ed \u0159e\u0161en\u00ed a postavit v\u0161e na tohoto z\u00e1kladu. Po ur\u010dit\u00e9 dob\u011b hled\u00e1n\u00ed m\u011b jako prvn\u00ed zaujalo <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/ipfs\/ipfs\">ipfs<\/a><\/noindex>. Za\u010dal jsem realizaci sv\u00e9 my\u0161lenky, ale po chv\u00edli jsem zjistil n\u011bkolik kritick\u00fdch probl\u00e9m\u016f s t\u00edmto \u0159e\u0161en\u00edm:<\/p>\n<ul>\n<li>Ipfs \u2014 \u00falo\u017ei\u0161t\u011b pro v\u0161echno a v\u0161ude. Obsahuje obr\u00e1zky, hudbu, videa a cokoliv jin\u00e9ho. Ve zjednodu\u0161en\u00e9m slova smyslu jde o velkou planet\u00e1rn\u00ed \"skl\u00e1dkou\". Proto kdy\u017e spust\u00edte sv\u016fj uzel, ihned \u010del\u00edte obrovsk\u00e9 z\u00e1t\u011b\u017ei. Stroj se doslova zm\u00edt\u00e1 v bolesti. <\/li>\n<li>Jak\u00fdsi nedokon\u010den\u00fd mechanismus na shroma\u017e\u010fov\u00e1n\u00ed \"odpadu\". Nev\u00edm, jak je to te\u010f, ale v t\u00e9 dob\u011b, pokud jste v konfiguraci uvedli, \u017ee chcete omezit \u00falo\u017ei\u0161t\u011b na deset gigabajt\u016f dat, to v\u016fbec nic neznamenalo. \u00dalo\u017ei\u0161t\u011b se rozr\u016fstalo, ignoruj\u00edc mnoh\u00e9 konfigura\u010dn\u00ed parametry. Nakonec bylo nutn\u00e9 m\u00edt obrovsk\u00fd prostor na pevn\u00e9m disku, ne\u017e IPFS p\u0159ijde na to, jak se zbavit nepot\u0159ebn\u00e9ho.<\/li>\n<li>V dob\u011b pou\u017e\u00edv\u00e1n\u00ed knihovny (nev\u00edm, jak je to te\u010f) u klienta nebyly implementov\u00e1ny timeouty. Po\u0161le se \u017e\u00e1dost na z\u00edsk\u00e1n\u00ed souboru, a pokud tam nen\u00ed, tak prost\u011b vis\u00edte. Samoz\u0159ejm\u011b, lid\u00e9 p\u0159i\u0161li s r\u016fzn\u00fdmi obchvaty, kter\u00e9 \u010d\u00e1ste\u010dn\u011b vy\u0159e\u0161ily probl\u00e9m, ale byla to jen pomocn\u00e1 \u0159e\u0161en\u00ed. Takov\u00e9 v\u011bci by m\u011bly b\u00fdt standardn\u011b zahrnuty.<\/li>\n<\/ul>\n<p>\nBylo tak\u00e9 mnoho men\u0161\u00edch probl\u00e9m\u016f, dojem jsem m\u011bl tehdy jednozna\u010dn\u00fd: tohle nem\u016f\u017eete pou\u017e\u00edt pro projekt. Pokra\u010doval jsem v hled\u00e1n\u00ed \u00falo\u017ei\u0161t\u011b, zkoumali r\u016fzn\u00e9 mo\u017enosti, ale nakonec jsem nic vhodn\u00e9ho nena\u0161el.<\/p>\n<p>Nakonec jsem se rozhodl, \u017ee zkus\u00edm napsat decentralizovan\u00e9 \u00falo\u017ei\u0161t\u011b s\u00e1m. A\u010dkoliv se nebude uch\u00e1zet o roli meziplanet\u00e1rn\u00edho, bude \u0159e\u0161it konkr\u00e9tn\u00ed \u00fakol.<\/p>\n<p>Takto vznikly <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/ortexx\/spreadable\">spreadable<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/ortexx\/storacle\/\">storacle<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/ortexx\/metastocle\">metastocle<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/ortexx\/museria\">museria<\/a><\/noindex>, <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/ortexx\/museria-global\">museria-global<\/a><\/noindex>. <\/p>\n<p><b>spreadable <\/b> \u2014 je to hlavn\u00ed, nejni\u017e\u0161\u00ed vrstva, kter\u00e1 umo\u017e\u0148uje spojit uzly do s\u00edt\u011b. Obsahuje algoritmus, kter\u00fd jsem zat\u00edm implementoval \u010d\u00e1ste\u010dn\u011b pro p\u0159ibli\u017en\u011b 10 000 server\u016f. Pln\u00e1 verze algoritmu je mnohem slo\u017eit\u011bj\u0161\u00ed na realizaci a vy\u017eadovala by je\u0161t\u011b n\u011bkolik dal\u0161\u00edch m\u011bs\u00edc\u016f (mo\u017en\u00e1 i v\u00edce).<\/p>\n<p>Podrobn\u011b spreadable v tomto \u010dl\u00e1nku popisovat nebudu, rad\u011bji nap\u00ed\u0161u zvl\u00e1\u0161\u0165 n\u011bkdy. Zde pouze zd\u016frazn\u00edm n\u011bkter\u00e9 vlastnosti:<\/p>\n<ul>\n<li>Funguje p\u0159es http\/https.<\/li>\n<li>Je mo\u017en\u00e9 vytv\u00e1\u0159et samostatnou s\u00ed\u0165 pro konkr\u00e9tn\u00ed \u00fakol, co\u017e v\u00fdrazn\u011b sn\u00ed\u017e\u00ed z\u00e1t\u011b\u017e na ka\u017ed\u00fd jednotliv\u00fd projekt, ne\u017e kdyby byly v\u0161echny v jedn\u00e9 s\u00edti.<\/li>\n<li>P\u016fvodn\u011b byl promy\u0161len mechanismus s timeouty a dal\u0161\u00edmi drobnostmi. A to funguje pro v\u0161echny metody, jak v klientovi, tak v uzlu. Lze flexibiln\u011b \u0159\u00eddit parametry z vlastn\u00ed aplikace.<\/li>\n<li>Knihovna je napsan\u00e1 v nodejs. Probl\u00e9my s v\u00fdkonem stacku jsou kompenzov\u00e1ny decentralizovanou povahou. Z\u00e1t\u011b\u017e lze \"rozlo\u017eit\", zv\u00fd\u0161en\u00edm po\u010dtu uzl\u016f. Na opl\u00e1tku je zde mnoho v\u00fdhod: obrovsk\u00e1 komunita, jednoduchost a pohodlnost pr\u00e1ce, izomorfn\u00ed klient, absence extern\u00edch z\u00e1vislost\u00ed atd.<\/li>\n<\/ul>\n<p>\n<b>storacle <\/b> \u2014 to je vrstva d\u011bd\u00edc\u00ed od spreadable, kter\u00e1 umo\u017e\u0148uje ukl\u00e1dat soubory v s\u00edti. Ka\u017ed\u00fd soubor m\u00e1 sv\u016fj hash podle obsahu, podle kter\u00e9ho jej lze pozd\u011bji z\u00edskat. Soubory nejsou rozd\u011bleny na bloky, ale uchov\u00e1vaj\u00ed se v celku.<\/p>\n<p><b>metastocle <\/b> \u2014 vrstva d\u011bd\u00edc\u00ed od spreadable, kter\u00e1 umo\u017e\u0148uje ukl\u00e1dat v s\u00edti data, ale nikoli soubory. Rozhran\u00ed je podobn\u00e9 nosql datab\u00e1z\u00edm. M\u016f\u017eete nap\u0159\u00edklad p\u0159idat soubor do storacle, z\u00edskat jeho hash a zapsat do metastocle s vazbou na n\u011bco.<\/p>\n<p><b>museria<\/b> \u2014 d\u011bd\u00ed od storacle a metastocle. Tato vrstva se p\u0159\u00edmo odpov\u00edd\u00e1 za ukl\u00e1d\u00e1n\u00ed hudby. \u00dalo\u017ei\u0161t\u011b pracuje pouze s mp3 soubory a id3 tagy. <\/p>\n<p>Jako \"kl\u00ed\u010d\" k p\u00edsni se pou\u017e\u00edv\u00e1 jej\u00ed \u00fapln\u00fd n\u00e1zev ve form\u011b <b>Interpret (TPE1) \u2014 N\u00e1zev (TIT2)<\/b>. Nap\u0159\u00edklad:<\/p>\n<ul>\n<li>Brimstone \u2014 The Burden<\/li>\n<li>Hi-rez \u2014 Lost My Way (feat. Emilio Rojas, Dani Devinci)<\/li>\n<\/ul>\n<p>\nMaxim\u00e1ln\u011b podrobn\u011b se lze dozv\u011bd\u011bt, jak se formuj\u00ed n\u00e1zvy p\u00edsn\u00ed <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/ortexx\/museria\/blob\/master\/src\/utils.js\">tady<\/a><\/noindex>. Je t\u0159eba se pod\u00edvat na funkci <b>utils.beautifySongTitle()<\/b>.<\/p>\n<p>Shodou na kl\u00ed\u010d\u00edch je pova\u017eov\u00e1no za procento stanoven\u00e9 v nastaven\u00ed uzlu. Nap\u0159\u00edklad hodnota 0.85 znamen\u00e1, \u017ee pokud funkce porovn\u00e1n\u00ed kl\u00ed\u010d\u016f (n\u00e1zv\u016f p\u00edsn\u00ed) zjist\u00ed podobnost v\u011bt\u0161\u00ed ne\u017e 85%, pak se jedn\u00e1 o tut\u00e9\u017e p\u00edse\u0148.<\/p>\n<p>Algoritmus pro ur\u010den\u00ed podobnosti je tak\u00e9 tam, ve funkci <b>utils.getSongSimilarity()<\/b>.<\/p>\n<p>Obal k p\u00edsni, pro n\u00e1sledn\u00e9 z\u00edsk\u00e1n\u00ed, se tak\u00e9 p\u0159ipoj\u00ed p\u0159es tagy (<b>APIC<\/b>). V utilit\u00e1ch (utils) jsou v\u0161echny pot\u0159ebn\u00e9 metody pro z\u00edsk\u00e1n\u00ed a zpracov\u00e1n\u00ed tag\u016f.<\/p>\n<p>P\u0159\u00edklad pr\u00e1ce s \u00falo\u017ei\u0161t\u011bm p\u0159es klienta lze vid\u011bt v <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/ortexx\/museria\">readme<\/a><\/noindex>.<\/p>\n<blockquote><p>V\u0161echny v\u00fd\u0161e uveden\u00e9 vrstvy jsou samostatn\u00e9 a mohou b\u00fdt pou\u017eity samostatn\u011b jako ni\u017e\u0161\u00ed vrstvy pro jin\u00e9 projekty. Nap\u0159\u00edklad ji\u017e te\u010f existuje my\u0161lenka vytvo\u0159it vrstvu pro ukl\u00e1d\u00e1n\u00ed knih.<\/p><\/blockquote>\n<p>\n<b>museria-global<\/b> \u2014 to je ji\u017e nakonfigurovan\u00e9 git-repozit\u00e1\u0159 pro spu\u0161t\u011bn\u00ed vlastn\u00edho uzlu v glob\u00e1ln\u00ed s\u00edti hudby. Klonujete, <b>npm i &amp;&amp; npm<\/b> start a v podstat\u011b je to v\u0161echno. M\u016f\u017eete nastavit podrobn\u011bji, spustit v dockeru a atd. Podrobn\u00e9 informace jsou na <noindex><a rel=\"nofollow\" href=\"https:\/\/github.com\/ortexx\/museria-global#museria-global-storage-alpha-\">githubu<\/a><\/noindex>.<\/p>\n<p>Kdy\u017e je repozit\u00e1\u0159 aktualizov\u00e1n, mus\u00edte tak\u00e9 aktualizovat sv\u016fj uzel. Pokud se m\u011bn\u00ed hlavn\u00ed nebo vedlej\u0161\u00ed \u010d\u00edslo verze, je tento krok povinn\u00fd, jinak budou star\u00e9 uzly ignorov\u00e1ny s\u00edt\u00ed.<\/p>\n<p>S p\u00edsn\u011bmi lze pracovat ru\u010dn\u011b a programov\u011b. Ka\u017ed\u00fd uzel spou\u0161t\u00ed server pro r\u016fzn\u00e9 \u00fakoly. Nap\u0159\u00edklad p\u0159i n\u00e1v\u0161t\u011bv\u011b v\u00fdchoz\u00edho koncov\u00e9ho bodu z\u00edsk\u00e1te rozhran\u00ed pro pr\u00e1ci s hudbou. M\u016f\u017eete nap\u0159\u00edklad nav\u0161t\u00edvit <noindex><a rel=\"nofollow\" href=\"http:\/\/storage.museria.com\">ko\u0159enov\u00fd uzel<\/a><\/noindex> (odkaz m\u016f\u017ee b\u00fdt pozd\u011bji neaktu\u00e1ln\u00ed, vstupn\u00ed uzly lze tak\u00e9 z\u00edskat v <noindex><a rel=\"nofollow\" href=\"https:\/\/t.me\/museria\">Telegramu<\/a><\/noindex>, nebo sledovat aktualizace na GitHubu.<\/p>\n<p>Takto m\u016f\u017eete vyhled\u00e1vat a stahovat p\u00edsn\u011b do \u00falo\u017ei\u0161t\u011b. Stahov\u00e1n\u00ed p\u00edsn\u00ed m\u016f\u017ee prob\u00edhat ve dvou re\u017eimech: b\u011b\u017en\u00e9m a moderovan\u00e9m. Druh\u00fd re\u017eim znamen\u00e1, \u017ee pr\u00e1ci prov\u00e1d\u00ed \u010dlov\u011bk, nikoli program. A pokud za\u0161krtnete tuto volbu p\u0159i p\u0159id\u00e1v\u00e1n\u00ed, bude nutn\u00e9 vy\u0159e\u0161it CAPTCHA. P\u00edsn\u011b lze p\u0159id\u00e1vat s prioritami -1, 0 nebo 1. Prioritu 1 lze nastavit pouze v moderovan\u00e9m re\u017eimu. Priority jsou d\u016fle\u017eit\u00e9 pro to, aby \u00falo\u017ei\u0161t\u011b efektivn\u011bji rozhodovalo, co d\u011blat, kdy\u017e se sna\u017e\u00edte nahradit ji\u017e existuj\u00edc\u00ed p\u00edse\u0148 novou. \u010c\u00edm vy\u0161\u0161\u00ed priorita, t\u00edm v\u011bt\u0161\u00ed \u0161ance, \u017ee p\u0159ep\u00ed\u0161ete existuj\u00edc\u00ed soubor. To pom\u00e1h\u00e1 bojovat proti spamu a zvy\u0161uje kvalitu nahr\u00e1van\u00fdch p\u00edsn\u00ed. <\/p>\n<p>Pokud za\u010dnete p\u0159id\u00e1vat p\u00edsn\u011b do \u00falo\u017ei\u0161t\u011b, sna\u017ete se p\u0159ipojit i obr\u00e1zky (obaly), i kdy\u017e toto pole nen\u00ed povinn\u00e9. V 99 % p\u0159\u00edpad\u016f jsou prvn\u00ed obr\u00e1zky na Googlu podle n\u00e1zv\u016f p\u00edsn\u00ed obaly alb.<\/p>\n<p>Jak technicky prob\u00edh\u00e1 p\u0159id\u00e1v\u00e1n\u00ed soubor\u016f, stru\u010dn\u011b \u0159e\u010deno:<\/p>\n<ul>\n<li>Klient z\u00edsk\u00e1 adresu voln\u00e9ho uzlu, kter\u00fd se na n\u011bjakou dobu stane koordin\u00e1torem.<\/li>\n<li>Spust\u00ed se funkce p\u0159id\u00e1n\u00ed p\u00edsn\u011b (\u010dlov\u011bkem nebo k\u00f3dem), dojde k po\u017eadavku na p\u0159id\u00e1n\u00ed na koncov\u00fd bod koordin\u00e1tora.<\/li>\n<li>Koordin\u00e1tor vypo\u010d\u00edt\u00e1, kolik duplicit je pot\u0159eba uchovat (konfigurovateln\u00fd parametr).<\/li>\n<li>Hledaj\u00ed se nejvhodn\u011bj\u0161\u00ed uzly pro ulo\u017een\u00ed.<\/li>\n<li>Soubor se p\u0159\u00edmo odes\u00edl\u00e1 na tyto uzly. <\/li>\n<\/ul>\n<p>\nJak technicky prob\u00edh\u00e1 z\u00edsk\u00e1v\u00e1n\u00ed soubor\u016f:<\/p>\n<ul>\n<li>Klient z\u00edsk\u00e1 adresu voln\u00e9ho uzlu, kter\u00fd se na n\u011bjakou dobu stane koordin\u00e1torem.<\/li>\n<li>Spust\u00ed se funkce z\u00edsk\u00e1n\u00ed p\u00edsn\u011b (\u010dlov\u011bkem nebo k\u00f3dem), dojde k po\u017eadavku na z\u00edsk\u00e1n\u00ed na koncov\u00fd bod koordin\u00e1tora.<\/li>\n<li>Koordin\u00e1tor kontroluje p\u0159\u00edtomnost odkazu v mezipam\u011bti. Pokud takov\u00fd existuje a je funk\u010dn\u00ed, okam\u017eit\u011b se vr\u00e1t\u00ed klientovi, jinak se dotazuj\u00ed uzly na p\u0159\u00edtomnost.<\/li>\n<li>Prob\u00edh\u00e1 stahov\u00e1n\u00ed souboru podle odkazu, pokud byl nalezen. <\/li>\n<\/ul>\n<p><\/p>\n<h3>Alternativy pro hudebn\u00ed tv\u016frce<\/h3>\n<p>\nV\u017edy m\u011b zaj\u00edmal ot\u00e1zka, jak lze objektivn\u011b ocenit hodnotu mnoha tv\u016fr\u010d\u00edch d\u011bl? Pro\u010d nap\u0159\u00edklad \u010dlov\u011bk stanov\u00ed cenu sv\u00e9ho hudebn\u00edho alba na 10 $? Nebo na 20 $ \u010di 100 $? Kde je algoritmus? Kdy\u017e mluv\u00edme o n\u011bjak\u00e9m fyzick\u00e9m produktu nebo dokonce o mnoha typech slu\u017eeb, m\u016f\u017eeme alespo\u0148 spo\u010d\u00edtat n\u00e1klady a vych\u00e1zet z toho. <\/p>\n<p>Dob\u0159e, dejme tomu, \u017ee jsme stanovili cenu na 10 $. Je to opravdu efektivn\u00ed? P\u0159edstavme si, \u017ee jsem poslouchal album nebo skladbu a cht\u011bl bych pod\u011bkovat. Ale podle m\u00fdch pocit\u016f a vlastn\u00edch mo\u017enost\u00ed je 3 $ m\u00fdm stropem. A co te\u010f? Pravd\u011bpodobn\u011b prost\u011b nic neud\u011bl\u00e1m, stejn\u011b jako v\u011bt\u0161ina lid\u00ed. <\/p>\n<p>Stanoven\u00edm n\u011bjak\u00e9 pevn\u00e9 ceny za tv\u016fr\u010d\u00ed pr\u00e1ci se jednodu\u0161e omezuje\u0161 a ned\u00e1v\u00e1\u0161 v\u011bt\u0161\u00ed \u010d\u00e1sti lid\u00ed mo\u017enost poslat ti m\u00e9n\u011b pen\u011bz, kter\u00e9 se v sou\u010dtu mohou uk\u00e1zat jako v\u00fdrazn\u011bj\u0161\u00ed, ne\u017e kdy\u017e koup\u00ed podle ceny, kterou jsi stanovil. M\u011blo by se mi zd\u00e1t, \u017ee um\u011bn\u00ed je p\u0159esn\u011b ta oblast, kde by m\u011bly prim\u00e1rn\u011b fungovat dary. K tomu je t\u0159eba:<\/p>\n<ul>\n<li>Nau\u010dit lidi d\u00e1vat d\u00edky t\u00edmto zp\u016fsobem. Tv\u016frci by to m\u011bli jasn\u011b ukazovat, \u017ee by r\u00e1di dost\u00e1vali dary, p\u0159id\u00e1vat odkazy na r\u016fzn\u00e9 platebn\u00ed metody atd.<\/li>\n<li>Pot\u0159ebujeme v\u00edce mechanism\u016f k usnadn\u011bn\u00ed a pos\u00edlen\u00ed t\u011bchto proces\u016f. Nap\u0159\u00edklad vytvo\u0159it n\u011bjak\u00fd glob\u00e1ln\u00ed web, kam lze pos\u00edlat dary za um\u011bn\u00ed pomoc\u00ed autorsk\u00fdch odkaz\u016f.\n<p>P\u0159edstavme si, \u017ee odkaz vypad\u00e1 asi takto: <\/p>\n<p><b><code>http:\/\/someartistsdonationsite.site\/category\/artist?external-info<\/code><\/b><\/p>\n<p>Pokud to z\u00fa\u017e\u00edme na hudebn\u00edky, pak:<\/p>\n<p><b><code>http:\/\/someartistsdonationsite.com\/music\/miyagi?song=blabla<\/code><\/b><\/p>\n<p>Interpret se mus\u00ed ov\u011b\u0159it a p\u0159ipojit k sv\u00e9mu p\u0159ezd\u00edvce.<\/p>\n<p>Do klienta museria p\u0159id\u00e1me funkci generov\u00e1n\u00ed podobn\u00e9ho odkazu, a v\u0161echny projekty vyu\u017e\u00edvaj\u00edc\u00ed \u00falo\u017ei\u0161t\u011b mohou um\u00edstit na sv\u00e9 weby\/aplikace tla\u010d\u00edtka pro dary s t\u011bmito odkazy vedle p\u00edsn\u00ed. U\u017eivatel\u00e9 maj\u00ed mo\u017enost velmi rychle a snadno ud\u011blat dar. Tento p\u0159\u00edstup samoz\u0159ejm\u011b lze pou\u017e\u00edt v jak\u00e9mkoli projektu a kategorii um\u011bn\u00ed, nejen prost\u0159ednictv\u00edm \u00falo\u017ei\u0161t\u011b.<\/li>\n<\/ul>\n<p><\/p>\n<h3>Pro\u010d, pr\u00e1v\u011b tob\u011b, hudebn\u00ed \u00falo\u017ei\u0161t\u011b, a jak se na tom m\u016f\u017ee\u0161 pod\u00edlet?<\/h3>\n<p><\/p>\n<ul>\n<li>Pokud pracuje\u0161 na projektu spojen\u00e9m s hudbou nebo pl\u00e1nuje\u0161 takov\u00fd vytvo\u0159it, je to p\u0159esn\u011b to, k \u010demu to cel\u00e9 bylo zam\u00fd\u0161leno. M\u016f\u017ee\u0161 vyu\u017e\u00edt museria k uchov\u00e1v\u00e1n\u00ed a z\u00edsk\u00e1v\u00e1n\u00ed p\u00edsn\u00ed, co\u017e zvy\u0161uje tok p\u00edsn\u00ed na internetu. Pokud m\u00e1\u0161 nav\u00edc mo\u017enost vytvo\u0159it a udr\u017eovat alespo\u0148 jeden sv\u016fj vlastn\u00ed uzel, bude to nejlep\u0161\u00ed p\u0159\u00edsp\u011bvek k rozvoji s\u00edt\u011b.<\/li>\n<li>Mo\u017en\u00e1 jsi p\u0159ipraven vz\u00edt na sebe jinou roli: pomoci s k\u00f3dem, nebo vypl\u0148ovat a moderovat datab\u00e1zi, \u0161\u00ed\u0159it informace o projektu mezi sv\u00fdmi zn\u00e1m\u00fdmi atd.<\/li>\n<li>Mo\u017en\u00e1 se ti my\u0161lenka zal\u00edbila a jsi ochoten pomoci materi\u00e1ln\u011b, aby to v\u0161echno \u017eilo a rozv\u00edjelo se. \u010c\u00edm v\u00edce uzl\u016f, t\u00edm v\u00edce p\u00edsn\u00ed.<\/li>\n<li>Nebo mo\u017en\u00e1 v ur\u010dit\u00e9m okam\u017eiku pot\u0159ebuje\u0161 naj\u00edt a st\u00e1hnout p\u00edse\u0148. M\u016f\u017ee\u0161 to ud\u011blat velmi jednodu\u0161e, nap\u0159\u00edklad p\u0159es <noindex><a rel=\"nofollow\" href=\"https:\/\/t.me\/MuseriaBot\">telegramov\u00e9ho bota<\/a><\/noindex>.<\/li>\n<\/ul>\n<p>\nProjekt je nyn\u00ed ve sv\u00e9m nejran\u011bj\u0161\u00edm st\u00e1diu. Byla spu\u0161t\u011bna testovac\u00ed s\u00ed\u0165, uzly se \u010dasto restartuj\u00ed, vy\u017eaduj\u00ed aktualizace atd. V p\u0159\u00edpad\u011b, \u017ee b\u011bhem hodnot\u00edc\u00edho obdob\u00ed nebudou \u017e\u00e1dn\u00e9 z\u00e1va\u017en\u00e9 probl\u00e9my, tato s\u00ed\u0165 se transformuje na hlavn\u00ed.<\/p>\n<p>Informace o uzlu zven\u010d\u00ed: po\u010det p\u00edsn\u00ed, voln\u00e9 m\u00edsto atd., m\u016f\u017ee\u0161 naj\u00edt na odkazu ve tvaru <b><code>http:\/\/node-address\/status<\/code><\/b> nebo <b><code>http:\/\/node-address\/status?pretty<\/code><\/b><\/p>\n<p>M\u00e9 kontakty:<\/p>\n<ul>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/t.me\/ortex\">@ortex<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"mailto:mywebstreet@gmail.com\">mywebstreet@gmail.com<\/a><\/noindex>\n<\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/t.me\/museria\">Skupina na Telegramu v angli\u010dtin\u011b.<\/a><\/noindex><\/li>\n<li><noindex><a rel=\"nofollow\" href=\"https:\/\/museria.com\/\">A tak\u00e9 web, d\u00edky kter\u00e9mu se cel\u00e1 tato my\u0161lenka zrodila.<\/a><\/noindex><\/li>\n<\/ul>\n<p>Zdroj: <a content=\"nofollow\" rel=\"nofollow\" href=\"https:\/\/habr.com\/ru\/post\/495058\/\">habr.com<\/a> <\/p>","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"excerpt":{"rendered":"<p>\u0421\u043e\u0431\u0440\u0430\u043b\u0441\u044f \u044f \u043e\u0434\u043d\u0430\u0436\u0434\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u0447\u0442\u043e\u0431\u044b \u043e\u0442\u0431\u0438\u0440\u0430\u0442\u044c \u043c\u0443\u0437\u044b\u043a\u0443 \u0434\u043b\u044f \u0441\u0435\u0431\u044f \u0438 \u0441\u043b\u0443\u0448\u0430\u0442\u044c \u0434\u043e\u043c\u0430\/\u043d\u0430 \u0443\u043b\u0438\u0446\u0435\/\u0442\u0440\u0435\u043d\u0438\u0440\u043e\u0432\u043a\u0430\u0445 \u0438.\u0442.\u0434. \u0418 \u0447\u0442\u043e\u0431\u044b \u0432\u0441\u0435 \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u043b\u043e \u0432 \u043f\u043e\u0442\u043e\u043a\u0435, \u0441 \u043c\u0438\u043d\u0438\u043c\u0430\u043b\u044c\u043d\u044b\u043c \u043c\u043e\u0438\u043c \u0443\u0447\u0430\u0441\u0442\u0438\u0435\u043c. \u041f\u0440\u0438\u0434\u0443\u043c\u0430\u043b \u0430\u0440\u0445\u0438\u0442\u0435\u043a\u0442\u0443\u0440\u0443, \u043d\u0430\u0431\u0440\u043e\u0441\u0430\u043b \u043f\u0440\u043e\u0442\u043e\u0442\u0438\u043f \u0438 \u0432 \u0438\u0442\u043e\u0433\u0435 \u0441\u0442\u043e\u043b\u043a\u043d\u0443\u043b\u0441\u044f \u0441 \u043e\u0434\u043d\u043e\u0439 \u201c\u043d\u0435\u0431\u043e\u043b\u044c\u0448\u043e\u0439 \u043f\u0440\u043e\u0431\u043b\u0435\u043c\u043e\u0439\u201d. \u0410 \u043d\u0435\u043f\u043e\u043d\u044f\u0442\u043d\u043e \u043e\u0442\u043a\u0443\u0434\u0430 \u0431\u0440\u0430\u0442\u044c \u0441\u0430\u043c\u0438 \u0444\u0430\u0439\u043b\u044b \u043f\u0435\u0441\u0435\u043d. \u041a \u044d\u0442\u043e\u043c\u0443 \u043c\u043e\u043c\u0435\u043d\u0442\u0443 \u0432\u043a\u043e\u043d\u0442\u0430\u043a\u0442\u0435 \u0443\u0436\u0435 \u0437\u0430\u043a\u0440\u044b\u043b\u0430 api, \u043d\u0430 \u043a\u0440\u0443\u043f\u043d\u044b\u0445 \u043c\u0443\u0437\u044b\u043a\u0430\u043b\u044c\u043d\u044b\u0445 [&hellip;]<\/p>\n","protected":false,"gt_translate_keys":[{"key":"rendered","format":"html"}]},"author":1,"featured_media":80223,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[688],"tags":[],"class_list":["post-80222","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-administrirovanie"],"aioseo_notices":[],"aioseo_head":"\n\t\t<!-- All in One SEO 5.0.3 - aioseo.com -->\n\t<meta name=\"description\" content=\"\u0421\u043e\u0431\u0440\u0430\u043b\u0441\u044f \u044f \u043e\u0434\u043d\u0430\u0436\u0434\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u0447\u0442\u043e\u0431\u044b.\" \/>\n\t<meta name=\"robots\" content=\"max-image-preview:large\" \/>\n\t<meta name=\"author\" content=\"Yuri Gagarin\"\/>\n\t<link rel=\"canonical\" href=\"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/museria-deczentralizovannoe-hranilishhe-muzyki\" \/>\n\t\t<meta name=\"generator\" content=\"All in One SEO (AIOSEO) 5.0.3\" \/>\n\t\t<meta property=\"og:locale\" content=\"cs_CZ\" \/>\n\t\t<meta property=\"og:site_name\" content=\"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b\" \/>\n\t\t<meta property=\"og:type\" content=\"article\" \/>\n\t\t<meta property=\"og:title\" content=\"\ud83e\udd47Museria \u2014 \u0434\u0435\u0446\u0435\u043d\u0442\u0440\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u043c\u0443\u0437\u044b\u043a\u0438 | ProHoster\" \/>\n\t\t<meta property=\"og:description\" content=\"\u0421\u043e\u0431\u0440\u0430\u043b\u0441\u044f \u044f \u043e\u0434\u043d\u0430\u0436\u0434\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u0447\u0442\u043e\u0431\u044b.\" \/>\n\t\t<meta property=\"og:url\" content=\"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/museria-deczentralizovannoe-hranilishhe-muzyki\" \/>\n\t\t<meta property=\"og:image\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:secure_url\" content=\"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg\" \/>\n\t\t<meta property=\"og:image:width\" content=\"350\" \/>\n\t\t<meta property=\"og:image:height\" content=\"350\" \/>\n\t\t<meta property=\"article:published_time\" content=\"2020-05-04T11:42:18+00:00\" \/>\n\t\t<meta property=\"article:modified_time\" content=\"2020-05-04T11:42:18+00:00\" \/>\n\t\t<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<meta property=\"article:author\" content=\"https:\/\/www.facebook.com\/prohoster\" \/>\n\t\t<!-- All in One SEO -->\n\n","aioseo_head_json":{"title":"\ud83e\udd47Museria \u2014 decentralizovan\u00e9 \u00falo\u017ei\u0161t\u011b hudby | ProHoster","description":"Jednou jsem se se\u0161el napsat aplikaci, abych.","canonical_url":"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/museria-deczentralizovannoe-hranilishhe-muzyki","robots":"max-image-preview:large","keywords":"","webmasterTools":{"miscellaneous":""},"schema":null,"og:locale":"cs_CZ","og:site_name":"ProHoster | \u041a\u0443\u043f\u0438\u0442\u044c \u043d\u0430\u0434\u0435\u0436\u043d\u044b\u0439 \u0445\u043e\u0441\u0442\u0438\u043d\u0433 \u0434\u043b\u044f \u0441\u0430\u0439\u0442\u043e\u0432 \u0441 \u0437\u0430\u0449\u0438\u0442\u043e\u0439 \u043e\u0442 DDoS, VPS VDS \u0441\u0435\u0440\u0432\u0435\u0440\u044b","og:type":"article","og:title":"\ud83e\udd47Museria \u2014 \u0434\u0435\u0446\u0435\u043d\u0442\u0440\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043d\u043d\u043e\u0435 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u043c\u0443\u0437\u044b\u043a\u0438 | ProHoster","og:description":"\u0421\u043e\u0431\u0440\u0430\u043b\u0441\u044f \u044f \u043e\u0434\u043d\u0430\u0436\u0434\u044b \u043d\u0430\u043f\u0438\u0441\u0430\u0442\u044c \u043f\u0440\u0438\u043b\u043e\u0436\u0435\u043d\u0438\u0435, \u0447\u0442\u043e\u0431\u044b.","og:url":"https:\/\/prohoster.info\/cs\/blog\/administrirovanie\/museria-deczentralizovannoe-hranilishhe-muzyki","og:image":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:secure_url":"https:\/\/prohoster.info\/wp-content\/uploads\/2021\/11\/logo-350.jpg","og:image:width":350,"og:image:height":350,"article:published_time":"2020-05-04T11:42:18+00:00","article:modified_time":"2020-05-04T11:42:18+00:00","article:publisher":"https:\/\/www.facebook.com\/prohoster","article:author":"https:\/\/www.facebook.com\/prohoster"},"aioseo_meta_data":{"post_id":"80222","title":null,"description":null,"keywords":null,"keyphrases":null,"primary_term":null,"canonical_url":null,"og_title":null,"og_description":null,"og_object_type":"default","og_image_type":"default","og_image_url":null,"og_image_width":null,"og_image_height":null,"og_image_custom_url":null,"og_image_custom_fields":null,"og_video":null,"og_custom_url":null,"og_article_section":null,"og_article_tags":null,"twitter_use_og":false,"twitter_card":"default","twitter_image_type":"default","twitter_image_url":null,"twitter_image_custom_url":null,"twitter_image_custom_fields":null,"twitter_title":null,"twitter_description":null,"schema":{"blockGraphs":[],"customGraphs":[],"default":{"data":{"Article":[],"Course":[],"Dataset":[],"FAQPage":[],"Movie":[],"Person":[],"Product":[],"ProductReview":[],"Car":[],"Recipe":[],"Service":[],"SoftwareApplication":[],"WebPage":[]},"graphName":"","isEnabled":true},"graphs":[]},"schema_type":null,"schema_type_options":null,"pillar_content":false,"robots_default":true,"robots_noindex":false,"robots_noarchive":false,"robots_nosnippet":false,"robots_nofollow":false,"robots_noimageindex":false,"robots_noodp":false,"robots_notranslate":false,"robots_max_snippet":null,"robots_max_videopreview":null,"robots_max_imagepreview":"large","priority":null,"frequency":null,"local_seo":null,"seo_analyzer_scan_date":null,"breadcrumb_settings":null,"limit_modified_date":false,"reviewed_by":null,"ai":null,"created":"2021-02-28 16:22:48","updated":"2022-10-08 10:56:19","focus_keyword":null,"additional_keywords":null,"truseo_locale":null},"gt_translate_keys":[{"key":"link","format":"url"}],"_links":{"self":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts\/80222","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/comments?post=80222"}],"version-history":[{"count":0,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/posts\/80222\/revisions"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media\/80223"}],"wp:attachment":[{"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/media?parent=80222"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/categories?post=80222"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/prohoster.info\/cs\/wp-json\/wp\/v2\/tags?post=80222"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}