From d5b5b9cb4e041fc39dfaf749dadbfe8e25516371 Mon Sep 17 00:00:00 2001 From: patrickkfkan Date: Fri, 13 Dec 2024 17:53:17 +0800 Subject: [PATCH] Update Bandcamp Discover plugin v1.2.0 --- bandcamp/.eslintignore | 5 - bandcamp/.eslintrc.yml | 84 - bandcamp/README.md | 7 + .../bandcamp-fetch-2.0.0-node14-compat.tgz | Bin 0 -> 134783 bytes bandcamp/dist/i18n/strings_en.json | 6 +- bandcamp/dist/index.d.ts | 4 +- bandcamp/dist/index.d.ts.map | 2 +- bandcamp/dist/index.js | 2 +- bandcamp/dist/index.js.map | 2 +- bandcamp/dist/lib/BandcampContext.d.ts | 2 +- bandcamp/dist/lib/BandcampContext.d.ts.map | 2 +- bandcamp/dist/lib/BandcampContext.js | 5 +- bandcamp/dist/lib/BandcampContext.js.map | 2 +- .../dist/lib/controller/browse/index.d.ts | 5 +- .../dist/lib/controller/browse/index.d.ts.map | 2 +- bandcamp/dist/lib/controller/browse/index.js | 7 +- .../dist/lib/controller/browse/index.js.map | 2 +- .../view-handlers/AlbumViewHandler.d.ts | 5 +- .../view-handlers/AlbumViewHandler.d.ts.map | 2 +- .../browse/view-handlers/AlbumViewHandler.js | 2 +- .../view-handlers/AlbumViewHandler.js.map | 2 +- .../view-handlers/ArticleViewHandler.d.ts | 6 +- .../view-handlers/ArticleViewHandler.d.ts.map | 2 +- .../view-handlers/ArticleViewHandler.js | 26 +- .../view-handlers/ArticleViewHandler.js.map | 2 +- .../browse/view-handlers/BandViewHandler.d.ts | 6 +- .../view-handlers/BandViewHandler.d.ts.map | 2 +- .../browse/view-handlers/BandViewHandler.js | 2 +- .../view-handlers/BandViewHandler.js.map | 2 +- .../browse/view-handlers/BaseViewHandler.d.ts | 42 +- .../view-handlers/BaseViewHandler.d.ts.map | 2 +- .../browse/view-handlers/BaseViewHandler.js | 34 +- .../view-handlers/BaseViewHandler.js.map | 2 +- .../view-handlers/DiscoverViewHandler.d.ts | 23 +- .../DiscoverViewHandler.d.ts.map | 2 +- .../view-handlers/DiscoverViewHandler.js | 245 +- .../view-handlers/DiscoverViewHandler.js.map | 2 +- .../view-handlers/ExplodableViewHandler.d.ts | 4 +- .../ExplodableViewHandler.d.ts.map | 2 +- .../view-handlers/ExplodableViewHandler.js | 8 +- .../ExplodableViewHandler.js.map | 2 +- .../browse/view-handlers/FanViewHandler.d.ts | 4 +- .../view-handlers/FanViewHandler.d.ts.map | 2 +- .../browse/view-handlers/FanViewHandler.js | 2 +- .../view-handlers/FanViewHandler.js.map | 2 +- .../browse/view-handlers/RootViewHandler.d.ts | 4 +- .../view-handlers/RootViewHandler.d.ts.map | 2 +- .../browse/view-handlers/RootViewHandler.js | 2 +- .../view-handlers/RootViewHandler.js.map | 2 +- .../view-handlers/SearchViewHandler.d.ts | 4 +- .../view-handlers/SearchViewHandler.d.ts.map | 2 +- .../view-handlers/SearchViewHandler.js.map | 2 +- .../browse/view-handlers/ShowViewHandler.d.ts | 6 +- .../view-handlers/ShowViewHandler.d.ts.map | 2 +- .../browse/view-handlers/ShowViewHandler.js | 2 +- .../view-handlers/ShowViewHandler.js.map | 2 +- .../browse/view-handlers/TagViewHandler.d.ts | 18 +- .../view-handlers/TagViewHandler.d.ts.map | 2 +- .../browse/view-handlers/TagViewHandler.js | 403 +- .../view-handlers/TagViewHandler.js.map | 2 +- .../view-handlers/TrackViewHandler.d.ts | 4 +- .../view-handlers/TrackViewHandler.d.ts.map | 2 +- .../browse/view-handlers/TrackViewHandler.js | 2 +- .../view-handlers/TrackViewHandler.js.map | 2 +- .../browse/view-handlers/ViewHandler.d.ts | 2 +- .../browse/view-handlers/ViewHandler.d.ts.map | 2 +- .../browse/view-handlers/ViewHandler.js.map | 2 +- .../view-handlers/ViewHandlerFactory.d.ts | 4 +- .../view-handlers/ViewHandlerFactory.d.ts.map | 2 +- .../view-handlers/ViewHandlerFactory.js.map | 2 +- .../browse/view-handlers/ViewHelper.d.ts | 4 +- .../browse/view-handlers/ViewHelper.d.ts.map | 2 +- .../browse/view-handlers/ViewHelper.js | 2 +- .../browse/view-handlers/ViewHelper.js.map | 2 +- .../renderers/AlbumRenderer.d.ts | 4 +- .../renderers/AlbumRenderer.d.ts.map | 2 +- .../renderers/AlbumRenderer.js.map | 2 +- .../renderers/ArticleRenderer.d.ts | 9 +- .../renderers/ArticleRenderer.d.ts.map | 2 +- .../renderers/ArticleRenderer.js.map | 2 +- .../view-handlers/renderers/BandRenderer.d.ts | 8 +- .../renderers/BandRenderer.d.ts.map | 2 +- .../renderers/BandRenderer.js.map | 2 +- .../view-handlers/renderers/BaseRenderer.d.ts | 2 +- .../renderers/BaseRenderer.d.ts.map | 2 +- .../view-handlers/renderers/BaseRenderer.js | 27 +- .../renderers/BaseRenderer.js.map | 2 +- .../renderers/SearchResultParser.d.ts | 10 +- .../renderers/SearchResultParser.d.ts.map | 2 +- .../renderers/SearchResultParser.js.map | 2 +- .../view-handlers/renderers/ShowRenderer.d.ts | 4 +- .../renderers/ShowRenderer.d.ts.map | 2 +- .../renderers/ShowRenderer.js.map | 2 +- .../view-handlers/renderers/TagRenderer.d.ts | 10 +- .../renderers/TagRenderer.d.ts.map | 2 +- .../view-handlers/renderers/TagRenderer.js | 45 +- .../renderers/TagRenderer.js.map | 2 +- .../renderers/TrackRenderer.d.ts | 4 +- .../renderers/TrackRenderer.d.ts.map | 2 +- .../renderers/TrackRenderer.js.map | 2 +- .../browse/view-handlers/renderers/index.d.ts | 2 +- .../view-handlers/renderers/index.d.ts.map | 2 +- .../browse/view-handlers/renderers/index.js | 4 +- .../view-handlers/renderers/index.js.map | 2 +- .../lib/controller/play/PlayController.d.ts | 4 +- .../controller/play/PlayController.d.ts.map | 2 +- .../lib/controller/play/PlayController.js | 49 +- .../lib/controller/play/PlayController.js.map | 2 +- .../controller/search/SearchController.d.ts | 2 +- .../search/SearchController.d.ts.map | 2 +- .../controller/search/SearchController.js.map | 2 +- bandcamp/dist/lib/entities/AlbumEntity.d.ts | 4 +- .../dist/lib/entities/AlbumEntity.d.ts.map | 2 +- bandcamp/dist/lib/entities/AlbumEntity.js.map | 2 +- bandcamp/dist/lib/entities/ArticleEntity.d.ts | 4 +- .../dist/lib/entities/ArticleEntity.d.ts.map | 2 +- .../dist/lib/entities/ArticleEntity.js.map | 2 +- bandcamp/dist/lib/entities/ArtistEntity.d.ts | 4 +- .../dist/lib/entities/ArtistEntity.d.ts.map | 2 +- .../dist/lib/entities/ArtistEntity.js.map | 2 +- bandcamp/dist/lib/entities/LabelEntity.d.ts | 2 +- .../dist/lib/entities/LabelEntity.d.ts.map | 2 +- bandcamp/dist/lib/entities/LabelEntity.js.map | 2 +- bandcamp/dist/lib/entities/ShowEntity.d.ts | 2 +- .../dist/lib/entities/ShowEntity.d.ts.map | 2 +- bandcamp/dist/lib/entities/ShowEntity.js.map | 2 +- bandcamp/dist/lib/entities/TagEntity.d.ts | 2 +- bandcamp/dist/lib/entities/TagEntity.d.ts.map | 2 +- bandcamp/dist/lib/entities/TagEntity.js.map | 2 +- bandcamp/dist/lib/entities/TrackEntity.d.ts | 5 +- .../dist/lib/entities/TrackEntity.d.ts.map | 2 +- bandcamp/dist/lib/entities/TrackEntity.js.map | 2 +- bandcamp/dist/lib/model/AlbumModel.d.ts | 2 +- bandcamp/dist/lib/model/AlbumModel.d.ts.map | 2 +- bandcamp/dist/lib/model/AlbumModel.js | 2 +- bandcamp/dist/lib/model/AlbumModel.js.map | 2 +- bandcamp/dist/lib/model/ArticleModel.d.ts | 2 +- bandcamp/dist/lib/model/ArticleModel.d.ts.map | 2 +- bandcamp/dist/lib/model/ArticleModel.js | 2 +- bandcamp/dist/lib/model/ArticleModel.js.map | 2 +- bandcamp/dist/lib/model/BandModel.d.ts | 8 +- bandcamp/dist/lib/model/BandModel.d.ts.map | 2 +- bandcamp/dist/lib/model/BandModel.js | 2 +- bandcamp/dist/lib/model/BandModel.js.map | 2 +- bandcamp/dist/lib/model/BaseModel.js | 2 +- bandcamp/dist/lib/model/BaseModel.js.map | 2 +- bandcamp/dist/lib/model/DiscoverModel.d.ts | 6 +- .../dist/lib/model/DiscoverModel.d.ts.map | 2 +- bandcamp/dist/lib/model/DiscoverModel.js | 43 +- bandcamp/dist/lib/model/DiscoverModel.js.map | 2 +- bandcamp/dist/lib/model/FanModel.d.ts | 12 +- bandcamp/dist/lib/model/FanModel.d.ts.map | 2 +- bandcamp/dist/lib/model/FanModel.js | 2 +- bandcamp/dist/lib/model/FanModel.js.map | 2 +- bandcamp/dist/lib/model/SearchModel.d.ts | 10 +- bandcamp/dist/lib/model/SearchModel.d.ts.map | 2 +- bandcamp/dist/lib/model/SearchModel.js | 4 +- bandcamp/dist/lib/model/SearchModel.js.map | 2 +- bandcamp/dist/lib/model/ShowModel.js | 2 +- bandcamp/dist/lib/model/ShowModel.js.map | 2 +- bandcamp/dist/lib/model/TagModel.d.ts | 20 +- bandcamp/dist/lib/model/TagModel.d.ts.map | 2 +- bandcamp/dist/lib/model/TagModel.js | 75 +- bandcamp/dist/lib/model/TagModel.js.map | 2 +- bandcamp/dist/lib/model/TrackModel.d.ts | 2 +- bandcamp/dist/lib/model/TrackModel.d.ts.map | 2 +- bandcamp/dist/lib/model/TrackModel.js | 2 +- bandcamp/dist/lib/model/TrackModel.js.map | 2 +- bandcamp/dist/lib/model/index.js | 4 +- bandcamp/dist/lib/model/index.js.map | 2 +- bandcamp/dist/lib/util/Cache.d.ts.map | 2 +- bandcamp/dist/lib/util/Cache.js | 4 +- bandcamp/dist/lib/util/Cache.js.map | 2 +- bandcamp/dist/lib/util/EntityConverter.d.ts | 18 +- .../dist/lib/util/EntityConverter.d.ts.map | 2 +- bandcamp/dist/lib/util/EntityConverter.js | 11 +- bandcamp/dist/lib/util/EntityConverter.js.map | 2 +- bandcamp/dist/lib/util/UIHelper.js | 2 +- bandcamp/dist/lib/util/UIHelper.js.map | 2 +- bandcamp/dist/lib/util/index.js | 11 +- bandcamp/dist/lib/util/index.js.map | 2 +- bandcamp/dist/tsconfig.tsbuildinfo | 1 + bandcamp/package-lock.json | 3994 +---------------- bandcamp/package.json | 20 +- bandcamp/src/i18n/strings_en.json | 6 +- bandcamp/src/index.ts | 18 +- bandcamp/src/lib/BandcampContext.ts | 7 +- bandcamp/src/lib/controller/browse/index.ts | 13 +- .../browse/view-handlers/AlbumViewHandler.ts | 11 +- .../view-handlers/ArticleViewHandler.ts | 23 +- .../browse/view-handlers/BandViewHandler.ts | 12 +- .../browse/view-handlers/BaseViewHandler.ts | 53 +- .../view-handlers/DiscoverViewHandler.ts | 258 +- .../view-handlers/ExplodableViewHandler.ts | 14 +- .../browse/view-handlers/FanViewHandler.ts | 12 +- .../browse/view-handlers/RootViewHandler.ts | 4 +- .../browse/view-handlers/SearchViewHandler.ts | 8 +- .../browse/view-handlers/ShowViewHandler.ts | 12 +- .../browse/view-handlers/TagViewHandler.ts | 281 +- .../browse/view-handlers/TrackViewHandler.ts | 10 +- .../browse/view-handlers/ViewHandler.ts | 2 +- .../view-handlers/ViewHandlerFactory.ts | 4 +- .../browse/view-handlers/ViewHelper.ts | 4 +- .../view-handlers/renderers/AlbumRenderer.ts | 6 +- .../renderers/ArticleRenderer.ts | 11 +- .../view-handlers/renderers/BandRenderer.ts | 10 +- .../view-handlers/renderers/BaseRenderer.ts | 4 +- .../renderers/SearchResultParser.ts | 18 +- .../view-handlers/renderers/ShowRenderer.ts | 6 +- .../view-handlers/renderers/TagRenderer.ts | 33 +- .../view-handlers/renderers/TrackRenderer.ts | 6 +- .../browse/view-handlers/renderers/index.ts | 4 +- .../src/lib/controller/play/PlayController.ts | 39 +- .../lib/controller/search/SearchController.ts | 4 +- bandcamp/src/lib/entities/AlbumEntity.ts | 4 +- bandcamp/src/lib/entities/ArticleEntity.ts | 4 +- bandcamp/src/lib/entities/ArtistEntity.ts | 4 +- bandcamp/src/lib/entities/LabelEntity.ts | 2 +- bandcamp/src/lib/entities/ShowEntity.ts | 2 +- bandcamp/src/lib/entities/TagEntity.ts | 2 +- bandcamp/src/lib/entities/TrackEntity.ts | 5 +- bandcamp/src/lib/model/AlbumModel.ts | 4 +- bandcamp/src/lib/model/ArticleModel.ts | 6 +- bandcamp/src/lib/model/BandModel.ts | 12 +- bandcamp/src/lib/model/DiscoverModel.ts | 49 +- bandcamp/src/lib/model/FanModel.ts | 12 +- bandcamp/src/lib/model/SearchModel.ts | 12 +- bandcamp/src/lib/model/ShowModel.ts | 2 +- bandcamp/src/lib/model/TagModel.ts | 113 +- bandcamp/src/lib/model/TrackModel.ts | 4 +- bandcamp/src/lib/model/index.ts | 2 +- bandcamp/src/lib/util/Cache.ts | 2 + bandcamp/src/lib/util/EntityConverter.ts | 30 +- bandcamp/src/lib/util/index.ts | 8 +- 234 files changed, 1367 insertions(+), 5462 deletions(-) delete mode 100644 bandcamp/.eslintignore delete mode 100644 bandcamp/.eslintrc.yml create mode 100644 bandcamp/dep/bandcamp-fetch-2.0.0-node14-compat.tgz create mode 100644 bandcamp/dist/tsconfig.tsbuildinfo diff --git a/bandcamp/.eslintignore b/bandcamp/.eslintignore deleted file mode 100644 index de975037c..000000000 --- a/bandcamp/.eslintignore +++ /dev/null @@ -1,5 +0,0 @@ -.git -.github -node_modules/ -dist/ -test/ \ No newline at end of file diff --git a/bandcamp/.eslintrc.yml b/bandcamp/.eslintrc.yml deleted file mode 100644 index 81915f23b..000000000 --- a/bandcamp/.eslintrc.yml +++ /dev/null @@ -1,84 +0,0 @@ -plugins: - [ '@typescript-eslint' ] -env: - commonjs: true - es2021: true - node: true -extends: [ eslint:recommended, 'plugin:@typescript-eslint/recommended' ] -parser: '@typescript-eslint/parser' -parserOptions: - ecmaVersion: latest -overrides: - - - files: - - '**/*.js' -rules: - max-len: - - error - - - code: 200 - ignoreComments: true - ignoreTrailingComments: true - ignoreStrings: true - ignoreTemplateLiterals: true - ignoreRegExpLiterals: true - - quotes: [error, single] - - '@typescript-eslint/ban-types': 'off' - '@typescript-eslint/no-explicit-any': 'off' - - no-template-curly-in-string: error - no-unreachable-loop: error - no-unused-private-class-members: 'off' - no-prototype-builtins: 'off' - no-async-promise-executor: 'off' - no-case-declarations: 'off' - no-return-assign: 'off' - no-floating-decimal: error - no-implied-eval: error - arrow-spacing: error - no-invalid-this: error - no-lone-blocks: 'off' - no-new-func: error - no-new-wrappers: error - no-new: error - no-void: error - no-octal-escape: error - no-self-compare: error - no-sequences: error - no-throw-literal: error - no-unmodified-loop-condition: error - no-useless-call: error - no-useless-concat: error - no-useless-escape: error - no-useless-return: error - no-else-return: error - no-lonely-if: error - no-undef-init: error - no-unneeded-ternary: error - no-var: error - no-multi-spaces: error - no-multiple-empty-lines: ["error", { "max": 2, "maxEOF": 0 }] - no-tabs: error - no-trailing-spaces: error - - brace-style: ["error", "stroustrup"] - new-parens: error - space-infix-ops: error - template-curly-spacing: error - wrap-regex: error - capitalized-comments: error - prefer-template: error - - keyword-spacing: ["error", { "before": true } ] - array-bracket-spacing: ["error", "always"] - arrow-parens: ["error", "always"] - comma-dangle: ["error", "never"] - comma-spacing: ["error", { "before": false, "after": true }] - computed-property-spacing: ["error", "never"] - func-call-spacing: ["error", "never"] - indent: ["error", 2, { "SwitchCase": 1 }] - key-spacing: ["error", { "beforeColon": false }] - semi: ["error", "always"] - operator-assignment: ["error", "always"] \ No newline at end of file diff --git a/bandcamp/README.md b/bandcamp/README.md index 45c707ac3..15428dc77 100644 --- a/bandcamp/README.md +++ b/bandcamp/README.md @@ -12,6 +12,13 @@ As the name implies, the purpose of this plugin is to allow you to discover musi ## Changelog +1.2.0 (Buster backport) +- Backport from main branch v2.0.0 + +2.0.0 +- Release for Bookworm-based Volumio +- Fix browsing / playback issues caused by Bandcamp changes + 1.1.1 - Fix player state sometimes wrong when playing prefetched track diff --git a/bandcamp/dep/bandcamp-fetch-2.0.0-node14-compat.tgz b/bandcamp/dep/bandcamp-fetch-2.0.0-node14-compat.tgz new file mode 100644 index 0000000000000000000000000000000000000000..412e1ae67d19ef5266e7297db6b40df50d8001d8 GIT binary patch literal 134783 zcma&NQ;;Xk8~xd~r)}G|?e1yYwrx$@Hl}Ucwr$(Scjx`>e=zv`EEF zW}0Erz>=g^-u*oH2?Pl`H3;+w4rzX37yx`?xpU&o&X_)%u0cbOwQBM}tkptdpfNQS zfksnviA_VU1n_l1c88GCbNT2!&M|aap{k*9-0@`Q&59k^eE>AsY;0_BuWiEG+!EQ| z5`Y0L-2n#H-k*C0QAe8_JDb~Ky)vshByx|$6HwHX0|mCwL%Xx2wz7|$V^Or{7&vh~ zo~|$2TMPq2KDp6{tD4+@8V@?K0Q^#o#P*Ol-Fn%8WQ4zi9z}RQaQvc!mRs8Md3?9d{MhjQ)9q+Ifc4+7uB=icUC^BO>oZtu@( z!r2A_|IXX;r|RE7F+UQFXD;6Yp1w^_=!)GxukJ5y(a-*M$EyIXL}`G4sOH?|bGTA& z?@S`160(58!Tug6ebA^-W1H;59-=?gp1sBF3e3;P>Yfkx4TcmqLZ;?cToR(=3b|^$ zj_m|fQ}FA!#~i|pcK@h7NMhn+K6Gu+XdD3~PEibcIk8M_kfRS;Hj>s8?c_pLd;bND zxT9kR0!YvlCtXk_Ema}QKmroP5E!~G(8%kIc|i2XH|OjkZCm6+K!ZT=9yQUkY!o5P zLmTCRYz?raiI;qqnDs&R4ip0D&dnbFyYOSYU%NZLOR)DFrk;5FSxzcwd+B^S2O|P` z;e8PcNSkD^1#am(^AP|McIgy zq#N;I`MjZd^KE0$7xSvgs4jkc9DD3gNC_q5e;uHSa}4@Xm}_JyVb^}L;XAeH_OX0- z)uai-gJZmM&5Fv-Iur}?G^2#OHF(~PWk9phLXxzA8uV)Lu57I9k{tax@rLXRD{qU4 zFCePQKCoYN&(rPA!eezzEF}hc(eLb^VtZ)CMO;H>4h#LupTN%5ECbdCn&tfXwFjWP z2Dw1)HaWB5hNd|xJP;_O}I80MGAPuf(*s zuAx&heujHG;(M-PTI#s7Y(iU^LGmkBQLON({>hbi3v3;ESWXPCJdZ;%Y=(IiY1ZeE z^u9@&JQclrVaaON$)6&dMc5Ukae)0T{+0dZ7odM;r{@%~nxJ+85PH>YkUylAQsSU; zNw_)=8w1xiXTZmhN*HR-#NfAmP%wqg4%0cOqTwnPW1ix9!(z*f6#ji6aOMU^E4P4H zmDMJ+dkcEmu}r^-im+%gH^2-*Hd{y|+yH$w+W&1va%(+`8Czc$($qXy+5n;HP*_2Qi%R^?P(Id=E7D70mjngRy}yhRG0-w(u29a*&=zss(r zOxL%%^J@)caKhTg(noTPzv**TTyX7H9|w-)AgS#2=XI6urS3jKJMdSj zsrWCExT@SBmd8jbK~nu0i-R{j^$n|9q%$-5Cz@gSM4&~RW04%SW6^ADtoC}6+t%5S zpr*Bm1*QZ^1CH_IK;tDvI#oy-doHF{xf!4B7Z(=m&c$_MO6Ve7y1Dfq7}5Ga+_`fl z+xbGTWO9UcGfi!t%=!ej#k7^PLHht4{lOP)sv&N6|?h6nX;h z=9-_M@ht2lp%Unm9=?WPT0s$^^00S-JmZjZkKc8gCJGJw5od|dn>fXBPa; z)tSbv?&12f4sxDNCASrUHC&uQ`brc|Xv^+Zdr!(HxSoX%iB4!{%dz}zv@JR^mumQM z>jG-X^=>z1cBGDPN3Wcuo7&Tuht`PV zrC~Ysg0>q7bLZsIjh8!sBq)Kch$F|uW&Y2NKdV*udHt1Fbx3U+w11XPmv&cY2E7cn z8rn+C3ZHW8(LN)-K5ANjUJ#x3=Q(u(JKxXm%7PVgnRmD&xPWn&tGZ<8e9{yfSwiHf zY4l#aFlfsI*oIvJoDmY@Fn%XtBJgJE^VF!g6dd}KvMswnmLVNf&Wy0JoI{)(^`k#_ z^HnO!aEBc{bac$=W|Z}nFczy_XmXU3dx|x$NRe+tb%M zfUUYKjDU7ZP8_**gnMsbRR1pwnnZ#YvxB$8-l;$`H4?t%?Z;y&k+mOBNaw_pKg{VM z%HK5u#B33NS$}(r3@oc9$w9Yh^x(?43MDyWA!f?$g^y!LhleXy;tRB}t_T%-@|eAD zG-bE5QJ|qPDgD`aZVr>Zwknbsg6+ubr(F(FSGN`$r;a?f>Y(i6>^4-McTIhAHn(nQ zQvh2w@wvbFVl4JV91OY|c}XytJJEp!f&3_%sbe;xGMFMyars#xP7b=5BY2J=Jtjuo zEYS6tD5S|3kKCE3KdKius?V5-E)njScq(4gwVMZFn*>Imd12Dwn+Idd`SAQ}h9`o>R93`B=E(&x@%)oze8@(j3ily-C%SC=GTW zi2f}#DL~K|GvVyP60@MRBTMqUkH@k&mfg%TxrW@!V}{ilee~}Yb=rY54nLS?+<`ls zW;9cmGQ$j|^lFUa==5luOfzzOe_~IWrP7=Q)V;-tdR-wN9+L>pL;}3(OmhLd&o6n+ z#cV_VXp3VE?VV{A2fa0x-}agZ0t8p~@6WxltSmp3`rZ024S9f);2HM-Q)3|2T0nTG zw)ofTH{ZYi#U!6EbprS?3DAf6fS$3p+9028EietGU}Vsjm*5s7He%{{9!6m-&a+nV zBC5IkmZoZjanv@+#>Ih?N0L;%VW2X47ABe zggm~?lzQf+_x|u5l+B84Vvz;W$s-^Fxf9!APc4RQ3bZ|70h_IH!S3OA_xIm%a0DJ5p60)qW-}`ur=kZHsTVT+ZA#IK%58Hl zA_hh`?o)@&N+opI-G$DVsSDGwmb~6M%^=3Oh%>leF58JSG%sqSP03feZby77BP^HI zhC)-hh!1m6aW?w$?F`s8DfV5JC&@qG^IR|d5!?`>-)29(5q-Z-n@MZ$@39H~lRVP{ z0qrH)%IFi?85EF7d;II9WgI6v&Db(tq_HB^&7)Ihvu2Sf!(;|7$L^}a3dV``$+7oq zNDONl3bn$xbZy{$R|LJ&{BvCXgiImFciLqby*PtalBM5xV0sdJu3#*#V0vf0jpea` z@cySM&C%%3yqD>>TSNl>t;Yud_X0%}pa*@hWQy22x*Ka>#9TQI7D6B*ai5LP=AcRE z%+xDl)N#w4LN}A^+mfqsSduq;xWIEj3fx_d0~xsZ9XQ|^9#0;O}}v=_1CRNCnnVK5s&gOG=*3(05cXsgU6Ol zsH3PxwwbVa`A4y~3-G;`@WU&aW&CkEVwlBw>l8y7TEGDkb&#RKP^6;upkwG^&IA+( zu-`C|yc&!O?BO}mtoJF=ZAZm#Ces=R=4l2jLJ7I%xCZKLd{Tlf+rN-`*h(VUv13fQ zykcv+37}GvWUB=AmhKtDr!~Lp;_v#p%=Ba*D9k;%v(cA&pr#yD)rB)>Vz)R#%fx)f z)eTJCs-r8BG{=_mLX)%8Vx3(5R**iS<+$db@#?1wm^=MqCEv~RY*JCI#<=>@Ld{eiYKOp8lN-e|n9l2tDg_&Dl%K=EC@Y37 zeggs?ogYO|^lilli8Ql~HfdX#NM=;B6~ZZ-bEVB+hF*wMUumU}w}3r`ChM#}^SW!1 zx+87nx#P^FyQ@6lgWD$fRHCRLdVRvlQn_DxwNC)yL_e>XcWjxAzR>Pg4FJmYZD1*XYh%yBJ4x_82ZqSF!n9Ea$^4^C{5TbjUm`ql;EbNlfG~iZ%^$lp$3~lm5MQAhLhd^^!HK8fzhtlOxMN+IbP7Jr{P=ihoz=7=XD^?!l4AoO3b*|!QH5weI zYtSIpSXOyO+HuHaX8b7hZNW_2b~|af=t;x|N5xfK)#Qi=)1&jk7KEFL2yJ-R)bWYm zo^80P*tr}n5sm~$Wg+sHiizl_M$y=}7qTZXFB-E%*1_ac&C365p?t;2vZ_MRX{CV#Ca>J^_Jh)F!oklvx@^yTh6R~5y}9PDq# zjew)_Zu@Q`w6r$;7=gzJF2LHTqek=>=}q?(nR6JSFEp@S$&;;W**YtmG;tm6a=+wh zrvhGHqTl=xTVK1r&FRjQHvOkIvo-=-Hfe2$we*g(V?4(u-Sk>m1U=X7rW7!rxU*+17e9>72Mx!&C5z!hC`CS@C2ZSPFZwf5&8)@*WZ zn0F3h*e@7OXW#zltynb6F@iR!A}w@gmwUN3NPP#jQP$`j$r2TwNn-}BZ1MdzDweiw z;jt`dt$n7wEBMM>n&iZW8;@n0^{sH$eVS-zLkQoos8~Tq10i^uuDw{gAw9IQUOgwA zq^~Q!HoH-zrYRk^Nk>n!WdDVKQqhs4GBe6uP_d!JD@ok8F>xu zkv+WOamYiy9LNln2YS3=w5A~15(yjJrYI@Y#+N9gkzDQiq>v$p4zx_)z$Ieb&S4Vv zlT1yAlOWL$eE)){HkML2%#3;YE$Ngr7=7Hbk;D2~0RB|~{)}a2RwUS6m$BxaN*6Hw zi|BcL0!X#`_X~}B1#nEog}UZLlPksTL@3--7bx13Rp!~Hd)B;C8#!nj7A;~X<~5lF z8B8bRC2wqmpzs)c0i_O0#Z$PKBk5)#{4%&V0m}S4R)xtqY&f^u*nLnph>?6oqLp6? zVL`q_05@{v5{cxY?h0eP9Xw7!MoihftMrcavdP!l^Pb)75lg)1b)Kc|FmJQrEQ176wh*xxzTujQ zU#CW91GkjifgxEMM>!5hH=AlmD|C9s~=pF zS(Q>Ic?t;ke?uIyyHk^i0%F;Rm2&dR2R}u|`q#X<23|_HT^R5jirIppH^0A9(Ul#?vbC zo+da%O_mwZjWMw@`EDz)EaXaYhkb@K@z#+BSU73@tGLqX4?8bc+Ykd8kCSnejjdKf z;WKG?T0xX~eaca$Gy1?HNrJjctX@jC*!Gj3W)F$6*m2C~Bg%UvZ#g!E4xL)@`rgm) zc*mUvW2=C^?vF|_95OTcu{x9`85c{oS~6zh7}7L0)IqOFq0@c+^ZCr2+j;-cKdAlw zbV|)BW;mp&Lux^lZ5Nu$c2qq@d)E+blT22FW=};3sq@3oWNn|C6v9fXY7rtD1Quyv z@Cjus?9 z+H*KUlKP-A?D@EU$39wiIXjZgX&DWHZ+EgvJ5dbInh?8OVeb9HokpO6xS8 zHq?ZV_Hqj>N@k!tE{YbRGEt;)tK0VBbThYnU9is>yr+;{s^Oz!^$LG z<@*Lk?di|#Rb^S%1^XFE>250s>42XC=4zD2%@Uq}&ef&W-@h7%%{IzLwj3-u2{pgn z2|cgdJopEx!hy>iK?-Ni!)qr@%}dH>-s7~N0qcHm4x3Ma_3f8?|J6ivK7bG&nkd4s zsrkJ#af!7!PkeE<+cPi<5!G`0$)Pb2YKFP2IUbSb#;o}XbRyfwt51SFpL<_YI6cH| z(_xNV*JA93Kwjr!tXF(-OH!;;?$AN=dwpD_N|(++)nk# zfAdVOvj5#Ea?f_JoKN~U65T8B?bvpzPh^}bkvI1L7Aw8jv8?#jwq)0vkcne^a z7fd9*Cf)ln=M5;Fyy%!%)p}f^-(vpq7)`HTV>)sB)~mYL7raa?dWA$b#&G*YD(C(= zU3vKt*#;Qf`;YDd>Qb8)-WX=eBNxX$&9?hZo&j37AG;g79IJquI6!CWkWb$K0R_|_ z0(1+0(&>F|5osIXX7d10_Y0C;c38KZ5q(<&i(N|7uG-%%9y)ME8H+ zVXXz(k6ZOyjGU``{SqPdmOzTyIP^8>id8`WAn4=ID5(FBF`rZkfS{1}?D-C8=#usw z3GM!o6dxhhxC^DMP4=!(=M870v7qHLdz1M8VGAQgzZ|oi;I8+4nem%~oojMIukpHs z)1qVM#bqAuA=Tk84toDTSps8D0SxU%U#0Kt|0hd;ZGy)T%N}O~`Xf7Q*=QlxwT#nm z*tZ$OZJ!zbG}--_kFzy6ddEB=cH4wI#uqcv73j!_90S=4*CZ1cjQZZZcfm|nBsp6R zmk8`ONk~4ciAxGDkwt~MJi`SyGw8>PD=iXg40e+A{~IFU;m$uRjf%*?#&&k~85lq- zFS7{cf%u#;6c^Y_8OtGR_%h7cUj$eAtctrQ!}zoE%Z<~xSjj*dQn>|qbNvq>1h=Eu z|GxmjU!|Iz_#Qp2seK96>*e^=N4N)!@uGJT=@BdI^STx0Cl1y%fo4btL9H|nnLa#o z%_<=k;2YmLXBOZvJP_ODSe~j7m=jN(CkC0WDToHRDo@6+mKyITxyEd!7C0Z6^`0EN zY*7pxd#UHQLnW~hjH%1C6LbX=zvimt0TsI$Oy|+dIF4%OhBo%NgWV_(-mw%Rq|qWv zk^Wrv?zRYL*6;!%@8WEcqmyeTeDa3fBKVy6rzp=xP?0mclNX z=7%Pm(|%BxL!rA<6WNtjPNP#@e3v`>|CogkIQt0Kl$1-%sJ3g;E-495-|cq5^IWf- z@i}@q&bHGh4&PraT`?)4ELViZ7E4&P&!f{Mbp`$Jr;p*rB=i08B!Z1L@1~R#q=P|) zv8j++eZ0ITu0m!12E8i1OCPnl!-zGs-V_R&v~xA%VyoBd-tz5=4VlpclAH0mfR|-l z3`ZDq>c$-|A}MoG$%4;Yy6BlGb%nfa+-|S-86xUVRV)f?R4`Zdy{ypSmpeWYe}z#9 zZ)y>B!by*l-@=g7Xnet$#1v59+h#6u^j0az8aG%Dn-g$>r!kN4rsA_(Uu%79>ysTC zg4KrdW?*%o)8rqV1`44sA9TUzN58HJ@O@c8sW?%^G)Dg6iEoAZVoiyAX{iP=Z{s*X zo&38$U_VyuXZQZKw~Ea3&#ugu-oYyhfEWcp%j8`^$SBVqiBX%ZE5j*kMNPv7rou%Y zJ#?B8k-A`sMSIeitV9#4=#83fm9Z36;4T4|L+4IUHR^HRAYZCIJf8CO1y{gy7qov$ zj9H`9la+GP2)H3YALlMQ@h!iRi1;(xJrL`4kYL7< z&q8vF%(2FuLW0TD)%m!M;;=aYVrj~GBGp{5$!XEh6DF#5GBN$fnsg*nBl279bRzIc zzg{elob|7!@C4Y~!@sN;*u(#zeD`93chdFRL+m)5nYGO8kFgFIl#VV! zCui;c(F)J!R-G*}GxdmpMEcv%lGLUpSpEG;dRvN_bCV2g)4-L92ROV*VWCLQfY!;7u*o5&ATEwT?q^GHJ-6>Nxs87{{udAmkU z#zTC!QW=KPK0PC2e68`=4gou~^-?&+58dsvLG&Nj!=jmIOff=biYiy>98&2)%U`yM z{_DA5-^5m|{WoEW|6b))%d@Ze)6=A19gbes;j~OE+yoD=t5J7;@CgB8ChwP^Lw(SS zqpO6e)wm3}lv-$uaT#7rj`gpUu|;lD9xJLV&Ds!-U%-@c)#{{&s1)stICBq%mx}1u z-Q(4dJ*15|PEJ&;ueiruLZuLCL@^MH!{3Sfe z`Xwx`jKL1bl`Iz!J=j=?Bi`P~+?eIu7*Mc3sBE-rl`GeDl+x}}LBnq_HuM~oH zIBEuCwo@XVIwSG25Y>xl2~B%T2By3!Sf3rLlGuls1#Q|ZR<|)@ufuRI`w7~O5$*kF zG6fdf-88K5_ZR={0A}Dl1~o}wHF^DW<#8F9$%K}84M>u|c!mj|vqC23UZG6SESthq zv9%2tT>{WG!=_noZwXF@z&gEyry!bl;UCB6R+m(mc)W2)G`+vo>r0Fz74QG^L32c= z?%sYzJ>YIk1bVrGt{Lz~^WDu%?RQkC6zbPbFBxnr@hlSPvF?CZje;>l5d+=`e)5~Z zVZ)DyaU&u)Jb|Eonx4zS>a8de8VS3~ zePI*&q}0pyeEL6$^UIzG`P3p&s8f^Nit*4g?;SI0C*sheRMz*_!>aI5S&j)mxCKe{{UA4NZeh93a0asW2O>6#czF)h|r1tms=mh^s9@z{4%MAS)EVstWJ!h;@ zgXid%SA(efX|B6!GZ6wJHhWA%NP#ALs7+W@LpBwCRFK+b$YfN_-|_)%3cEq>0v+Y9 z5VipvLc3X@eOrXQos+$3xSgrG;*5T6bbgk}AZeVmM$#>*!@vbWd)m7Z5WGDMQ(CAl z!#*4ce*M9K)z?~P%~^jziszzvFyk~@d!VuTC9%O^<`lD(#Qn`!+Y- zzJWyzHj{ErOt2Nw;P2}d`#DzD{Y&rkrea(;=1Q}~5;2%BlJsB2Fy$ZkW{4S;N^aQq zo%Oq^EJ7q}O5{w@VSOXmYex^yF-D4YxvP7R^NxDK3}G&cY7o_^+&ys|ad4ckoE-G7 z6UKqKDmw@$4`!Fh?~if)-YZrQPuHzYhdX)X_Vbh^Co(d->mmGseI$I6FqClRJupXC ze~T;6KpA25CkaX)M^x=~o=28ve>ii95uQFQKlq7$iF^CX2Nz@Cej9Vt~GCo;(9+ZEk87K?|t*E3$lMya`} zXvMct8QN-F>69{%=Lq-xSl1)gNaoV{8Z7i>&u}bH#`b0liAob#JU@GQOH40{+J*YK zFAr%J@=y_0A+>ee;MKsoQnzu-x}jDup}Jam4n!L4@3&oDx7gSmbIfn4QVS9i(`l>F zs^&bPv=T*>CW1Ppo7wtTF1-C4xZ`@?RG`!gNduY_Fg5lr+@g{W!8_VH@P{64*><7aG&UPELvJ|6wcA&07tS{03|@kgQGvOw%&qL$-k*uJ3^Q9CLf)63-@m)S*0 zgN!PDnpM|F+Umm7e>h#A^CM_vi(}jHno}VV&RIZ9=bnc9pwXiPS=U;J`{?<#G;r5s z)U?bbF|O**f?n0fh3Ft6>yLd{Ro(oU;`?ryJeb4VFc}9RSTs;Jy9o8hhMlHR(LMTm zl8RRA5t<~Kp2?w1r#RhUc+?REEs0ey_-j^bOzR)suC9)wTPi=nYu0N_$C>lLj&%fw zC$72C=|SoJ(RfDg6arb2i%d3E*-M#2kAqrO73ei<4+Ac(9FTTgom1dbNKAJX309!N+rWe zs!oYACN)-%%7t;eF`r;K_G^5eY~>Q$neCPVzs;M{D27tDXJ*+~wVmCN)!1cbAkODy z$c)&VnUz9De>=2Mj;Z2AQZFsp5ROc+vMx77U4qDJT<6;(z!I~O;-GH8nbAfPRP-N; zrUqD6-X0x+_t-;VXfz zIAn~|cC|S!=32ziL0?)Rhpby^K;_)RAY%HGf~Z-(n(>t>#f4ufDr<~uX+R+}!a;;P zQiQZ8UeHj>Gh>8jI9LHz6%4Sy*^*UKd*UOh)x63He}hekt<$vE*%dMX*Qq`*DW-ds zS6Stxg++~5Sn(fc8sl#U{7JQ%S(u@JCQ=_B>mJ)3|F+Ot$JrVAdEZ>CHhXTjIo}DW z!JO-r&uZsLVz49!WYZo_;tZ;r1N3%|_-a$UxdvaXY}O|;YttGvY6m2{tva8G|DKgp z&(bt-)Xoib341>np&zMY#;BW6>ZKTZptbBRulcLn-03c~T*kETr2muW=yqbWe6w*? zVQ-J%ng)MfZG!{jCu(S`PZStcQNRyGEojibB?lt%B68-D1%3OFFuF@=p%_|+U^P=e8IYL9-6 zLL@oa!XeFaKzA+kFhzx9neg`&^9{SKJK;Ec!Deu3;w0JWUa(xx2o+uNxFpQrc<5Na zf*2b%$B_BKss-^N!-A~m$eYhOc$`!SQi>_=Zw-jZ<-Q>wnl$4_!&cfs(QnD5My=|g z)Ut>D>md6~JpH6u^8LDoxavM*98gAYiyD`z)GC3cd93;qQkw-E-9 zxp3O(aS@E$OI8UJ+VxhD$B&Fy>Y#~UFef*ip9EYMm~m#8jHK4SOE%kJ2e8C)y*pjj z^|v*5nehii83<+sWvZK%)gV#8ax$1Lb}L$?JMUnfYe(SgZFQZGsUS9H3gvY(4M|U? zKHzhyLBX6kq8P9ShZ`tc4mLuHnz$=p;IKGjt@(`O-db;hbT17px=7-UG<&#_YjL{B z(~4+|L^npQRq*(1zQ5O_YrYJA6CQFO<#^5AgbD_i`E-#Q`~ zqdtUf_W_+$${oUdP4aakBvT#o@2D59#)5yYk}Ia=AHA!VpoL5fGjR#@I-VXk)hZ66 zKho@-FC>-w^Hp&$ed)AES1{n;0iwTSyg1PF{Sc6%6+FRNhs6BOGZ2XhFN#1T$6}aj?{q~>kY50{`@Uqy$^V8 zd6oSE^gRNsr4Iby4QzrbPpfWVJ&yEnu5x_vAWOuF!v`8B-=$+4@FYc>@lbA5DSdzNUT7LrEZa&ieXYaMG?r{AxZeT`huYsNKmlkeV)Vb=X zr&J^93}>tS(WW}&tND3Ox)QPdcc$KQ44ZFF8ZH3KQR}JvKx+TE>WzKIt3Q4p&n#fq zuVDo6QriDz$>@(gl?Rda$cm{9d)$ZN+nCu`t>Yw-?ur;rNjc5wM?};)RS#Q@v4+PM zdAQuwmreo&dhGBQxwXDIc=y5Oi+qNn*u9SltW}26FJ@)(J*T>fyg)?y`aYX--6C%Z@$(5d%h|JpYIxc2zI)k-{l;~hQa;-9_Wh8aE8 zWS?!=W}hVI8uEw#+Nk&q|DESYX<_H*00D5X>n?fp|CcU!`d9vv)&d^4@=qc7INm~a zHB8BL`0(ot#31oF{h2?#G7~=)?UL(_sJ4f6gD||xO>2&Gm+530=j6wNkm>c;l+}sbC3S5dH-jFp0W1O z-}>NLWI?LR@Pu)|8Vw>bTp2{O03V|t3H4Urm8m!dx9>b`4wrN8io;%e0^X(f-s|oh zPy&E2-S{Pdm*cEmXcpd2=|jM4S1yPsd>rVpO}e`fGjf*%Sx&0!fav`EmnHen+v%HE zbJ|Rl;PyxL{v3PV?1N?Iun5{K0xU3ub%HrLvDV3i5^kum{x!*AAUT8| zwHAF}y<*!n=I@XsT;164z#={?eay9An!M>R#^x^_Or+E8e+{(#=D@Vzm)lD=CcF$G zWJj|t2!pT>_vkoA?{C3zhhu^TM3B9JoRZ8gq8F#nJ#ay3 zkWE*!;thWtf2TVja^1qMd~?ELTtIq4fOK)2l447a^~AI^Q_h!`NTX`EZW1JwFA)SC zFCng{4T4(-(b@VcmqSt<6PpCtWI$5Z_s$j>;%_1#A8?7n&*jN7vZ<-pVcBTM^)qlD zz1t$T$IqazH71`MU1EIPkS@Ra{oqT;(3(3hdDLJp3JR3UY>?09C9;;WKsMAr{+JBe zz6ldAky;1`1cd}_d5Qjf855>$p^}Za+V?i&#pk&1K{6?4eX)90{=%V&QQTGgwGaapOV33dKN;|s$-JmmD_~Y#yJ|qq4Z%E8-pDk*@r3 ztKPlmP$T)ieHldqRai+$<&u0HDD+gt10eBD^rNh#1zjKbYwY-IS*nvIibkuk#a^1r zfK#i5F8K(VIQ4y*^tnpYC}j&E$-mPjlCbPT>mj{eTAk@qlcJljvttpx$@`}SvMrsp4Z zAgO-(VXzw~y!=?Zv*Y3C_FN&+9}6EbRg!(MgJj4Iu!b1)ksb~s5nA@PP~a9#XE zKF(7F(}8v`%WCobDlz)c!#!Tlsu2Yulu!>HW#IKw59=7|oRT6B6Ur!Ur1N{JIcRiu z!6*ga<@LTlI$D42PNERNtt^Q;E0nO`zP@s4@Q^&a%9qePx#cVrc$Ng=`TBhz}-C6o+TD^db$IdVv#|6N$%w9*@S_&RtwL$A5#*-yyt z|IqOIv^<$qlqMj+#pU&^d{bXqtJmf6lH8L*l=CYn5h0uj1!jTaScHM*Jzyl_9s^hsHZe7Qt80qJ782i(U4EkGWIo z`ZziP`|eZ5&?(L{}Ni18K)kRM^Cwo>Z$^Qy3ugml0hyo3yJ18T0_P}{TS@~{6 ztcXl{@B9fPrQ)jhvH-A&=pOwR_sQeUllxOkQk~1rf;{odLLr|ou;&qM!x!-QT9-@T zVBzH1eT3$){3C#fh>!i+i+6?h_U%tM?)LL2k9(wbsJis1LmLAw&)i@&acOJ@834lr zj(TnZF2+kKtsQQ@IParKLb)&xQ=xd;VUF{S8XaoiPM|Q+7zx|Nle4$XxifSEmP1I^ zTR*sl=HkgHISRj!dM1J^+Mi#QZQzU?&YYbziK$0TSSZb;|b+Y4Cx(6~TdzL^={o#Enw29&ptgGIWW3Wto~_H*DycvY)<~ zRk>#Cm(SqaCFEu=tWNm{6QL(Gq6)|U+4?Rq`w2EY0KJFZH@xqiM~=i!?Y3_*^&=kT|#Xbc1!q#)ZzKFsUN4!7aBL(AA5&og-N!Ntmwwb*9YH z7y*jlFgr}N=~VX+@7Js5L~uo&iIyn{62X>ORK@pPW=Iw302@W!B;D>Dc`JCVP!!lt zTi3(43p65@5#Mkq_<;$*bgUo?^$xwbZYvycr01dsh@Kipio6oIM3NFDT2~fh<{QM) z;5RuJaFUIZ&87{K7CiJCjZmKN2|cbRW}L4o!7_cdNiQf|F59c2DW?-Rc*@W#@-^vC zYSNL1oQ+lJVn#UN!gXUS40k-47z!`rk`Np{t#ewVo7=aS>d99i6nj{ehZS4u*f0+X zBYBQ$Nj(@FSs^QNb;WO3oM?)*fHW`w_Nz9EnJuO^ee01$2-C*5)XCec8&KM)))nCD zM&cpCwk3U*orvMj8FU(_k(ygDSy$tB)}#e0dSJ!^P`!~);3rKeC`0wrpJz6QTU8N| zuL;vk3?%u=wh(+}=U-k=>S}L=tOVU?$*RVvvT~un-_B7(OOj&RL>&t>$*FDkCLzJ;EP7{amM=gQo%iFI07Dqy#JVlbX0bvexv}I z&5nnKY0T5`n=Y(nhKmfoFJ`GF30|QkBWkt*=@NrRRyy_2y@8(;MEq{I>p;wNkD3c zY41=4zO-yW$|om0s7K>=ucR9rnA`8Q7`OQRlh1>G{wfmi_+y~X3WJ#1F=oPO=hQ@U z@I+k@&?XJz1)xrdgJtO<3Y45bgIK_$J^Yw^RMe|i%AgB0;q=S(a0o)g-F{eQ% zX(y{)@}5Uz^WC_x6@8&eHcKjmXKKEbNja0H4Ws0t&lX{ERR9JpY$ts?n%eS+3$d4L z(OISgu;;{O=x-6HY4tSdb^ku$M6%#?YBo$rWhNHl{%pcZL7q@og721bA#PLHg$(9& zEMKci9G!a;sN~Q39YzL<5?S;(sK2V~B~+9nMF==rYKLZmm+}UZ=mfK>`IdEAmHleM z;m9)FQfAQ!(6ZaW{bG1*1Pjbf?bV(02G+iIylbhPob(MSFv#g+#KzLVmXo1Y9Dmww zHs*mRqNjcCemOzJ1M(x0&oQtc?PjW0<3uoE7DHG&RJG2uJ1zwub` zqeBNu2(Ccp8IZTF;{_b+@cho20YW(x7PWoR84oy>f_TAoQA+jLaCUS|KQX?{L2`dB zn`vC5BeBdIt)gN%<8&#L?Os-PUBS=7-#5wBKhT)v#0UB#S9Nx=ervMLh%V0J9TMD@ zhj5^lG`4zvhni;RpB@j_7WCM9QIRUZrj;qrA7(|0;UEGQiG`m?ooQ??u&7jEeNv|q z(@-JmooG7mntt@w`iCqUO_&F|7mq0vjKA)ez_i&C1uq^eCaPL23utz0IIT-bfuusa zjS1IuTryT(J-8a3sO0atbJYp5LbJN>fTk6v%JefBH3wJouu$5DjumFozlkV{fp*oB z)5C@f!jD$%)RbXhZE5*qWzNsx#nX)z5nV^S+W?C*J$vquD)+)qg60o9FDElCg7O>k zFI%U3JACwzDc#dpLx$lHTV=&f{f!WMOQd8zD!4%>WYwHdtUU zstNeT3qY$LAg^o*vLSK%?HC0M857~m4_yq-r<{lB|7;)~FO;UXGB9FX7 zHNYdbbcS_{djHNN=J2tXL)i5zWTg*V9?AKQ&qE#3=TaB1t1{T#wa=xq1|g`GRR%GPT+sbI=@wLtHe7!n7rDwAYvnr zTCm#`ht_VCl^ch>#T@CCHv-<|88%lCqFy~YL5?hj6DVaofTh2`zxE?wZGB_&`Cecp zQ4Je#-x6e(oQv_H(&V9Ece|8jG#`M<%0fAuQ4qBHW5QhEgXOdM#^gaJ^BWTdTQ9R< z<(-T%QGn#97-N9-U)LEUeqV~fT5$k_Bw@&08@(93oj+G8OqU}NWeEJmyA>I59~yC+ z5Sq56bD0lOi=kew19%J=DhLf!Xjup zv@D1Y_i6=yut-twGYU)LJNeHZ;u-k%e7qYAsi~IvArz@ZLg+Co=6FXwf}Ltp4LXu} z%dDEPet`=jy7 zIPNBOPEapa6FY2-Jy)dXlOl>s9z{Nvp<6osy~-Xz(Tmv6~K>^1t7=@bWR>vw`Y) zfSuh9e~U4Hp1YaJe@27NJ-`+t7~+HtsKsW(7U*Bw^Dk!K4a(L2?*!=VBHq(1Iz43> zJ)+AVWLuyo?<4E>-E1WEJUb4YDr$$g2jg_Z z(ZH1xkgr%I3>o#)I? zlyY#*NTe@KybG`iQnW!zGUrs+a_Cx5)p47FasV$*{vobCn;r!bNIb;VU*wVPY?AT_ ztr!c&pxx7uxXw4%KIGf-xTn-LjXj(srP1M%%vpN=nTAzIPxnkZEe?KLT_puXUd=7q zlwqfhN1?6dnSSYp1H@X$vkgii5#rOuNFF#o1feLlxMt2${9+ihY86!yEDc@DaIsCG zGZf+mGh*|`lNw>%xj$t2E^v2TxHL8MX$8}$GkeWDPc)Wbh=8$`iYER<6HpXW*jCyT z$G+w4vivP~0_7x}^xi(R0PFW1@B6VQE;}ojpVl=OM41XX2u*P<4T;k(U@< zx`G%oRo&iu@>t|jn6h#7D*7gI(M8`?NWVs>lhP6$tm%UA`gY-N!L|Eq?UKq24*XoI zX%`nPhzz&SD#M&xsCe#z3qKft4f~=QoWi(t9=u-dHfru-w1nud)o}m`%%+h--1>m3?N+8|9)g%u~wVFw&6HTbfCy2i=UyYrQ1q(9FKVG20ubv2vy z$y~*Uy$ogP5449UxLJo=BU&H>QP4N_X~1+9j5{e6wW2Z|0>)B&zZzu~%b)8!>7ACu zh3%b|YK*_pd@YkKhh8Fm#;V$LeCSzM6|s-bEo^wG=Z5!$F%{H#p)l z3LYLs$yaj*`%}LiBa3meiD&qJ5F~{MDE4$loZ+S?I3}s3_jXu~%O0ref>{}t68Rbx z|2d~bU3-ztp3j{QJ}@ey+fGX6$r8G!qE1C6MWeKt&$HCZE9wt`THVJ+pXfBZ{7>jRP^* z>>g5EZe|7xZs|2J@b!MULPFx|)-UQ0?tB$Hk#d1+X|T2bC=EKKX;n)J!4x>PpA_2& zSX~hsBa~elWQ9T;fiZL)x$0&6hsJ?k`p(cF?2iuC2RIql4}ks5XZw?b_izJ{0MFy? ziYvbP*(>5ox8@mk*vUY>MVvFw7VbII+qsf`31>9J`sfPMzKS)0eaXwY@`a_kb#cw2 zGwT1BM`mR;Z`{h}navg1xqr9R?5dh)y#8JBlVn?^AK{|T&-am)u(4>Z`Ou~J zxuKU{xB)aZA-cS6J%0H=$<4q@l1i3O>x0D3M>=qK2F(lLnJ!QpN;~=CY8p^Y#;63& z&i1*xYY~H? z*cdi5_(w|eJ+5!4l=pM0$!G>J3F7VxcNDmi5%t_FxSid z+4UV!t@ALJq|%(lr@lRn9N{r{+uO+5fZ|erb%oS-80lItI?)hBU1DDwh8NF*h-$lY zK0AR{FUe08Cr~1NeNvLynY4IIi7i@M2*)jJY5c#9Kd~EV2|~c<8TNVC-^1Io_D;ZI z?^;N;N>~p#$Ua0{W$;QH*jY5Vdlu){c{xqGM@<>;9?7Iv2}WSaZ=!`tE2USmcRL22uHh zCst851_S7hW|h#m^|0NW>sUnC>W2ItlWmfgYg+*$?f}92(qVd{N<`$s%_@Yg zWN;}>FzSAqE#kyzAA@Es@gg?qW;KkEUAP~K+bS6yYrE$at-0jX9!GDO0AJ#S*~#0m zVCGtcf=@OH;p?M8qrzfXCT#kb@ul6GR8X5s;qqxWP$J7-%HnzbJ6m(qiEu%# zn!k~ulC;J>1Sr@#jwqMqu|li0B7_d|NJH?1{>mD>p(ypX;rt8=1`l!Oq;0{djb-{~ zcE=p+G~BAe0lv7ZFI%Eb(5z{TYU6CwiS z_o1ZQtV!@;S{uAzNeYe&XC=r6SD3b96zF$IDMTh%;s{A%3<^2}Tb7Ls(m5UVetI5b zHNH6rF(!34-KgB0!Q4~=ZNU5`IV(+Gqu?3DTJKa7qz?PtQb=VASc5HGHsoY?s5HWS zicyzB)lQu05U8bFYQAC}1N;mIa?ncd5Bdz>saAR9fHDQHlrz3v``x=A=#o8~lp-hy zkULMM}N2`D#XY0@$DbYmYJxJ82opxM%uQ?-W!vU62cmj1+>9gYWjnXp!cLx znKU%m{cK|nwxXdhH#-#bLjPYEZCCVLFaFdbMsoA+aU5e!nIjhDAvGczy*v-xo9A@n zvF*OUTx}1i*N`A+f@sIlI`Uy<%WI2(=%i~jtcr?`FIA7&GYy5w@$gg-6w6%D_Vj4W zuX@LUcS%B*YkKY^HfK*9lZsz-+sQ5;Mz2o7aFq=?m<3Q_iJ5dMgvq0WvKl|aCz$=) zTEWpPmPrm!(BT8K5H5Dep5UXCSPv*X4_&03=0LRq5qAwo4+MAx*)4ef>I~EEqIC?K zs9bb7{%1?IP~blWQ48WABR}DK?p0>ki#2J!!Lzd_ZqdSXVaE`xJ4JWd6cY3Ck@s(M z$GkfJVE3285wY7?C)fQpj0}2^AvYccMzho+ukPBsa5WMyuPtxW<{$;fwf0+5m0Flu z;Hyk#qWtMd8+WU8>oQjSLEKnd{^FukS9_pSJ!_Odn=Hrq$1!nSbK%8DO8uK{gy%>O z`xHA3PI|glV|P!(gc(j3&uO&1Gq~LvL)_SzBW5s9=aQ*tA2ooB8s_^;GjE zH|!^0>q z6Cg1LkZkgtrYfS}ObgN@&GI(J5X6N7v%?0h$<}OY51BSW1$(5= z1-#|Kp~rm*DAv5ue?)k@y6pD_0Qcc=WqXl z@YJ6XUqN`cx>?|z1$;RGJBOZg@)ywQTZ5iH@Snp?wh#{7Zai|&k61b}Z1nvL@!ek2F|$b~5aV2B8Y=El9dwlZ?2{i8A!Z!g z`Ur%9m?wjxJRCTvqyRI|^z;*z$G5$f)a06Q?K+QxKOhx-O>Lk#Fn!Zq7>YyK#&F4g zH*IB4YqT$Nq<61`!M}IsYfN2vOWl%aaOoSv5eiyK7f8l9I=*SN2FuM&rD*@wj;ole zCuw<<&0vfE*`M{YAN^*moipEu5kz9hef04@I=(rlPA?y=_xZlRf4ne$eNv7|pUoSR zL&ajl?y`L6xYXMDr&Gl&z~E4UjR$ONRI^AsIo-5>HXmz*!OBQUj`|JjF6+)2XGcFe z8sOvT;-kddg~65oNIPv1X)8LKPQtCev8Y(tXSkROYxDu$NqkGO*9+IOR@`UTI4iih zqBls%PjUAA|CB?5Y>lnv2{1XkBA|WQhB{ycCI$7uq0W}oca^-a0RsH9tOzfcR^spf zRZ6rsV&|%!2aNTIYwHAaP8e0{k~uo)fVnY($fl&~+zKry&be!^BarNUqiPS-ZQ?&R z`Esn%n$evxQ3fmCB(WAB>NA+d<~?B+c!%Vy=@@M^F7~)G@XZHp8P@k2V$_Q))o`~CYMDTFPj+8<2dzZFJo%Q3_cuTC zN~oEVwl1Q0#4v{1p+~tfS-O3*Z2Qom&ABw~@CJVFtjeV!;Y?d+rpBvdLJJc;PCX_= z?`RCXbD@9>^*7l;qV|ABz#4|eB*8(`jBr& zba(6g0N{^mzjqF9{SyFkM0fv0my7}WdF23D=pU6Qp;I2spQ#E z9f?|P>KE0JPMskJId(N%VsUOemKe@e?c7cXFMN#S>6POSE$X}V&;tnDQMim4e)fo) zQ<(v0%@9l`aC(!skN3&W^5!c#qgmaF{N~7=N9M+b%|J)DAKvFukT!hfUTdd)O$*b1Gfyu{4r0~Cq$({LvgX8aJc2B?5%M>QP7(5b^jpT0<#KGw zPT!kFt-BQP7rtIHZcXk{Z~Tu>KJQ_Tq-!r%+>Wu%qy6azal%Lvf~gs2>v>woY>0$T z%#ns&@mN2#aU13WBEwuuqfB8YkO%ZftW^R_Am9&>#n4q%#TAi1oP9PBaC{YQ`}5;L zYI4JWQd7?a+ka0A@6=Vug<-wpC=nHVWIWc@emmr}REF?m(`y6$Jt|VStZIyA0`0en;+38N~LJ z`QYgIK|3P}$lo27cxF#b${uz>zN(S|)2ien78E;ySNJv;8BhF||CRT~0e2&SOtq8G zz=&}xx1-?3zg5n9u2=An$e(l-dZxA8t_4}gmov_I*f*|d0 z+Ij~wvcSg}w4WF;3pZRP6u~N-FX`7t?zYjlAXe-!i5o9kvYqRa8+cQkY5RgLvBJ+P zCSqa!{+1sbL-cl8M@jD4Jl6`GQGF#3e*dswfq6SQ&N{n^CtO z1iw>&d--aq8aJBw1k6c_VdC-Y^~%amNm3JC+xKmeW2&L8KnsO1oBuj}s5{K^-=tzY z!V!o((gb(2&zJ@B#4Hz$akv#B1?%+m}%FA z8BMBfyb*6m9L@V$zWZxGnAXkbXgHP50xNz4x7hZ81m_o*o}XX&JI9Y0=@{i4_Q&&U zOmPri?(-GH>F?fd%k}*ztNKjb?<)*#e45HhpZc7G9U}M(@4(N?Ug0bt#g!Wmusgb8 z_O1I^Z>^iOfmm{Z^6}ghyOrSBiJn}fOu~qEm-l}?cO2*&J2yAXh|$v_$R{3MKW&bo zq7ZUk-wfWDtx{-VZxn*h5%kUYaEr}px)<4Ib3R;$qP{%(1xW9wpYP2uA)9Pk zhAL>9^*{7jwNN~~>N$GV+cY{xs#swKosqylPo5W~rG9068}rj43sh#D#F86tk)Kb* zC)kyDYdQ2xgqM^Rl{y>fXN5T#qf^5tQn)2Xs)WI9kY2sl9t6PwJ@r-!&o(5P3@}FH z^#@yj65mUO<2AWS#e_TI#JyNYn+#Uu)L@%>i@>ZhfRJ_(Wg?FVy55v1)_kMJp|g8w zVxk1END`dEHGyUBFg4Y4T%67(lgeNl4%o|wvl)4bJxr>ZcV3>JA=a|Qk@ z9Gs$K)*al#0y22=?G{%K(3c)ZBPXFAuO0>)2B;NwWUS~QOBhd-vF*#JqCdo-SqV92 z6_xhZjTlQk{5WBPa3FBKE&L`p-3~;k+IGbevH*YgNo1nL<++O14xXE7ZK(*4^-Q0FqRGko%|$qO8oS zLJeDb|J3AZUJ;Em=^&yiqI#Q7-|wyjBl#@&f-oeBJhSq&5FBLoboz@Ectv$46f`Pw zkvmZmXJl5dlT8TN=@^wWkkit4OJ05aVN z1Xnyrsp&bqN+}n8Ogp@3RYYUoZapR&0=btr9&Uh3@qCDHIY?0ETu7(U{8dO1!QC{` zk|8%OgxzC$!+Rhr_X6e_`A{JXgCY-m68)J;C3<+fjCezP5xY#!$~EYCQddD$g5)m0 zP{YOLgDScgt^amIeVK`s4Zt(-H#^FD&xww-3FRV{P;tJzPAW{jLQ#=I#GrBd&fK;U zj23Q~Z{0-g`F(I%C}wF8@W$Vj*heP2y{)M~S%`UQZWKqZ``i1kRYGpnOrsOqM$wRZ z&K(KH``b-T58D5XNnsgX@-$T=Ku}osNSuzdVt_~pkMhe*(jVUZYt)*wB6bK&Grc%r zhS%Ph=i)47N*6uY&dq87b?PYuJj~Rz{467dxq;7qbXcUK{P0XHs1N ztmA->1X{cN=a=@LFZTE+$>#t$?`+I%HL{*cQIJbh7Wx8D?8$M9y#uFu1O6cteZD@^yWN(^@|cLgVtta9nF5Okejb37h0SVt|a`k)`ohHEbR%b^80^kcao)G1YI{Z%f7ha386H4*VW3Kf9&= z+S~N_2!1ulC?bYV#j=fVqO#OE^T-~3~Njv%s)B@i5%TzaNT~854JB?<0Qpb1u5?yTgDqnEn3b?_fA(wgfSQa^`C@ zwEesD9z9y@$g@j4@(C>RsX3jBkYT0l+0j$G6ME@cs0`BS+|cqq{0wk2^p8qD92fe7 z786RV2Ef>5 zixODZbbr2nj*4(@yS17;hU?;;_UwOMP%}WhbNj2b$1PgGr!%ePS7p-rOss=zpj`Mr znWw1!eshZSefi%8WOP52-g^OP9=}}ccsS1Uu0)mmppBt-ELjUS3!`XNzhLMVN$z+V5(E2;3iPGqy z9~K+~E5e6XiCJRU&fomBr@*5|MAII0K;Fi1B>tKuB!3#}SK8_M@NunoJR34~ik8T<`L%PeR?bUAxB{+?6NEE5A{3z@x8w(eb+$?pOGIWqz zGT~I=5NpZXQTGY1gaf)+It$H`h{a*N1zg5Pm)#3@mfiQCm#J`usWG2p<~S{nju9Rg zM3YBD4D0F{Fw}sTou=i=gYeyB&i-v4t2JA9j|t7UlBVA#ot*uwU7w0ju=JT44!FIg zXrqlyOONkb-lc2Yb3uBV`Vq7%4wu;Ik{=?Ik^1{}a+bkxMIq`=NH6im;Mzadvt1Z! ztKJ$v*O+vjz?US>@q{<0f3|!siZDBiXxyKlAZ<&(o68LQI)!XFW;)wP-g%pTeg7aE zw5e}1=yYxvcQhsSJC!h&H*v;eKs9SjnT0aw6THT?Et?S2gA%#4sT}o&VXG>``@Hx_ zHro_CsX)s^YtZ0?o(UaApj+^B&;gAU}_RZQc(4^U5<|G|MdgpyIQ5+J}236(K zBlG_HQ0pY&+LHZ^+9|Mu%)qC zbEWqmwi&BUap%Oy*^^6&o$44Qi>8Kq8OdjTbtJ& zUB>-l&HQ!-DIKemswH`|`idUv&+($W-J#U=+i{O?!;VIp{Bc82*x{hp*rH@UM);UF zc}72BggmopqM8`FvzJ?7Gan%8AobDBoYAvX=$o~muR&hC6xZ^+ARD^Q^hCmL?<8iU zktd7MuCtTntt;;g*Gl(u!*a_^g_8F~S%YwpLU^;{mxfx>?TSIE!X$zE`>Sg7#kKWU z+rg0La52;LK*Occq9iljNcuYXtw6CHNxDoZOw_Lpkh;GPHsIwM)7GiucNL#6=I*!@ z6B`+O3^F*Kf~PgjcjDR`i(b0cMAI-7f*2qH=$VC<*UBti-T?}5n3$x`-#BPgJ7;Rmn@tGaj>qHZQQVkt71PmPW zlJR(C!bH*#%^^mP`9iQVJ3Bnvz%sDAH449MJJDh$k4!I2c$p_G0KF?8x3Vs1?SUUA zqZyPPzx)2lE}IP6xeW{~Lav$7L@hLqh8E2JNMP`G1YU4+0{_qSj$1xPLlR2)qIF;C zfMytv4F6^raO-9mpUKc~mJFS<`jj7?ZCk~v4>*2nt2e9fYm0~85TCS^*GZ#iNe_CO z`qG;8Q;z_-bg$4h_2p_Y!>fmzFJm?v2%4q7$r+e1JZ=p%9|WwdZt^qS1G&F&np=&9 zNt-~64Vq_`TkSzz8MU`9uO;AO7c$V&-hF%xxEPPs4jxwXe)<8Mko0Lhf!y}_uYl+U zmx>Go?g%G*UJ*V&bSIne0xvp2I@tZ6Ag?#SIeUVwM_CIaC1H;KqDhNHt=Wv_t3Ll* z2&vD->8T=i=9LXENwD`$3jPV2X|^eh;`VxC@gE|kCAjdk#bm_iX)fE6D5nzK)Qnd> zgGB1X>;Qj;bLGD( zqVm$)pn7u>7z0?NH3X;@A+5?G@o5PaGrqX4)Vm^SzBY0KR!|7%>^J#}rnn`_(DQA5 z7y%1PLBU)UJL?OM9zHI&72Pa{k>>0NRY;P;`SOEiNp*-kErNi( z*O3f^;-S)DlL5Fm5y(>dJjuI3yXrm&ajXk9t_Kvq%npA|NH{OEv>QN_I6uT8RC=pc zK~2Dyy2Nl1otiKbC&X$=`k@PqsC|#1l*)1V&O(bX()hS6$U^Z5>Q}JhPmJXje<%$P zi%I^1oOX=qxVWDt%|R3V^X)H_{ibr`9-h4Q(;0pRI=XW~Tl)co+7yGOnd)t$*h$?gEmmoljv&Ox47b)UbPQ{nO>wWCJXF! zEK=EYnz>?_5>yJz7l2jj!1_ku-+Z9w@dN*vgx=mBE8l+-Vd0Z$h2drp^tZD zanB*FYUXcrIG(nXlvN~CGbv}dGs&MiAzt2FRSTMREtsacC-E2XS66YfyLf-vYu zHvH+|<#``*NYuE8jO`QH^3s~LSIV`hN<}&L`Td4MRqd-uPXquA^ z6v@=#O9itRuXZ!RIUclCItFhC&LofQ(COtZVVHoFDoF8eI4zxv%4Vdh6vv~D`e<$o z+ROE5_6?I99UWX;0^e$Vpj6;35ixg%k*+OTt7T)NJA2bf&HH_jDtP*?V*HT80Oh?d9)YeI=@0wW>PY_GfnM4K!%2de!G;9n2<+HJiF?C5T8yf^`J#s4kZ{W(r~ zlz0ijI;E5i~Yoek2{NxaI6;zw$?Dv zhVGA5--D<4aYvDTqRqAP(!Frw7i+c->})nY{#rbb?!3U}=>3=O>PTP#cU_P)6+e{= zG*{ZiJ|380D#hPH5-Ar7szK4PbuGNe8U{Hn@-z%W@#~K&d=9;txZSJ#n_R*u@@ee2 zh3MeplzJ-r>^dU9_m>u;4|XL)a{e?7OMZOWP{%xcO}-(6`qTD=$XJLARhPV^cA09L zu$%?;>4MtV-G6`^!rgN%Uxdjeq^a;i{`sD~h*UikU4`Cp*faiYIfW#f{hG{y$+Hkrd!NSNE_4sFcnXC@N)t0Nguh(7A&_zj!Z7b=BXaYdscQr-yy8Y6&O?>blVbJj((GD86J;cdXvy4WU@{Prp~}hac#WSg;8Y2+q+G>Y&KV(oJvk zER9TN>bJwJTm$u+KisVW-qS|Fhnw!D1d&pVmG^%bB<-X)JD04ehqH zsAc~zWr#^)cCK8w@;KNjBs85tY3W4B9`b%pZ3zS&Dsb6I=R{Q-GpcVTNN3*$&mF0d zM9E#y(3*G~OMifHhdUeRX=x=;;hUx%DAN8JNvaB54=+PsFqOuf>SOq0Xe;%*Dy;xp zxA8=omZ7Z%Wk?r+TG@)`2Ty4`RXLLyT?>?J%3_e`(N$0z>SZra#GPQL>vQgukf(yZ z5`QUk0O5SrA2>IUgMHtc<#(T&V-b}k^o745$RUCnPZHwI>pTqe7<`{9%@3aADsyFGmHBb1%`#Ek^ zJ$;r%^9Kan3_UcZ14j2i568^pGiGojL0GxlZBIdeeEQm zVPnGcM3cOiIC6qE50CU^+A9!VS~r)YeZI4+qR|BWscGzj?PV3$b2*4RJF(rrT994u7AS%f;5v_zFA-4!l9 zW0_>GX+=s6?ACkjMlknveZ4vWJ`{@Xb)Vq6ac{qEzB_KJ$*-7)`rM)U9-!&wAm<=M z94Rj;pTAHxl?>+i){Oz%CM`#~%mx5oZamXH0P0Qe^9x=y1iWqrd0qSVVe9|N*3)VS z)`7dDu^$054hN&2zr-UQVT2X)m0UiR_+iS2!zbI-IO@ciF!A>!mEQMC$uj{-hN%^z zPgu{CLVV^*e$Ek)ZhF&l4EaWt!7VjJ0pqa8t*wnxVzK!(MgYl^nEV+nn0g{Z1e~b9 z0@}KfPGpu&$VniH8pE9|D+aSOWYqNyCBQG=FM$Zf1%d&doY&qV8*6&sWUd zeCaRn93KzQPvvHEVu0=x>D$`TdtLW z+Zi3;+vjI;Meike-H71mgKQ$LDq$w!f#|I;YX*WXDbUImx*e%_d|Ya9l{U*c3{7Dy4@I{jwf)GjVJ!=mT)cE!Ic#CRPUe5oBBaZIhD@ZWsy&Yd1d!{1NpMMM%^^$>} zcm{psD1%xr#Ht$2h{de2+rRYqN?@_Znm@0}^p8+(G95jF+hsJG6sF*(2TKD6<%$-K#KVE9zKI zdsMqOcoNR2u@7N5xFS$Hn73F>*I{>k`6;gTYqMclK8!sp+QU8VaB#BSi6m2G(3E`} zVkD?7=W~r^s%p?3hpFb>3;V#-(1VhHrlLAva;)+8o-Av^ir(QndT6M-a0#jo#vmz0 zLS4>L22oDO^jFILbbrr;>32lOo%a2Y{54l7K^su%22CV^j8PBeS1NbhNJR|!&|qa- zw{+k#&&Lvf=SR~+iP{nIkGrlJCPwNNBW!-^7X5ntVL%7~JAfUuX%O;nAM0_b&qvKAGwo;K=gfF~jT%aPO1wi;BYCz2hLw+mtqld2^Lf@j6*= zgNj$kHZ1oJP4aC0x!rL0crD*R0>D?62|!MHxrXYMywCoHIFmXnmb$iY*pquGC}k3| z%S1K8HNrH@ec}-tbhO6(+uZ}xkHo`M&ajc4Wse;tgWmZiIU)QVsXPd?PSJOE+&(ww z?{FEl*L$GL!aaPu7urGL28Bl^4)LLF{ACn0{z)dn9P=ak11*E|pdx41rxazJY^br4 zo8Q$^@9@Rr{07VwzA$i(Vouo_?TC}f zZA2|w1Uql)B9~D1PUEuFM{0F~S-Jt47o;d(C$vPK3W3!h_S-W=^!x4>xMmEW$GKt! z;z}5uZ?Qk=WxlD>DsDSLfsaF}RBP9Hy;7XoF>t8>xaQSjeFNOwcmuAy-FC4>7w!Oa z5ste9+W%Ca8jF#DFg1C*1&PmX zEG($Iy6SeK>;ob^5{3C|PDt%2(aX@xQc9s4g^()1d&in-G;ZYXi1c5^_NgB!{qT*F z&tl7$X%TnPwL6TS{$j?~EmN*b8AcF}YLhrS{(Z|9rI#~bXM>5v?6pQ3@YvDQB`^*` zFiO)LU~;>HIFZ3fKnZ4fx0kvut5$-%BO~kvs{6FP^PCLr6(X$lE#&jdB>*ez+dc_1 z%Flj$?g?e<+~fqpJvE>9;iu%2m=_Vkz#@tnFQIUnA8KrUm&*443U7@G9}fwO;m6ms z!*&4S9w9~dJiPYgqn9^9F?YJW_J({+A_p7^<0H}JpT!b`9VEn=%qTO?4{ufyEJwvs zdRBw~X5r|BHJFCoQwCvmO6+M-sku+%8m5rll<6<;O19y9hSWIoP zJnNDn%?5~cmsSG^Nb5){;#_83@K*Ptzy8ukXz@$~PE-1?M*f_>>G?8`wOj0tr8jQ?`b6NC zhUm>YeJ+u*mHKHG0Q zZ2m+VpBPsFrMIO&Y$bA-z3UA*}U+hMf~2ZrFJfF_H{6Ju0A8_ zLnAX#um{`u_w?3LSFWQb*U8E&Yk0!ToX1|SUzGG&i_MD~5T$ z8rIn8%40!AG^R2|Y5bzc4w$Aj!?{3nY~i|@a52eJ+6xynJ^+=jS~VZg+ZKBE${_j8 zb&ONL&MG3O8SPCeZ1i-^RT<-^NJv`|Hu;k%&&0f4sDYWMR= z4pqQCI7X=U0{q{Cjy0dS4q4La)m=0xbs4kt(&V6!@!NM8GuvAB)E*-T(;7!|2_Kb~Qf%j@>tsjwK6t6huh z+$%oBSmWbnEKSVTX4DIbVHWT}gkh%qhaW#quknJ~=cZinVh<;@oqa;mIYH8!4{y+| zAiY@ZJ1IEN(9a~)_l^@peCNxOkJ|53{mLF}Hv$eWmtG^zruV9NFWX4E65eWNTehk7 z^A7}6;O1MH$C@|HYS3Hlif&bG_2gAWM9JMG(^TBa4)-7#q|3a&V;qpTMJ;kbkvM-) zrm;>3b$a4czv}(O0v_dViBg~JIr@SBd;gWz=Hny!#0F}k2z;}0K z`PgU3-}e9H3jGrB@JrKDg%MpPl5re@`8PP;-EVeRyJU1gZefbhdLXc&~v0Q%iO2d>Rm_a^_BbeR1 zFS`#B@Fi=2Rf_TzQ<;_9?#jk+65yJaHo|Rp2+xntId|GV5POFld=PHhhAEjtsPBi< zA;9%Ukq{#ndTh7X;;fA4Qrb1M-}s_3JN|5Km=H>@CDQNhuNK{o_Z^_prQ#SZVj524wcXo*fJ_0IaW$|!_8xH4cd@@;7# z<;`OnI;_1O-R`r)H+e6n27aFpdSM5(*hdEkrO{07&`Qd^a6b~O%GbHhT-N#vhkJw( ziOi?In@7^p)d51YoS#d8rGPm2v&c7kFUPCQ90GXlT`N#F@onMWlb^_l02Z5-<%oVZ z5;PlS41@h@4G>VDP6$s98_i9T%@hDJ@kqHG(gz&=Hu-KN zHvuWXaR;*LvFJ{4W-0ftbyl6t~@BHC2>OQ&+~wB?=J-HLsV5gBRc+ z^AHWAe>=W_ho@$+AfHm)y=N~6_T*<82$v4=4*jksdyCPW zIs*AoDx#5DtzHkxn)2JuX)0Khq`1#Sf&Tt5uCPPlBt8#*ED|>JyhUiCKGo|iZ{9(Q zhwt6rgmU-F!nKnPX|~^KUYbIBJ@2vHa$2YZNy4cSKVqy1q(*K|!;JD0*(gL@NY?oe zDiv{-%ahnO2dB6@VQ{VFTcyl68;uDg1(SuXwkC_?xJr1EY6gvUboS4bv~(BO)n81O zpFTF1DRsiBsF`JrHg!gmt`}$JGG=w+lN#0E$7T$a4As0%*;aLw(6n(sNLF=5*G%pr z@QWmM0#S@@d@!jApoYg!+6^7A{fgIZ_!tO70)J7Z`C=xleZuQas)w|U ziQUru#08BZB}F{j-Hl$ndt_H zua%Bs49)=qiGJfjL!HjX2BS{0mp#fFWwoD!9CPQ+@TqdmtjW*pFMNZNo?PP1tej3A z2|Sv}9@gn|!QUVWUFEmVO|R3^dLKj-i+iJya4Ar@^7Dw#HVYte(dc>&K=vbp%N|{f z)n~3|15fd;-ElOj8cp^ zQe)O7PCC{G!RG{|k+xnKq>go$)TpN5{dRC`Zz}?)$=QzKPvvo6^h$^|H5*ltz^uTp zOExt=gV19~f`CF~pyT1JXceBrL5kMT66fuC7FR0MVU$w1aBlS|rOSJ*4M}e7xUw&} zrBV*0XNmMUWmHJskC{-;GAz?oaqM0q^H`kAiQvFt9;!;C^*i&xOXdKnfGPHXwA^+x zxt}!w+ZH3y2Pi*1QQXC?B0J-5c;`6g!h4&fp+UwDJ&WG}8x0@Bhso1l(?$k>`Xi_` ze1U`F1QCb_O<-=&$heS(Y1hzxQuG8jQC=_0IJ@z_Y1Tgc&PrUX!v)b1@LN5~Zu9CE6EfSaj--#FTUB>l- zS)pvNo(wt-W3Fr)7bS-8+A5f7itAE`l>KBEF;6-%DroJdR{L@_x3XPBW;zUHkt=>q zP-rNFTf@@V{C5_}Dq2$vy@;mxpDr25I>Jp*bOm<~u;NPS)Qb-6$`YyQG|(FZV_ktq zno#{)x|+j051;bl!0xUlf=i&*NWK3X{~!zOBWLr?XdBR3@C;yTyrB!k?fo?WF+Kmr z-+%g1oHOy!4RFLC2fTh>Z34AdwBXJF$kW7M)OoQ0|Mf8nXW-XU>aRFl0(JFuH4*;Z zy#L^@*tCDS83vdHMUMkd-Mf1dIzQRj)p*_k96*?LaxZG zzhgg8FE_7FA!sZTPS{`33#QnJn6LBMmWrts)B@#@MNyEqPI;HQRjP3Re(*fDQVITY z2v0pRb>pfveju~x5Mh+VS?Q8=XAZ9604_(nUOr>0qO)83a{uzRnS_PNscqA{^{$@+ zfR`BS@H*T_%zx-1V1)dqeyHEOgsuedF{%xNH?F&SuL;gszV%fXlf0vYUAGXmBdvM3{Kie97B8pKD=MVg&aS?AYk#z}W4gs=q%jjX*I zoT(CZ{+uZbxgfATmSP?F zq+5TDg)oIS0y`Elb+qI(y~PtwHK>Eiwi%UYb~XF`3M_ac+C|I^{0O@zA}mH0?~H}XMXY#5V2{DGtSy6k%^ zL#W^;k*1|{4|HeA&FALm zz{X65d9S1Z19(W!nvQ48{~P7jT}fiJ|XGkIsEcJ_Ya|xxHCU z;E2a{FPO0FGyn6pJ;a2SUW~HZVy!gIQ&11y;V>h zQ5Pnf;I6?Pg1bYo;O_1a+ylYw1Sd#vcMWoI*MqyeyW7DX&hY;;Q#1G0eYh{HtGb`M zyY{NRKH1+NoFMtgwjvh=`$>)KRp>sretYve=OAm+ znx@fxLpt{yk0t+?>&dJ{>wc*Qg4e8Wv2|ew(Z*K*#p|ZGMSm{@_6Z`E-E{@~H^#-c zZde~W2luhQ>mRJ}xzuC*YgF3byvyjH7Lh)+`vC33x2@q$NM7y12!v-ze+z8jIlK$n=OLX)HawOaf@MEQJ+h&bcmFK z*&2L@m_d&tDQc#y7p}UByTVo2X|WDK9R1~C**Z(D><=~6-0Pzn6~(L8G~h| z>xf&bm&OKJjC2pC<)tvGVRvLRFxlK7eGQpQw@YKruGpA8@OJQKjr2J;yWt@h2nkDa zbk)8O4CNv?f~LJih-2o7$XMp>i{~%o-9I=me)xud<~>IkR_-mlpUj4Pu^oz-aDbvV z{KVdi7^S-tBmUN+w%ltB)R z>f)G3ShNaBOtN{_zQC~HCLCU_q8RCa9n1xFJ;n=25RTBW1p7FFES0Vxu8f|nC3jP) zjD)@Q+4qv(;Yi>XF+t|7+S;Cz&xj_)7aM0UB}@Ol*U7poPqq~!%Yt$F+A3))5)&AL zIQxgmT_td>FY&`l#iOr^gmpuhuQ$sGx!TxV_3-l$ z=Vr@ZJ11fHzC(OfGJHIB%+ef2S}`#yah{D_XTBi23ZuH|IQ`#0g(RM+$a`A-eIxot`L3gC{=EJ2T)vZ%Ju(&G^s8lU5Vgb!~AC` zJ4kq(@PTH-Qz|149ZEi!)o0ES_|Z1vF$s<;M$%4LRO*P)9Qj_zVpW+!5Tb4kdNh$0TGf2LZ03V{IQ)81z~xpB8vRP$|w{0S;S}T!7k#e z6TYU(Rl&U}b;yLUuKYk}`)mffDkfpNnU8&6{yHkx>}Nn>fH6RygN<=FW>98g6g^`; zly+>Ejh}#~fU^y2Lm_TR*Gxw$iuq2e(0^miXG74_)Ae%4tL}Lz{4)&&zTmf+CaCfR z5;_`j?O{#@pp0#M9?VMfWNQNZ$j|6T91n#xEws9fH|RhV1M1BBA=VN?0t$pf!e4$k z?B?T_o6v3&mXG%QJMNzxtZ0r{7cu9?j8e7H?JUK|h?bZvyvM&tj#UT<{l%|frE=t^ zV7jNpYFnw~b6R5WSqw8l@!?LbR^v+>+#Ogg2j_STi4c{`|Lq8LmL< zX2}Gf1(|mqa43BNe}|^KnG2P9O9MX8fNzV=?JXDBihMn(zAj(T7>%#1u_nkiCwAu{ zmoFgWzJH4@Zx8h^AVwlI2&fU~RwU9(;cXJ9zhGm2;-9L{Vbjf3HUzKjU7IKKQQ1zv z8)C&CV^Y!;%MIKBUtWPBSM%&Bjdcg{o=lVwzc4_Q@R4~1 zaLIgD93{f%I(Tj7m=Fz=2U~GaTp1L~D9GWjES#^Vb)`hV(v;{%D^yS26pqrUW(1Jz z4|LNPTy~YRO8poii8_{I@@z_Bj8JR?u`)V___SrNZXP%sPL<@F)>UGfF)DHi-MNEA zUoqcm96-=K)PG-muhToBqM8Jt{sqRh!pHj&=r&Qg3sXO*%iKfbo}NVD&Kz|3PC7;0 zlsxAz^LeZKkyq}GvLSgt?`=uS^30qYK+HJ=Qun&)uF@WcZ%WN|dv$K)U)$lPYh`mQ znY4Mj_i-2m>HxUTwTAnN$hW=^j}}VT8QuLA9P3}CjrLM zh^{f>g9yuBi`Gj_W>f1>2kXtm_YQQ!^OZ!Zg)g}yDpHw}CT;ZH1Dw|qXK@EvObsZK zk^Srkgz}A#o#s&iY0S_}uW+nfCs{%8jb$6>$|k><{>D2(!E6Kt97)FANN2eXCZJxf zfn}?!fY#aw!Mp_+Dav5fZ|jbxrI}lAVbW*6uJiiB-B_7jF{_|CxZ1*z4-_NE`(MP& zS;g_QcGS`oD{g++#?_g+g^Ek;%^*Mdlc+k+vOTo2%9Myv*L|TvyK^dyI%m@0TE+`5PB(BP4u;XJ)Gy`UrDp3>o_QJ!3aBV>$mSbONCeN5aq(+|bZKiX2A zf1DAUbN_+!ObH*dlq@n2X*_PF#~pDg0gF;99jco936k8?1_k1XtH624!I!x3sklXa za%dvgOccCh5c5eeZ0BQ>e{aft1NhB;q&pg;-sd2DSw@{?xJPx2XbE%YJ1+I~;*vK0 zyg}4|Y;f9cat-TTrX7VqLn9akLH#U)3>J4ls;VmBAm9)|o#KBOl1 z4z%+OsJSEC10Z`9KLdj2Ulc{&-^k#ysvxJ;pVN0BHCm;7r+_-Fdq{|2H-t(D8rCk? z1oc+&84!+oHX!&N=C%GPhxcM6K=sjw_U(0o*b;FxT8ziaQ5uPd^OI+pGX{uIb_I|I z_bnA}4GucL_6vzF+uGe0J{|=qP@6y&oARnVk$jqnx{=v@Wbn03x2N-)nERg8Q{#r*+@1&fT9U0@=AjTAK|=xk?ApMLI*8 zY)el|)ZoF}F-|YVLDWpSy>Fcg78$8+jfbH^Me|{&)%CSQqw@|GOuxMIYE3h>DaItbIW}Wqeh-iNe{zy~k@Y#_x4QH=EB=A3J}?%8;8)vF!h~z&=)4 z`6GaD5SVd!%(g6fKEIu5tyZDoLh97>hbGgya#tb&jDa0;GlC~n|%<@h29*3_9emL$&U-#eV`1Wl2TsR(;$qht)LB?%u~n*pkf zc7w7xP{F#gTix7!GSQxR<(LdCHe7QSD-mh8D=`2|@&T*W6Sm95H-;Kf{5U7{<*Fk! zzP{r>+R54&thzX9jU6YgcApK`cbUmw96M=v*7*38UkctxK~=fUuMi_vyc)9PX6lE{ zf&RtwHu;&%)soXn-K0&PRrQ$qOPs81m?T}V-3^NgB6Rjwqe&6`?5r@$cel>G9 zg#-Sn;O@3G@}U_!9Eeo#DT@p~vbMr#iTT!qj%F&?&OwA6gF@$CG?yAIpMsy{3CH@w zaTbf6ajf_%?j=xh*E+74LP}S$m%x+hUycdRlamPoa;Dv{3)U8_i7Zkx8T`|K@cFTS ziJamGq9L8mYp%-A&e)yuIx}%bi0HU`s0ylRj}`Vep(%!B$%x@KY*(7w##!#$imj<| z0pOzP;sey z4+7iuua=&*UU846k;JHic9K%g1+LzM^|az^*&5C;D0RP@UTycs9d#|)GJp{TL5I@u z8rx8HSKCb#*B94Ru06@vKFpcu3m2MN0ETvUcJ)uMLn@CaLh#?vbN0oK-sBjB(Q_2L z5z5IyYP@|hnqPL)Klp=H@lcy4CeCHI5ipRUKw>$h%uca2%26>OL6h`KUNqc8j47bS zposiOKHm&`LgcR&`!wAtZn7%5^8E)ZNiBM8`)^fzsl*-v1)PaL^y*;|-__G9=_vov zH_~lTG9Up#z19^cLKWa>VK}JM`fNW975CAE`gyb46oy#$($ve)=ooDD_5MyT7@Mwx zMf_Vlzt<-O1ItJez4ZWC_@wHb#SJxZ zoIklZA{f?z<|0eDb4cub`5B@MC$gJb27JqJoaXWqEm-6EW!~5m z2!isNORHy8x^OH{^3`~z9-*WL`OF`sjUs4r@u#i(W=NHCe%$2P>FQE%jp`T6OoGgu z4@n_-}l7Dg}!H!B^s%8-8eUV1M9?F@c-(L;eU6B}{U^0rkb0g8jdaifI%3 zoS6RkV|x3_3AU>;H`St1B04}uOH@)nXS}kd(eVD1?LKb~sW#LeXpA^wXhh*8Xulej zOW~lKj8yZsF$_)gAtJQNFtDeMH(M&p6YihgKM#Wy(o=qV6W)ogbuXlS!$pLjBP|!o zEKIO}j%0JCkGf>Ue$-cv3Sg&*xl)ks|69d995|kJ--Rfo{2aa zLE1WvmR;^Z`rYrpD3qrj{jCT$)8>GjQekS#Ek@t>*=`HDj9Y<9#ADS}@~Q{J3SY~` z9q4Oet?fCG+)|0wb#2YK^>BSY@)nK_kVSW&g=`J>Gm!`voTPidapSHlT5It)yh6#% zfz^IJSCq0@U|EykIlD9Nb~1h2d<{A!D~zpvkJ&Y9!^uIv zFzss-Aopy)5hnQC<(N!em8?C&_~8BKuBHnb^b8RdJn&jUFZ<;%k#8Z*iT#saUH28tcLUlv>#wvg1uySONX8a{Hs9@Mt{ z9{Kcrd-J?LegomN$OeD{7wuFQ;b2L2XiKc>=zaQA{D#dxY0e(G;3&{q74X#le9w=H z;44tthZ*_;)T|?&{0t~(+#k_usij<%nSuS>Ww1YfT{afT|MRoi3Y@%t0ryLp&_&GP zdSOca2BK$D&L|O9Zd7Bx8iR~sXoZWUrq#gWP7yB`Pq+=EB^wM64&%6e|0Ln8$M9g} zdo?PXF(Om{(C{@?q3JnE1(^YMURmWTV|7^5VhGYQLX3NfLoKrW z08i^8ryMs(u z?~jpay(=QNAP-F#O}3ag!?;!dyDil7Q+uw^dy9s68B_?fkZ6^M6?r%4ZJI(*Prgoy zHh6d4WGgh<{he+ zvfwt7205qxb4k5hlR6l~05kdUSEPioL zK_mqUZXxHWY5>$ymf#?i+)EG~eh>0;^FFLlh4F)R<)CaEc92)#NNH#I8k0znh~OW6 z#HKk-ZM&n|9OH+?2BwF~wE)(R;U{Fr)HYP`;4p@W{BrjN&x+!ml5s~jSOTFeo^6}! z7!~_Qy=n4IV!Vo0RxleSfoEYPK0DK60MbXcRo{Qf_!{^WTtRE{ThV(0fGjwGWu@#q z=7QKkc_s{;z>M{b`6-|ok<+{w;+u}rW=T|7RQ1GNbc%_Lo;;(E2#bi zVHJlkGE%&cie-O?K)<2iLSFpZUqujIp*{2sHDS0E-|HGqrXb^TAHrP<ZZ^2RP-JeFJPv3)ix@3spBvLl%3 z>|*k{PEVkn{(ajg{7nB${QW{u-IIv9Z@!lSO$R`8rxgyB7%oVKuv$h@~ zVW`@?hLC_C0`NfWdkwq`T_J0#DtP6f1=M(zz0eLL=!VL9tqQ*dll{{IXJ24{D}Va zVuJ38wiwdWHjKcb8@AZY8)~h6CAmg$V|||rNA#s!#)6*ZeCisb6|slm%1Nvlb!itP zb!v3*)koH{G0Z}s!u?}bJ_&ARk`!UJNxd)GhqX;%lq|4?H;b(k2MRar*0cuO0bvW7>4KMRdGe^R{CqCFdRh=G*4zEb`-mc z{wNaM9)uM$Pc`@x=C3voVirJEcn<$^tTo6`tYZ7}Z7ZOxvOB>o6Tw0I35D5!`?LAH z(B3eO#n&ClnD)kEqXtB!U`qLhM3EtjX!x~pME&-Lfh-SVEMV{BtCqrN$cozhVku^|Kl)f1S{5ySMs$Sf`Iet{B|LXopk3;CMaBE9h zb6xAYccibXnGfPGCXVL1`z2CGpc-oX62k2ao0Q&`yJ`vxbYcmko@&#df54YbcX<_y zq07m1q}WUjylPLB&+g{ypq13!+o@Cl5K(G=GieSs;LI*nRGDizvypq>Q^;07v`3`8 zlFK^1ja&V(I2}p0T)ht{=d`GDoUC4|JX-`RRnf34+HDnL_mhM%`i^P=8;jF)D#~SFC*ht&UN^F&6R-0c;=C%+i<&@y5+_}xAUVE{gNg) z_X3o{n4VHhcW@7%ztIt_IBc8s-mt&&Y3j#?Nb|s>N?^DXm-*;-jA zto(CAF>7UiyxbbBoQv*`hfX^@PZv6^;0(B?33Xp}cN# zk7E~0$4FzSo#6} z03LVqMYhFjjm}nFm62%ECcuxD6s47f^wq9qwG-K6q`mW|xLN~_O%h(|rq>hUq3=dh zZEkA?sDDwz)rB50xO-KtlWUA@{kM0!J7iOYuKvTma|Dm*BdcHK<#fn$)}Q4#^LM~+ zBWTC=0`0Wy9HA_7LZARM6}Hp=KOkGRXce+50D%mK;c~k$!F9F3Mbv1G8KvuM=(;(| z!=tMnb#)ivz=v1D%3ZnRd>qe0%JGus6IIeJfS=02+H~XYg)PI^vxq0`djT zq0aZ&Ja()AtVxq?)7+f!8m{TXf@;27eq0zoi7v?;g-kPkI}@}AWeN1(Eyj5 z?^M?S?XAY#V_%6YX+3IO=aYorb5{Jae1t;O|OT+|NNKG?~hR$`F0x~l*y2Zz@QaHaa zSdV`uLE<8z&eESiUH(;zqB|#Vxep_6cDxxQXn}Y;ns{*CFR|?OC%Dk~hmvBwTT4hq zi;BZn+CcIlpns;GgI3K4V%hwU>n!?zP zS{?DrCZV$vwEtj{lJDxSK7#(}Ph7QNq*?b-l7&j?C<&gnVSa&pv$ju+@v4U(_e)T6H-#31c2+;9?9J$E6( zjuCkaIuqp~@kt0(2$e~o#WSVu#q=uKB}VM9+0+zB|MPg>GjAHZxkw(2GS_`$>DtTq zQ>OI3Lk4qfMlG-V0*fVRRj_r#;FF;eoB}d;#PrSJl5jxF5Q<{`y+PPRFmiE&H=U^i zMTj>_>a1ELpBiAyIORx z*dLL|bsfgIwg_l3h>tw*8eSa7@@NR}UQ^ah( zXGFc8C2t;_4O?ARF!QPk72Q^t>b@K@KORyodIusSH6 z2)Q$c8u@qc&P4R!Jm*TLgVg6Y$C2T%TO8m$hf>f2iM5Rm=G?>}pBQ`{Zv|ocDB$m9 zXpt>E7P$*TFExI4+4Xd0m0*w=4IYybqKNQSz`4Jd${Cie{I$I{<8@-(^{={67s+Oa|9J)6fpPH$F zM&sm-a=T?cW)T9$y#x^11wi!supdEP5ZHItOF#ew`PFy}(g~ssdv&^KM!z0DfN1gZ zE)u^x`MFVFez?mxopQ7beRpUj&YV$^sCI1Eem@8( z1+d|IYk{eIfda%Q%`hZD#3$6cQTvs0`PKa3sNsa#8pP_}p8_S3O*$Kl2Pd6Ex*%iS16;Wftssxg|f#UmjQ3#O|Tqc}!esUppuzO*3ZWSVGW5R%jEcplVE zXhNh>i0XZ)99aGQc=kOu?2S}X7Kl9;E~wsXfkJ%rvrN%mi_;1HY;qa;?j-18JeQz( zK1SsICS?=S6!@XRR9=GgzLVWU{_`~!aoII7BC*7Z=b+5b{KQvTl6ZrMGo47xlE)j+g3)58ocoUOuTa7dvbT7 zSCd=65X{mx6`E~*rqy3}N}uqkF0)L^MWcp)Q$`>|$4*c<&$Y#~J__4EPe|KHX=C1A z8XBHIt*nf6PMeU4pGPdxNRH-qf;}JoXe$dt@_2S;9`xwy3AJv>i#Gu>QXS``N0&jZ zK9G>x>?y~jaf-0&tvN{jMy%pU@qH!u4 zNTE)!y!Pu4-qo129!rz2y^d_?8J^rj%}TLzsgwres!w|7^6OzCa0=5DhtUmbW(UCc zYH29d6B>eo%SOvE<;4qGSt2gTYHnTtPs)31yxD#ipDca&3qT9ht(t2*Wa1 z%&uf*pXp!5iKI2DrYnwu-#Gs^O^{>in-VnqsWZjAZ!+=r-xZrM*)(59#ru;Ns3|jk z6A4)k$2FO!*4!HWJ!v0~Q!~P!HnVgp<&d7uLuNK*l8mGoQ|c5$o#G-|nzWwOZ9-tz z+!_xv$KjD{Nvcw&SW7wrBWDDvJLLrSQ`R{vP`w@YEhGx+ctws!pY*GlA>0AZe7aI( zNm+d?J{8Vw!C6QlSVl*RxWS-k>=M1rCQr*x5lg6;kV>;Gc}0Ux-Kxu`%m1R-IYRpRR`$i%oqRW!oW0CQ?v`k~;F z@}l|)ut1Qc9PfMzL^v&8E4dK)mYAn6VU7Yp=`Znw!6YHPo9WR?WJRk6HF44;ui_(n z5TiCEj%%3^5+mmZnd34tF-xH4QKXJFchTHlvwx(gvwf=xRJT1G&hJqAS*dn=6OS|R zjF#)(qE@drZE}v^C-O=@l7>i$HKLS#EXr_Dz9AxibQTMZPVUtuF$r^A>yEJ1wz`3H zGJzzc&I#QEj_3*_mP=zgu-5kF7Iw_QOh7VB<{`wBi)({pi!Jyqz_z;~TI2zi23+(! zyomVY;&fNZ6L_7woSbD?EP0F;4$UwX@X8Xg*1BCvxe~#vaX0o5#wi)OIhSVnK5&ju?jgk*_`Y zTFt?M_2J93&7wX>)Q6Kq$qK!Hf)P0DkA8rQ#dL!ea6VQumz%KG(59kRY@A>9#M>RN$MB|g*DB1~gj zwv=>_i!+S+#K9`Jq>9pcON5%YIOcS!fAruah3C%YK-v5#l)zypBQ^p6wToUDQibNH^}7eO0XYynA!*!ZE2;#GB(REvP&nNcigMD0$3kh2)!JbkyQo(p!X>;rpP8v1FH5RRY#)P)-;AFGb@`w6%^Ulj z!Cp)ry^qs&gC4ZDxXPd7Yhi_kLo##YUDLR$H_Yi>)6?x;z@H#S|0oKyMu{IW8hOY* z-i5&ocxlf|W#$D+bglE+G@ZNY${uHl*2OUqomOqy zX9XY>Ko6C-&EhZ+=WOBJRonDssSKz#tLQUiyew7*UagojE!LcV_Jeh} zsjRq(TVUOOX2OP~ccXxYaD&WSyWzR9PB&pxj_O(leOr7I#YtFgbV^oOgZr5#Kf79s zwr7unaw>!K3o5_u33ovOhnL zJ{S@UpjSu1(Q^sIrrxMt9c#B%$;x{GS`zte(`#W@{(Jgt^2@9q3!$Z3^VuI|e=N)U z?c9TP8K9<52?A>UKw2D-mJG{?40K)|^3{Q8qZYHJL|b57fi`lFQGb;JuBfOFTiHZCA_^L4f z7rhW^erd`Jd#mzG5*@U~U-z|R|2^J)Tk6rj?T~~+elY`cvdx$XN|u7dVynFK-vR+% z+1Dni?X0*HTElN!I|I512ZJ2h!;#7!%Zz;rOe~VCs(B_BWJL|j?L2zHNneuw3)OTf zu`kqD)E7ZILcjd$aUn`vwljlEj7S`|Cj&V{(WY@ki;tHtE8bs*nK9~;v zWBYD#4+f)vN#Z9uAv*T_c(CFDFAoKQB`sSWqj+J+l}@~Hl?az>@+*>-&CpG}$L`w^ z_o}-0VZTDElo-%Ibl9pZ!RgND?bD&|haEv8AmtVeJV7A>A0Mo2d>=-h>0H7gow48# zv8Y;g-Dfose0kz|7o}CI&tp@nO25g6B+bP;T^ZGolzB=8xu?uGdX;b`3ikZ>IYn^g zhm=5LeW>a}y;5?{dzunjE!L)A$6q2=5lh{`Io`mdhB-|0-@P zjoeS9;Ep8Q8DXwFS|o|ANy4^^1n7+eJ#;1*tVOmN^4Q_fPsz{aHuakK-3Ms=7(jS@ zJ4$Ld(68XG!Iis?j5#W<^wu39mbY8iHw>0}PHAp;)>9^!w#e6*QnVEQH3X^Be{WLN zy&8f9LI%aM^%)_v+2kwk1Q4Cj#S^}-=E3|z;wPb2;XJStx0smm11)pN^e)m4Z`sm& zM>X*1Ski9kC|HB!&Y2GFoxl53(dAfl3+{sv)dt8dfN=B${IZToiR=itK_>sFOs`^! zR^!7&Hl2O6K@M%QOpLLxqK#q{N*cI?^)Rs1vN=$cd`hbEpX2w_DFVwDStRbogZFTZGS zale_qxfz0h`kprt9zaZch^Hbz$j64erKii{^kXFAv41nRutSD)WYbuRn7$qALKbsh zMq8eLEx+Z6n22QGk|MN01ns~o6?~-CWi!>9ri+JAxh`^P2R5jEkxA(liQizd5{vdt zHnV*|X{N#C{&VV-d-FST74BoW{kA()&g`!I2m`d>CX=EQJ*GP<+ap3b-!sifo3!(( zIHVVeX3MYDx8$A@RjR%CelkC{-$d?XpUWsHUc)t7O#2>sdxSqX(~l42em5A75e2TUCr`|g{Ff*WUO@rCF!A277TYImr zma`Cg^rlVGpjx+UeOx3rcJIf&cVdIs_|#dspawLJ5t#z}UhkZ$7i4*hYkL7I<5WVj zZ_${Psr3zyZLGm_nX2&yW7R=mdqYVTi4HNSd}# zT=tsk8brgVC$N0DB7e70ZG+9@so4(%u4WcmjofI?HM3-*9PoxU8joSL{PC){%|DHD z8V}>qticOo$=BB1Xy`d1RueHEMU!?SAzR*z!EMY*H*d8nk3erw4282-^~sqISmBTz z7o0dA@0!VC698Iyn+mC~Si=&EU1^AspJ0y_q^H}B;p2=!e6s&N6pXLXM-q8 zEF{tLO3iZ!k`3C1&^$wmjsOr&H+j|icH-fp!|&%=x5i(|2G9%$=r2h3n&H271j5s* z>WNuJ?vVt26_K~FeKN;?(6h=?jsLvs{BQjtW_@P=m%?RYBE|N1H^mWE^I#5+hLQp} z>`{aR=8#T1Te+69gah(cc?4yvdyp<|&bg7jdSYKLOG1%olMMOtvt69pLHZB%Qu{Bf z(HxW~abH0$Pcx|osL5F-r*_M1{9urBR2&=pMv8cRI6F#}WJsiK`Xz-CL*4DK0>0ie z*cH#d4xS?*$tk?d7xjhAS7(A*!Cy**(IvGPD6@KiEP6AOe|GOy)6d3g+~4#BWQaMK zxEr&gA37Zfw#r@|uyH+C1|)Km8L&wB>xgHe|NcR`k-;@dcL>AONMvR30kgQ|4|}jt zJ?00c2FHiumr8c7giq)AF2+l6&Fl1YyOP^Fh?}y8*LNUw!Tok%e~@5l#PLiC`ot|f zsHFC36v((F++g7Q*6Qa`+T8Z`e0M~)EBtE6(Rrsl)MP-mJRn#rWQCkKXjFl8~RZ0}jeK%&#lz8I%zVadNC^y#_R6 z(+okJ-do(RA*>e<;$WC*j-N4Dsz+o8GcZbvQU+mWDpTSxLK0KrYq_Li5623G2TE_7i`oY+pga#Gp)7=k00OMoo=LXs*P6vNK z>iX_U@%j03@~5>y`Lc88p0kS%=N?2@B-amxK!Wv2=|7D4X=f2W5Q%mky}?z4vVFr7 zv?5qwWxeUJF3d_f?LzHomQ*1~YUPEwKMnEwb4PXyi1g}tMn4rfd>2W%Aj=-R12q~g zul@W`7=G+qjfWD<-i(7T06ZYj9UR>WFJX~VfnL^DIsohpbryuZ71RxV8~%tOf3p8C z{SqOwGol{uoyvAgWE_lMV)3SzzHSA0`P(`(h4s2ttw|XA69STuh5w=we6$J_=UsZn z4~d6k&9y`A{HuSDa#t!P(-J0e09H5FXGpQqGrdt@prv?_uR~o=2Vwf*cZMooX zqOIU-UiyO0frk@;P=m^_*GPfy^NJaLNwo$0)&OH&VB3#eiP5S3Pl<6Z#P`i!-JA^z z^$U72ooIhc4@9%*+_;T|aX7$y6;RrCDEiAZ>)X@rqxdzgv>a}0Q`kgu$PB&0NW%TL zUo^pbiG9%#bU1B^``ugtIrD~EFnN@KEbgE{6tPpVwL?~C3&r~MDHK%s6p7eZ^@ znz32&$*EZQ1a5U%+$)z)lrqI^5oK_oGIJ%!t&=a%m-`OrqE&d(f)ThvW1<`EdwSOD^ z`5lafmkHFny@V?G5ec2FsUX2EJx51v+(g%6vlBjSCPLYqQE?Lv#HBn9569Wj27f1; z?h_B@ZM4MwNCpCbAG~^s)Ct2VC$Oruc^~95@&dy+*A%0DGQ`IDl>Ne~Rn0CB>nF77 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 { + return (0, util_1.jsPromiseToKew)((() => { if (!__classPrivateFieldGet(this, _ControllerBandcamp_browseController, "f")) { throw Error('Bandcamp Discover plugin is not started'); } diff --git a/bandcamp/dist/index.js.map b/bandcamp/dist/index.js.map index 497dbf1e2..961b3d981 100644 --- a/bandcamp/dist/index.js.map +++ b/bandcamp/dist/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nimport libQ from 'kew';\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nimport vconf from 'v-conf';\n\nimport bandcamp from './lib/BandcampContext';\nimport BrowseController from './lib/controller/browse';\nimport SearchController, { SearchQuery } from './lib/controller/search/SearchController';\nimport PlayController from './lib/controller/play/PlayController';\nimport { ExplodedTrackInfo } from './lib/controller/browse/view-handlers/ExplodableViewHandler';\nimport { jsPromiseToKew } from './lib/util';\nimport { RenderedPage } from './lib/controller/browse/view-handlers/ViewHandler';\nimport ViewHelper from './lib/controller/browse/view-handlers/ViewHelper';\nimport { AlbumView } from './lib/controller/browse/view-handlers/AlbumViewHandler';\nimport View from './lib/controller/browse/view-handlers/View';\nimport { BandView } from './lib/controller/browse/view-handlers/BandViewHandler';\nimport { ShowView } from './lib/controller/browse/view-handlers/ShowViewHandler';\nimport { ArticleView } from './lib/controller/browse/view-handlers/ArticleViewHandler';\nimport Model from './lib/model';\n\ninterface GotoParams extends ExplodedTrackInfo {\n type: 'album' | 'artist';\n}\n\nclass ControllerBandcamp {\n #context: any;\n #config: any;\n #commandRouter: any;\n\n #browseController: BrowseController | null;\n #searchController: SearchController | null;\n #playController: PlayController | null;\n\n constructor(context: any) {\n this.#context = context;\n this.#commandRouter = context.coreCommand;\n }\n\n getUIConfig() {\n const defer = libQ.defer();\n\n const lang_code = this.#commandRouter.sharedVars.get('language_code');\n\n const configPrepTasks = [\n this.#commandRouter.i18nJson(`${__dirname}/i18n/strings_${lang_code}.json`,\n `${__dirname}/i18n/strings_en.json`,\n `${__dirname}/UIConfig.json`)\n ];\n\n libQ.all(configPrepTasks).then((configParams: [any, string]) => {\n const [ uiconf ] = configParams;\n const generalUIConf = uiconf.sections[0];\n const myBandcampUIConf = uiconf.sections[1];\n const cacheUIConf = uiconf.sections[2];\n\n // General\n generalUIConf.content[0].value = bandcamp.getConfigValue('itemsPerPage', 47);\n generalUIConf.content[1].value = bandcamp.getConfigValue('combinedSearchResults', 17);\n generalUIConf.content[2].value = bandcamp.getConfigValue('searchByItemType', true);\n generalUIConf.content[3].value = bandcamp.getConfigValue('prefetch', true);\n\n // My Bandcamp\n const myBandcampType = bandcamp.getConfigValue('myBandcampType', 'cookie');\n const myBandcampTypeLabel = myBandcampType === 'cookie' ? bandcamp.getI18n('BANDCAMP_COOKIE') : bandcamp.getI18n('BANDCAMP_USERNAME');\n myBandcampUIConf.content[0].value = {\n value: myBandcampType,\n label: myBandcampTypeLabel\n };\n myBandcampUIConf.content[1].value = bandcamp.getConfigValue('myCookie', '');\n myBandcampUIConf.content[2].value = bandcamp.getConfigValue('myUsername', '');\n\n // Cache\n const cacheMaxEntries = bandcamp.getConfigValue('cacheMaxEntries', 5000);\n const cacheTTL = bandcamp.getConfigValue('cacheTTL', 1800);\n const cacheEntryCount = bandcamp.getCache().getEntryCount();\n cacheUIConf.content[0].value = cacheMaxEntries;\n cacheUIConf.content[1].value = cacheTTL;\n cacheUIConf.description = cacheEntryCount > 0 ? bandcamp.getI18n('BANDCAMP_CACHE_STATS', cacheEntryCount, Math.round(bandcamp.getCache().getMemoryUsageInKB()).toLocaleString()) : bandcamp.getI18n('BANDCAMP_CACHE_EMPTY');\n\n defer.resolve(uiconf);\n })\n .fail((error: any) => {\n bandcamp.getLogger().error(`[bandcamp] getUIConfig(): Cannot populate Bandcamp configuration - ${error}`);\n defer.reject(new Error());\n }\n );\n\n return defer.promise;\n }\n\n refreshUIConfig() {\n this.#commandRouter.getUIConfigOnPlugin('music_service', 'bandcamp', {}).then((config: any) => {\n this.#commandRouter.broadcastMessage('pushUiConfig', config);\n });\n }\n\n configSaveGeneralSettings(data: any) {\n const itemsPerPage = parseInt(data['itemsPerPage'], 10);\n const combinedSearchResults = parseInt(data['combinedSearchResults'], 10);\n if (!itemsPerPage) {\n bandcamp.toast('error', bandcamp.getI18n('BANDCAMP_SETTINGS_ERR_ITEMS_PER_PAGE'));\n return;\n }\n if (!combinedSearchResults) {\n bandcamp.toast('error', bandcamp.getI18n('BANDCAMP_SETTINGS_ERR_COMBINED_SEARCH_RESULTS'));\n return;\n }\n\n bandcamp.setConfigValue('itemsPerPage', itemsPerPage);\n bandcamp.setConfigValue('combinedSearchResults', combinedSearchResults);\n bandcamp.setConfigValue('searchByItemType', data.searchByItemType);\n bandcamp.setConfigValue('prefetch', data.prefetch);\n\n bandcamp.toast('success', bandcamp.getI18n('BANDCAMP_SETTINGS_SAVED'));\n }\n\n configSaveMyBandcampSettings(data: any) {\n const oldType = bandcamp.getConfigValue('myBandcampType', 'cookie');\n const oldMyCookie = bandcamp.getConfigValue('myCookie', '');\n const type = data.myBandcampType.value;\n const myCookie = data.myCookie.trim();\n bandcamp.setConfigValue('myBandcampType', type);\n bandcamp.setConfigValue('myUsername', data.myUsername.trim());\n bandcamp.setConfigValue('myCookie', myCookie);\n\n if (type === 'cookie') {\n Model.setCookie(myCookie);\n }\n else {\n Model.setCookie();\n }\n\n if (oldType !== type || (type === 'cookie' && oldMyCookie !== myCookie)) {\n bandcamp.getCache().clear();\n }\n\n bandcamp.toast('success', bandcamp.getI18n('BANDCAMP_SETTINGS_SAVED'));\n }\n\n configSaveCacheSettings(data: any) {\n const cacheMaxEntries = parseInt(data['cacheMaxEntries'], 10);\n const cacheTTL = parseInt(data['cacheTTL'], 10);\n if (cacheMaxEntries < 1000) {\n bandcamp.toast('error', bandcamp.getI18n('BANDCAMP_SETTINGS_ERR_CACHE_MAX_ENTRIES'));\n return;\n }\n if (cacheTTL < 600) {\n bandcamp.toast('error', bandcamp.getI18n('BANDCAMP_SETTINGS_ERR_CACHE_TTL'));\n return;\n }\n\n bandcamp.setConfigValue('cacheMaxEntries', cacheMaxEntries);\n bandcamp.setConfigValue('cacheTTL', cacheTTL);\n\n bandcamp.getCache().setMaxEntries(cacheMaxEntries);\n bandcamp.getCache().setTTL(cacheTTL);\n\n bandcamp.toast('success', bandcamp.getI18n('BANDCAMP_SETTINGS_SAVED'));\n this.refreshUIConfig();\n }\n\n configClearCache() {\n bandcamp.getCache().clear();\n Model.clearLibCache();\n bandcamp.toast('success', bandcamp.getI18n('BANDCAMP_CACHE_CLEARED'));\n this.refreshUIConfig();\n }\n\n onVolumioStart() {\n const configFile = this.#commandRouter.pluginManager.getConfigurationFile(this.#context, 'config.json');\n this.#config = new vconf();\n this.#config.loadFile(configFile);\n return libQ.resolve();\n }\n\n onStart() {\n bandcamp.init(this.#context, this.#config);\n\n const myBandcampType = bandcamp.getConfigValue('myBandcampType', 'cookie');\n if (myBandcampType === 'cookie') {\n const myCookie = bandcamp.getConfigValue('myCookie', '');\n if (myCookie) {\n Model.setCookie(myCookie);\n }\n }\n\n this.#browseController = new BrowseController();\n this.#searchController = new SearchController();\n this.#playController = new PlayController();\n\n this.#addToBrowseSources();\n\n return libQ.resolve();\n }\n\n onStop() {\n this.#commandRouter.volumioRemoveToBrowseSources('Bandcamp Discover');\n\n this.#browseController = null;\n this.#searchController = null;\n this.#playController?.dispose();\n this.#playController = null;\n\n Model.reset();\n bandcamp.reset();\n\n return libQ.resolve();\n }\n\n getConfigurationFiles() {\n return [ 'config.json' ];\n }\n\n #addToBrowseSources() {\n const data = {\n name: 'Bandcamp Discover',\n uri: 'bandcamp',\n plugin_type: 'music_service',\n plugin_name: 'bandcamp',\n albumart: '/albumart?sourceicon=music_service/bandcamp/dist/assets/images/bandcamp.png'\n };\n this.#commandRouter.volumioAddToBrowseSources(data);\n }\n\n handleBrowseUri(uri: string) {\n if (!this.#browseController) {\n return libQ.reject('Bandcamp Discover plugin is not started');\n }\n return jsPromiseToKew(this.#browseController.browseUri(uri));\n }\n\n explodeUri(uri: string) {\n if (!this.#browseController) {\n return libQ.reject('Bandcamp Discover plugin is not started');\n }\n return jsPromiseToKew(this.#browseController.explodeUri(uri));\n }\n\n clearAddPlayTrack(track: any) {\n if (!this.#playController) {\n return libQ.reject('Bandcamp Discover plugin is not started');\n }\n return jsPromiseToKew(this.#playController.clearAddPlayTrack(track));\n }\n\n stop() {\n if (!this.#playController) {\n return libQ.reject('Bandcamp Discover plugin is not started');\n }\n return this.#playController.stop();\n }\n\n pause() {\n if (!this.#playController) {\n return libQ.reject('Bandcamp Discover plugin is not started');\n }\n return this.#playController.pause();\n }\n\n resume() {\n if (!this.#playController) {\n return libQ.reject('Bandcamp Discover plugin is not started');\n }\n return this.#playController.resume();\n }\n\n seek(position: number) {\n if (!this.#playController) {\n return libQ.reject('Bandcamp Discover plugin is not started');\n }\n return this.#playController.seek(position);\n }\n\n next() {\n if (!this.#playController) {\n return libQ.reject('Bandcamp Discover plugin is not started');\n }\n return this.#playController.next();\n }\n\n previous() {\n if (!this.#playController) {\n return libQ.reject('Bandcamp Discover plugin is not started');\n }\n return this.#playController.previous();\n }\n\n prefetch(track: any) {\n if (!this.#playController) {\n return libQ.reject('Bandcamp Discover plugin is not started');\n }\n return jsPromiseToKew(this.#playController.prefetch(track));\n }\n\n search(query: SearchQuery) {\n if (!this.#searchController) {\n return libQ.reject('Bandcamp Discover plugin is not started');\n }\n return jsPromiseToKew(this.#searchController.search(query));\n }\n\n goto(data: GotoParams) {\n return jsPromiseToKew((async (): Promise => {\n if (!this.#browseController) {\n throw Error('Bandcamp Discover plugin is not started');\n }\n try {\n const views = ViewHelper.getViewsFromUri(data.uri);\n const trackView = views[1];\n if (!trackView) {\n return this.#browseController.browseUri('bandcamp');\n }\n let gotoView: View | null;\n if (data.type === 'album' && trackView.albumUrl) {\n gotoView = {\n name: 'album',\n albumUrl: trackView.albumUrl\n } as AlbumView;\n }\n else if (data.type === 'artist' && trackView.artistUrl) {\n gotoView = {\n name: 'band',\n bandUrl: trackView.artistUrl\n } as BandView;\n }\n else if (trackView.name === 'show' && trackView.showUrl) {\n gotoView = {\n name: 'show',\n showUrl: trackView.showUrl\n } as ShowView;\n }\n else if (trackView.name === 'article' && trackView.articleUrl) {\n gotoView = {\n name: 'article',\n articleUrl: trackView.articleUrl\n } as ArticleView;\n }\n else {\n gotoView = null;\n }\n\n if (gotoView) {\n return this.#browseController.browseUri(`bandcamp/${ViewHelper.constructUriSegmentFromView(gotoView)}`);\n }\n\n return this.#browseController.browseUri('bandcamp');\n\n }\n catch (error: any) {\n throw Error(`Failed to fetch requested info: ${error.message}`);\n }\n })());\n }\n\n saveDefaultDiscoverParams(data: any) {\n bandcamp.setConfigValue('defaultDiscoverParams', data, true);\n bandcamp.toast('success', bandcamp.getI18n('BANDCAMP_SETTINGS_SAVED'));\n }\n\n saveDefaultArticleCategory(data: any) {\n bandcamp.setConfigValue('defaultArticleCategory', data, true);\n bandcamp.toast('success', bandcamp.getI18n('BANDCAMP_SETTINGS_SAVED'));\n }\n}\n\nexport = ControllerBandcamp;\n"]} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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","sourcesContent":["// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nimport libQ from 'kew';\n// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nimport vconf from 'v-conf';\n\nimport bandcamp from './lib/BandcampContext';\nimport BrowseController from './lib/controller/browse';\nimport SearchController, { type SearchQuery } from './lib/controller/search/SearchController';\nimport PlayController from './lib/controller/play/PlayController';\nimport { type ExplodedTrackInfo } from './lib/controller/browse/view-handlers/ExplodableViewHandler';\nimport { jsPromiseToKew } from './lib/util';\nimport { type RenderedPage } from './lib/controller/browse/view-handlers/ViewHandler';\nimport ViewHelper from './lib/controller/browse/view-handlers/ViewHelper';\nimport { type AlbumView } from './lib/controller/browse/view-handlers/AlbumViewHandler';\nimport type View from './lib/controller/browse/view-handlers/View';\nimport { type BandView } from './lib/controller/browse/view-handlers/BandViewHandler';\nimport { type ShowView } from './lib/controller/browse/view-handlers/ShowViewHandler';\nimport { type ArticleView } from './lib/controller/browse/view-handlers/ArticleViewHandler';\nimport Model from './lib/model';\n\ninterface GotoParams extends ExplodedTrackInfo {\n type: 'album' | 'artist';\n}\n\nclass ControllerBandcamp {\n #context: any;\n #config: any;\n #commandRouter: any;\n\n #browseController: BrowseController | null;\n #searchController: SearchController | null;\n #playController: PlayController | null;\n\n constructor(context: any) {\n this.#context = context;\n this.#commandRouter = context.coreCommand;\n }\n\n getUIConfig() {\n const defer = libQ.defer();\n\n const lang_code = this.#commandRouter.sharedVars.get('language_code');\n\n const configPrepTasks = [\n this.#commandRouter.i18nJson(`${__dirname}/i18n/strings_${lang_code}.json`,\n `${__dirname}/i18n/strings_en.json`,\n `${__dirname}/UIConfig.json`)\n ];\n\n libQ.all(configPrepTasks).then((configParams: [any, string]) => {\n const [ uiconf ] = configParams;\n const generalUIConf = uiconf.sections[0];\n const myBandcampUIConf = uiconf.sections[1];\n const cacheUIConf = uiconf.sections[2];\n\n // General\n generalUIConf.content[0].value = bandcamp.getConfigValue('itemsPerPage', 47);\n generalUIConf.content[1].value = bandcamp.getConfigValue('combinedSearchResults', 17);\n generalUIConf.content[2].value = bandcamp.getConfigValue('searchByItemType', true);\n generalUIConf.content[3].value = bandcamp.getConfigValue('prefetch', true);\n\n // My Bandcamp\n const myBandcampType = bandcamp.getConfigValue('myBandcampType', 'cookie');\n const myBandcampTypeLabel = myBandcampType === 'cookie' ? bandcamp.getI18n('BANDCAMP_COOKIE') : bandcamp.getI18n('BANDCAMP_USERNAME');\n myBandcampUIConf.content[0].value = {\n value: myBandcampType,\n label: myBandcampTypeLabel\n };\n myBandcampUIConf.content[1].value = bandcamp.getConfigValue('myCookie', '');\n myBandcampUIConf.content[2].value = bandcamp.getConfigValue('myUsername', '');\n\n // Cache\n const cacheMaxEntries = bandcamp.getConfigValue('cacheMaxEntries', 5000);\n const cacheTTL = bandcamp.getConfigValue('cacheTTL', 1800);\n const cacheEntryCount = bandcamp.getCache().getEntryCount();\n cacheUIConf.content[0].value = cacheMaxEntries;\n cacheUIConf.content[1].value = cacheTTL;\n cacheUIConf.description = cacheEntryCount > 0 ? bandcamp.getI18n('BANDCAMP_CACHE_STATS', cacheEntryCount, Math.round(bandcamp.getCache().getMemoryUsageInKB()).toLocaleString()) : bandcamp.getI18n('BANDCAMP_CACHE_EMPTY');\n\n defer.resolve(uiconf);\n })\n .fail((error: any) => {\n bandcamp.getLogger().error(`[bandcamp] getUIConfig(): Cannot populate Bandcamp configuration - ${error}`);\n defer.reject(new Error());\n }\n );\n\n return defer.promise;\n }\n\n refreshUIConfig() {\n this.#commandRouter.getUIConfigOnPlugin('music_service', 'bandcamp', {}).then((config: any) => {\n this.#commandRouter.broadcastMessage('pushUiConfig', config);\n });\n }\n\n configSaveGeneralSettings(data: any) {\n const itemsPerPage = parseInt(data['itemsPerPage'], 10);\n const combinedSearchResults = parseInt(data['combinedSearchResults'], 10);\n if (!itemsPerPage) {\n bandcamp.toast('error', bandcamp.getI18n('BANDCAMP_SETTINGS_ERR_ITEMS_PER_PAGE'));\n return;\n }\n if (!combinedSearchResults) {\n bandcamp.toast('error', bandcamp.getI18n('BANDCAMP_SETTINGS_ERR_COMBINED_SEARCH_RESULTS'));\n return;\n }\n\n bandcamp.setConfigValue('itemsPerPage', itemsPerPage);\n bandcamp.setConfigValue('combinedSearchResults', combinedSearchResults);\n bandcamp.setConfigValue('searchByItemType', data.searchByItemType);\n bandcamp.setConfigValue('prefetch', data.prefetch);\n\n bandcamp.toast('success', bandcamp.getI18n('BANDCAMP_SETTINGS_SAVED'));\n }\n\n configSaveMyBandcampSettings(data: any) {\n const oldType = bandcamp.getConfigValue('myBandcampType', 'cookie');\n const oldMyCookie = bandcamp.getConfigValue('myCookie', '');\n const type = data.myBandcampType.value;\n const myCookie = data.myCookie.trim();\n bandcamp.setConfigValue('myBandcampType', type);\n bandcamp.setConfigValue('myUsername', data.myUsername.trim());\n bandcamp.setConfigValue('myCookie', myCookie);\n\n if (type === 'cookie') {\n Model.setCookie(myCookie);\n }\n else {\n Model.setCookie();\n }\n\n if (oldType !== type || (type === 'cookie' && oldMyCookie !== myCookie)) {\n bandcamp.getCache().clear();\n }\n\n bandcamp.toast('success', bandcamp.getI18n('BANDCAMP_SETTINGS_SAVED'));\n }\n\n configSaveCacheSettings(data: any) {\n const cacheMaxEntries = parseInt(data['cacheMaxEntries'], 10);\n const cacheTTL = parseInt(data['cacheTTL'], 10);\n if (cacheMaxEntries < 1000) {\n bandcamp.toast('error', bandcamp.getI18n('BANDCAMP_SETTINGS_ERR_CACHE_MAX_ENTRIES'));\n return;\n }\n if (cacheTTL < 600) {\n bandcamp.toast('error', bandcamp.getI18n('BANDCAMP_SETTINGS_ERR_CACHE_TTL'));\n return;\n }\n\n bandcamp.setConfigValue('cacheMaxEntries', cacheMaxEntries);\n bandcamp.setConfigValue('cacheTTL', cacheTTL);\n\n bandcamp.getCache().setMaxEntries(cacheMaxEntries);\n bandcamp.getCache().setTTL(cacheTTL);\n\n bandcamp.toast('success', bandcamp.getI18n('BANDCAMP_SETTINGS_SAVED'));\n this.refreshUIConfig();\n }\n\n configClearCache() {\n bandcamp.getCache().clear();\n Model.clearLibCache();\n bandcamp.toast('success', bandcamp.getI18n('BANDCAMP_CACHE_CLEARED'));\n this.refreshUIConfig();\n }\n\n onVolumioStart() {\n const configFile = this.#commandRouter.pluginManager.getConfigurationFile(this.#context, 'config.json');\n this.#config = new vconf();\n this.#config.loadFile(configFile);\n return libQ.resolve();\n }\n\n onStart() {\n bandcamp.init(this.#context, this.#config);\n\n const myBandcampType = bandcamp.getConfigValue('myBandcampType', 'cookie');\n if (myBandcampType === 'cookie') {\n const myCookie = bandcamp.getConfigValue('myCookie', '');\n if (myCookie) {\n Model.setCookie(myCookie);\n }\n }\n\n this.#browseController = new BrowseController();\n this.#searchController = new SearchController();\n this.#playController = new PlayController();\n\n this.#addToBrowseSources();\n\n return libQ.resolve();\n }\n\n onStop() {\n this.#commandRouter.volumioRemoveToBrowseSources('Bandcamp Discover');\n\n this.#browseController = null;\n this.#searchController = null;\n this.#playController?.dispose();\n this.#playController = null;\n\n Model.reset();\n bandcamp.reset();\n\n return libQ.resolve();\n }\n\n getConfigurationFiles() {\n return [ 'config.json' ];\n }\n\n #addToBrowseSources() {\n const data = {\n name: 'Bandcamp Discover',\n uri: 'bandcamp',\n plugin_type: 'music_service',\n plugin_name: 'bandcamp',\n albumart: '/albumart?sourceicon=music_service/bandcamp/dist/assets/images/bandcamp.png'\n };\n this.#commandRouter.volumioAddToBrowseSources(data);\n }\n\n handleBrowseUri(uri: string) {\n if (!this.#browseController) {\n return libQ.reject('Bandcamp Discover plugin is not started');\n }\n return jsPromiseToKew(this.#browseController.browseUri(uri));\n }\n\n explodeUri(uri: string) {\n if (!this.#browseController) {\n return libQ.reject('Bandcamp Discover plugin is not started');\n }\n return jsPromiseToKew(this.#browseController.explodeUri(uri));\n }\n\n clearAddPlayTrack(track: any) {\n if (!this.#playController) {\n return libQ.reject('Bandcamp Discover plugin is not started');\n }\n return jsPromiseToKew(this.#playController.clearAddPlayTrack(track));\n }\n\n stop() {\n if (!this.#playController) {\n return libQ.reject('Bandcamp Discover plugin is not started');\n }\n return this.#playController.stop();\n }\n\n pause() {\n if (!this.#playController) {\n return libQ.reject('Bandcamp Discover plugin is not started');\n }\n return this.#playController.pause();\n }\n\n resume() {\n if (!this.#playController) {\n return libQ.reject('Bandcamp Discover plugin is not started');\n }\n return this.#playController.resume();\n }\n\n seek(position: number) {\n if (!this.#playController) {\n return libQ.reject('Bandcamp Discover plugin is not started');\n }\n return this.#playController.seek(position);\n }\n\n next() {\n if (!this.#playController) {\n return libQ.reject('Bandcamp Discover plugin is not started');\n }\n return this.#playController.next();\n }\n\n previous() {\n if (!this.#playController) {\n return libQ.reject('Bandcamp Discover plugin is not started');\n }\n return this.#playController.previous();\n }\n\n prefetch(track: any) {\n if (!this.#playController) {\n return libQ.reject('Bandcamp Discover plugin is not started');\n }\n return jsPromiseToKew(this.#playController.prefetch(track));\n }\n\n search(query: SearchQuery) {\n if (!this.#searchController) {\n return libQ.reject('Bandcamp Discover plugin is not started');\n }\n return jsPromiseToKew(this.#searchController.search(query));\n }\n\n goto(data: GotoParams) {\n return jsPromiseToKew(((): Promise => {\n if (!this.#browseController) {\n throw Error('Bandcamp Discover plugin is not started');\n }\n try {\n const views = ViewHelper.getViewsFromUri(data.uri);\n const trackView = views[1];\n if (!trackView) {\n return this.#browseController.browseUri('bandcamp');\n }\n let gotoView: View | null;\n if (data.type === 'album' && trackView.albumUrl) {\n gotoView = {\n name: 'album',\n albumUrl: trackView.albumUrl\n } as AlbumView;\n }\n else if (data.type === 'artist' && trackView.artistUrl) {\n gotoView = {\n name: 'band',\n bandUrl: trackView.artistUrl\n } as BandView;\n }\n else if (trackView.name === 'show' && trackView.showUrl) {\n gotoView = {\n name: 'show',\n showUrl: trackView.showUrl\n } as ShowView;\n }\n else if (trackView.name === 'article' && trackView.articleUrl) {\n gotoView = {\n name: 'article',\n articleUrl: trackView.articleUrl\n } as ArticleView;\n }\n else {\n gotoView = null;\n }\n\n if (gotoView) {\n return this.#browseController.browseUri(`bandcamp/${ViewHelper.constructUriSegmentFromView(gotoView)}`);\n }\n\n return this.#browseController.browseUri('bandcamp');\n\n }\n catch (error: any) {\n throw Error(`Failed to fetch requested info: ${error.message}`);\n }\n })());\n }\n\n saveDefaultDiscoverParams(data: any) {\n bandcamp.setConfigValue('defaultDiscoverParams', data, true);\n bandcamp.toast('success', bandcamp.getI18n('BANDCAMP_SETTINGS_SAVED'));\n }\n\n saveDefaultArticleCategory(data: any) {\n bandcamp.setConfigValue('defaultArticleCategory', data, true);\n bandcamp.toast('success', bandcamp.getI18n('BANDCAMP_SETTINGS_SAVED'));\n }\n}\n\nexport = ControllerBandcamp;\n"]} \ No newline at end of file diff --git a/bandcamp/dist/lib/BandcampContext.d.ts b/bandcamp/dist/lib/BandcampContext.d.ts index 51a3faa66..1b5829d65 100644 --- a/bandcamp/dist/lib/BandcampContext.d.ts +++ b/bandcamp/dist/lib/BandcampContext.d.ts @@ -1,4 +1,4 @@ -import winston from 'winston'; +import type winston from 'winston'; import Cache from './util/Cache'; declare class BandcampContext { #private; diff --git a/bandcamp/dist/lib/BandcampContext.d.ts.map b/bandcamp/dist/lib/BandcampContext.d.ts.map index 36c37ca73..bfd665ba3 100644 --- a/bandcamp/dist/lib/BandcampContext.d.ts.map +++ b/bandcamp/dist/lib/BandcampContext.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"BandcampContext.d.ts","sourceRoot":"","sources":["../../src/lib/BandcampContext.ts"],"names":[],"mappings":"AAEA,OAAO,OAAO,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,MAAM,cAAc,CAAC;AAEjC,cAAM,eAAe;;;IAqBnB,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG;IAI3B,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,GAAG,CAAC;IAKvC,MAAM,CAAC,GAAG,EAAE,MAAM;IAIlB,IAAI,CAAC,aAAa,EAAE,GAAG,EAAE,YAAY,EAAE,GAAG;IAa1C,KAAK,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,SAAsB;IAIlG,SAAS,IAAI,OAAO,CAAC,MAAM;IAI3B,cAAc,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,EAAE,IAAI,UAAQ,GAAG,CAAC;IAoBhE,iBAAiB,CAAC,GAAG,EAAE,MAAM;IAI7B,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,UAAQ;IAIpD,iBAAiB;IAIjB,YAAY,IAAI,GAAG;IAInB,eAAe,IAAI,GAAG;IAItB,QAAQ;IAIR,kBAAkB,IAAI,GAAG;IAIzB,KAAK;IAiBL,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,YAAY,EAAE,GAAG,EAAE,GAAG,MAAM;IAkDpD,IAAI,kBAAkB,IAAI,GAAG,CAE5B;CACF;;AAED,wBAAqC"} \ No newline at end of file +{"version":3,"file":"BandcampContext.d.ts","sourceRoot":"","sources":["../../src/lib/BandcampContext.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;AACnC,OAAO,KAAK,MAAM,cAAc,CAAC;AAEjC,cAAM,eAAe;;;IAqBnB,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG;IAI3B,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,GAAG,CAAC;IAKvC,MAAM,CAAC,GAAG,EAAE,MAAM;IAIlB,IAAI,CAAC,aAAa,EAAE,GAAG,EAAE,YAAY,EAAE,GAAG;IAa1C,KAAK,CAAC,IAAI,EAAE,SAAS,GAAG,MAAM,GAAG,OAAO,GAAG,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,KAAK,SAAsB;IAIlG,SAAS,IAAI,OAAO,CAAC,MAAM;IAI3B,cAAc,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,YAAY,EAAE,CAAC,EAAE,IAAI,UAAQ,GAAG,CAAC;IAoBhE,iBAAiB,CAAC,GAAG,EAAE,MAAM;IAI7B,cAAc,CAAC,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,UAAQ;IAIpD,iBAAiB;IAIjB,YAAY,IAAI,GAAG;IAInB,eAAe,IAAI,GAAG;IAItB,QAAQ;IAIR,kBAAkB,IAAI,GAAG;IAIzB,KAAK;IAiBL,OAAO,CAAC,GAAG,EAAE,MAAM,EAAE,GAAG,YAAY,EAAE,GAAG,EAAE,GAAG,MAAM;IA6CpD,IAAI,kBAAkB,IAAI,GAAG,CAE5B;CACF;;AAED,wBAAqC"} \ No newline at end of file diff --git a/bandcamp/dist/lib/BandcampContext.js b/bandcamp/dist/lib/BandcampContext.js index 87a637a53..af9082ad0 100644 --- a/bandcamp/dist/lib/BandcampContext.js +++ b/bandcamp/dist/lib/BandcampContext.js @@ -13,7 +13,7 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function ( var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; -var _BandcampContext_instances, _BandcampContext_singletons, _BandcampContext_data, _BandcampContext_pluginContext, _BandcampContext_pluginConfig, _BandcampContext_i18n, _BandcampContext_i18nDefaults, _BandcampContext_i18CallbackRegistered, _BandcampContext_cache, _BandcampContext_getSingleton, _BandcampContext_loadI18n, _BandcampContext_onSystemLanguageChanged, _BandcampContext_onPlayerNameChanged; +var _BandcampContext_instances, _BandcampContext_singletons, _BandcampContext_data, _BandcampContext_pluginContext, _BandcampContext_pluginConfig, _BandcampContext_i18n, _BandcampContext_i18nDefaults, _BandcampContext_i18CallbackRegistered, _BandcampContext_cache, _BandcampContext_getSingleton, _BandcampContext_loadI18n, _BandcampContext_onSystemLanguageChanged; Object.defineProperty(exports, "__esModule", { value: true }); const string_format_1 = __importDefault(require("string-format")); const fs_extra_1 = __importDefault(require("fs-extra")); @@ -152,9 +152,6 @@ _BandcampContext_singletons = new WeakMap(), _BandcampContext_data = new WeakMap } }, _BandcampContext_onSystemLanguageChanged = function _BandcampContext_onSystemLanguageChanged() { __classPrivateFieldGet(this, _BandcampContext_instances, "m", _BandcampContext_loadI18n).call(this); -}, _BandcampContext_onPlayerNameChanged = function _BandcampContext_onPlayerNameChanged() { - this.delete('deviceInfo'); - this.toast('warning', 'Detected change in system settings. Please restart plugin for changes to take effect.'); }; exports.default = new BandcampContext(); //# sourceMappingURL=BandcampContext.js.map \ No newline at end of file diff --git a/bandcamp/dist/lib/BandcampContext.js.map b/bandcamp/dist/lib/BandcampContext.js.map index 462d90d0a..a072b2529 100644 --- a/bandcamp/dist/lib/BandcampContext.js.map +++ b/bandcamp/dist/lib/BandcampContext.js.map @@ -1 +1 @@ -{"version":3,"file":"BandcampContext.js","sourceRoot":"","sources":["../../src/lib/BandcampContext.ts"],"names":[],"mappings":"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","sourcesContent":["import format from 'string-format';\nimport fs from 'fs-extra';\nimport winston from 'winston';\nimport Cache from './util/Cache';\n\nclass BandcampContext {\n\n #singletons: Record;\n #data: Record;\n #pluginContext?: any;\n #pluginConfig?: any;\n\n #i18n: Record>;\n #i18nDefaults: Record>;\n #i18CallbackRegistered: boolean;\n\n #cache: Cache;\n\n constructor() {\n this.#singletons = {};\n this.#data = {};\n this.#i18n = {};\n this.#i18nDefaults = {};\n this.#i18CallbackRegistered = false;\n }\n\n set(key: string, value: any) {\n this.#data[key] = value;\n }\n\n get(key: string, defaultValue: T): T\n get(key: string, defaultValue?: T): T | null {\n return (this.#data[key] !== undefined) ? this.#data[key] : (defaultValue || null);\n }\n\n delete(key: string) {\n delete this.#data[key];\n }\n\n init(pluginContext: any, pluginConfig: any) {\n this.#pluginContext = pluginContext;\n this.#pluginConfig = pluginConfig;\n\n this.#loadI18n();\n if (!this.#i18CallbackRegistered) {\n this.#pluginContext.coreCommand.sharedVars.registerCallback('language_code', this.#onSystemLanguageChanged.bind(this));\n this.#i18CallbackRegistered = true;\n }\n\n this.#cache = new Cache(this.getConfigValue('cacheTTL', 1800), this.getConfigValue('cacheMaxEntries', 5000));\n }\n\n toast(type: 'success' | 'info' | 'error' | 'warning', message: string, title = 'Bandcamp Discover') {\n this.#pluginContext.coreCommand.pushToastMessage(type, title, message);\n }\n\n getLogger(): winston.Logger {\n return this.#pluginContext.logger;\n }\n\n getConfigValue(key: string, defaultValue: T, json = false): T {\n if (this.#pluginConfig.has(key)) {\n const val = this.#pluginConfig.get(key);\n if (json) {\n try {\n return JSON.parse(val);\n }\n catch (e) {\n return defaultValue;\n }\n }\n else {\n return val;\n }\n }\n else {\n return defaultValue;\n }\n }\n\n deleteConfigValue(key: string) {\n this.#pluginConfig.delete(key);\n }\n\n setConfigValue(key: string, value: any, json = false) {\n this.#pluginConfig.set(key, json ? JSON.stringify(value) : value);\n }\n\n getAlbumArtPlugin() {\n return this.#getSingleton('albumArtPlugin', () => this.#pluginContext.coreCommand.pluginManager.getPlugin('miscellanea', 'albumart'));\n }\n\n getMpdPlugin(): any {\n return this.#getSingleton('mpdPlugin', () => this.#pluginContext.coreCommand.pluginManager.getPlugin('music_service', 'mpd'));\n }\n\n getStateMachine(): any {\n return this.#pluginContext.coreCommand.stateMachine;\n }\n\n getCache() {\n return this.#cache;\n }\n\n getPlaylistManager(): any {\n return this.#pluginContext.coreCommand.playListManager;\n }\n\n reset() {\n this.#pluginContext = null;\n this.#pluginConfig = null;\n\n this.#singletons = {};\n this.#data = {};\n\n this.#cache.clear();\n }\n\n #getSingleton(key: string, getValue: () => any): any {\n if (this.#singletons[key] == undefined) {\n this.#singletons[key] = getValue();\n }\n return this.#singletons[key];\n }\n\n getI18n(key: string, ...formatValues: any[]): string {\n let str;\n if (key.indexOf('.') > 0) {\n const mainKey = key.split('.')[0];\n const secKey = key.split('.')[1];\n str = (this.#i18n[mainKey] as Record)?.[secKey] ||\n (this.#i18nDefaults[mainKey] as Record)?.[secKey] ||\n key;\n }\n else {\n str = (this.#i18n[key] || this.#i18nDefaults[key] || key) as string;\n }\n\n if (str && formatValues.length) {\n str = format(str, ...formatValues);\n }\n\n return str;\n }\n\n #loadI18n() {\n if (this.#pluginContext) {\n const i18nPath = `${__dirname}/../i18n`;\n\n try {\n this.#i18nDefaults = fs.readJsonSync(`${i18nPath}/strings_en.json`);\n }\n catch (e) {\n this.#i18nDefaults = {};\n }\n\n try {\n const language_code = this.#pluginContext.coreCommand.sharedVars.get('language_code');\n this.#i18n = fs.readJsonSync(`${i18nPath}/strings_${language_code}.json`);\n }\n catch (e) {\n this.#i18n = this.#i18nDefaults;\n }\n }\n }\n\n #onSystemLanguageChanged() {\n this.#loadI18n();\n }\n\n #onPlayerNameChanged() {\n this.delete('deviceInfo');\n this.toast('warning', 'Detected change in system settings. Please restart plugin for changes to take effect.');\n }\n\n get volumioCoreCommand(): any {\n return this.#pluginContext?.coreCommand || null;\n }\n}\n\nexport default new BandcampContext();\n"]} \ No newline at end of file +{"version":3,"file":"BandcampContext.js","sourceRoot":"","sources":["../../src/lib/BandcampContext.ts"],"names":[],"mappings":"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","sourcesContent":["import format from 'string-format';\nimport fs from 'fs-extra';\nimport type winston from 'winston';\nimport Cache from './util/Cache';\n\nclass BandcampContext {\n\n #singletons: Record;\n #data: Record;\n #pluginContext?: any;\n #pluginConfig?: any;\n\n #i18n: Record>;\n #i18nDefaults: Record>;\n #i18CallbackRegistered: boolean;\n\n #cache: Cache;\n\n constructor() {\n this.#singletons = {};\n this.#data = {};\n this.#i18n = {};\n this.#i18nDefaults = {};\n this.#i18CallbackRegistered = false;\n }\n\n set(key: string, value: any) {\n this.#data[key] = value;\n }\n\n get(key: string, defaultValue: T): T\n get(key: string, defaultValue?: T): T | null {\n return (this.#data[key] !== undefined) ? this.#data[key] : (defaultValue || null);\n }\n\n delete(key: string) {\n delete this.#data[key];\n }\n\n init(pluginContext: any, pluginConfig: any) {\n this.#pluginContext = pluginContext;\n this.#pluginConfig = pluginConfig;\n\n this.#loadI18n();\n if (!this.#i18CallbackRegistered) {\n this.#pluginContext.coreCommand.sharedVars.registerCallback('language_code', this.#onSystemLanguageChanged.bind(this));\n this.#i18CallbackRegistered = true;\n }\n\n this.#cache = new Cache(this.getConfigValue('cacheTTL', 1800), this.getConfigValue('cacheMaxEntries', 5000));\n }\n\n toast(type: 'success' | 'info' | 'error' | 'warning', message: string, title = 'Bandcamp Discover') {\n this.#pluginContext.coreCommand.pushToastMessage(type, title, message);\n }\n\n getLogger(): winston.Logger {\n return this.#pluginContext.logger;\n }\n\n getConfigValue(key: string, defaultValue: T, json = false): T {\n if (this.#pluginConfig.has(key)) {\n const val = this.#pluginConfig.get(key);\n if (json) {\n try {\n return JSON.parse(val);\n }\n catch (e) {\n return defaultValue;\n }\n }\n else {\n return val;\n }\n }\n else {\n return defaultValue;\n }\n }\n\n deleteConfigValue(key: string) {\n this.#pluginConfig.delete(key);\n }\n\n setConfigValue(key: string, value: any, json = false) {\n this.#pluginConfig.set(key, json ? JSON.stringify(value) : value);\n }\n\n getAlbumArtPlugin() {\n return this.#getSingleton('albumArtPlugin', () => this.#pluginContext.coreCommand.pluginManager.getPlugin('miscellanea', 'albumart'));\n }\n\n getMpdPlugin(): any {\n return this.#getSingleton('mpdPlugin', () => this.#pluginContext.coreCommand.pluginManager.getPlugin('music_service', 'mpd'));\n }\n\n getStateMachine(): any {\n return this.#pluginContext.coreCommand.stateMachine;\n }\n\n getCache() {\n return this.#cache;\n }\n\n getPlaylistManager(): any {\n return this.#pluginContext.coreCommand.playListManager;\n }\n\n reset() {\n this.#pluginContext = null;\n this.#pluginConfig = null;\n\n this.#singletons = {};\n this.#data = {};\n\n this.#cache.clear();\n }\n\n #getSingleton(key: string, getValue: () => any): any {\n if (this.#singletons[key] == undefined) {\n this.#singletons[key] = getValue();\n }\n return this.#singletons[key];\n }\n\n getI18n(key: string, ...formatValues: any[]): string {\n let str;\n if (key.indexOf('.') > 0) {\n const mainKey = key.split('.')[0];\n const secKey = key.split('.')[1];\n str = (this.#i18n[mainKey] as Record)?.[secKey] ||\n (this.#i18nDefaults[mainKey] as Record)?.[secKey] ||\n key;\n }\n else {\n str = (this.#i18n[key] || this.#i18nDefaults[key] || key) as string;\n }\n\n if (str && formatValues.length) {\n str = format(str, ...formatValues);\n }\n\n return str;\n }\n\n #loadI18n() {\n if (this.#pluginContext) {\n const i18nPath = `${__dirname}/../i18n`;\n\n try {\n this.#i18nDefaults = fs.readJsonSync(`${i18nPath}/strings_en.json`);\n }\n catch (e) {\n this.#i18nDefaults = {};\n }\n\n try {\n const language_code = this.#pluginContext.coreCommand.sharedVars.get('language_code');\n this.#i18n = fs.readJsonSync(`${i18nPath}/strings_${language_code}.json`);\n }\n catch (e) {\n this.#i18n = this.#i18nDefaults;\n }\n }\n }\n\n #onSystemLanguageChanged() {\n this.#loadI18n();\n }\n\n get volumioCoreCommand(): any {\n return this.#pluginContext?.coreCommand || null;\n }\n}\n\nexport default new BandcampContext();\n"]} \ No newline at end of file diff --git a/bandcamp/dist/lib/controller/browse/index.d.ts b/bandcamp/dist/lib/controller/browse/index.d.ts index 3f124ec7d..89dfaebaf 100644 --- a/bandcamp/dist/lib/controller/browse/index.d.ts +++ b/bandcamp/dist/lib/controller/browse/index.d.ts @@ -1,5 +1,5 @@ -import { ExplodedTrackInfo } from './view-handlers/ExplodableViewHandler'; -import { RenderedPage } from './view-handlers/ViewHandler'; +import { type ExplodedTrackInfo } from './view-handlers/ExplodableViewHandler'; +import { type RenderedPage } from './view-handlers/ViewHandler'; export default class BrowseController { #private; browseUri(uri: string): Promise; @@ -8,6 +8,7 @@ export default class BrowseController { * - track[@trackUrl=...] * - album[@albumUrl=...] * - shows[@showUrl=...] + * - discover[@...] */ explodeUri(uri: string): Promise; } diff --git a/bandcamp/dist/lib/controller/browse/index.d.ts.map b/bandcamp/dist/lib/controller/browse/index.d.ts.map index bb04bc6a7..d2024f09f 100644 --- a/bandcamp/dist/lib/controller/browse/index.d.ts.map +++ b/bandcamp/dist/lib/controller/browse/index.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/lib/controller/browse/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AAE1E,OAAO,EAAE,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAG3D,MAAM,CAAC,OAAO,OAAO,gBAAgB;;IAkB7B,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAOnD;;;;;OAKG;IACH,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;CAUtD"} \ No newline at end of file +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/lib/controller/browse/index.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,uCAAuC,CAAC;AAE/E,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,6BAA6B,CAAC;AAGhE,MAAM,CAAC,OAAO,OAAO,gBAAgB;;IAkB7B,SAAS,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,CAAC;IAOnD;;;;;;OAMG;IACH,UAAU,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC,iBAAiB,EAAE,CAAC;CAUtD"} \ No newline at end of file diff --git a/bandcamp/dist/lib/controller/browse/index.js b/bandcamp/dist/lib/controller/browse/index.js index 476a4d0d1..071f51336 100644 --- a/bandcamp/dist/lib/controller/browse/index.js +++ b/bandcamp/dist/lib/controller/browse/index.js @@ -20,13 +20,13 @@ class BrowseController { * - If nothing follows 'bandcamp', the view would be 'root'. * * After 'bandcamp/', the uri consists of segments representing the following views: - * - discover[@genre=...][@subgenre=...][@sortBy=...][@artistRecommendationType=...][@location=...][@format=...][@time=...][@pageRef=...] + * - discover[@genre=...][@subgenre=...][@sortBy=...][@location=...][@category=...][@time=...][@customTags=...][@pageRef=...] * - album[@albumUrl=...] * - search[@query=...][@itemType=...][@pageRef=...] * - band[@bandUrl=...][band.type==='label': @view=artists|discography][@pageRef=...]* * - track[@trackUrl=...] * - shows[@showUrl=...|@pageRef=...][@view=tracks|albums] - * - tag[@tagUrl=...][@select=...][@format=...][@location=...][@sort=...][@pageRef=...] + * - tag * - fan[@username=...][@view=collection|wishlist|followingArtistsAndLabels|followingGenres][@pageRef=...] * * *Replaces obsolete 'artist' and 'label' views @@ -41,6 +41,7 @@ class BrowseController { * - track[@trackUrl=...] * - album[@albumUrl=...] * - shows[@showUrl=...] + * - discover[@...] */ explodeUri(uri) { BandcampContext_1.default.getLogger().info(`[bandcamp-browse] explodeUri: ${uri}`); @@ -48,8 +49,8 @@ class BrowseController { return handler.explode(); } } -exports.default = BrowseController; _BrowseController_instances = new WeakSet(), _BrowseController_getHandler = function _BrowseController_getHandler(uri) { return ViewHandlerFactory_1.default.getHandler(uri); }; +exports.default = BrowseController; //# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/bandcamp/dist/lib/controller/browse/index.js.map b/bandcamp/dist/lib/controller/browse/index.js.map index 7a981ee58..d6242a510 100644 --- a/bandcamp/dist/lib/controller/browse/index.js.map +++ b/bandcamp/dist/lib/controller/browse/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/lib/controller/browse/index.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,4EAA6C;AAK7C,4FAAoE;AAEpE,MAAqB,gBAAgB;IAArC;;IAyCA,CAAC;IAvCC;;;;;;;;;;;;;;;OAeG;IACH,KAAK,CAAC,SAAS,CAAC,GAAW;QACzB,yBAAQ,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,gCAAgC,GAAG,EAAE,CAAC,CAAC;QAEjE,MAAM,OAAO,GAAG,uBAAA,IAAI,iEAAY,MAAhB,IAAI,EAAa,GAAG,CAAC,CAAC;QACtC,OAAO,OAAO,CAAC,MAAM,EAAE,CAAC;IAC1B,CAAC;IAED;;;;;OAKG;IACH,UAAU,CAAC,GAAW;QACpB,yBAAQ,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,iCAAiC,GAAG,EAAE,CAAC,CAAC;QAElE,MAAM,OAAO,GAAG,uBAAA,IAAI,iEAAY,MAAhB,IAAI,EAAa,GAAG,CAAC,CAAC;QACtC,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;CAKF;AAzCD,mCAyCC;kHAH6B,GAAW;IACrC,OAAO,4BAAkB,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;AAC5C,CAAC","sourcesContent":["import bandcamp from '../../BandcampContext';\nimport BaseViewHandler from './view-handlers/BaseViewHandler';\nimport { ExplodedTrackInfo } from './view-handlers/ExplodableViewHandler';\nimport View from './view-handlers/View';\nimport { RenderedPage } from './view-handlers/ViewHandler';\nimport ViewHandlerFactory from './view-handlers/ViewHandlerFactory';\n\nexport default class BrowseController {\n\n /*\n * Uri follows a hierarchical view structure, starting with 'bandcamp'.\n * - If nothing follows 'bandcamp', the view would be 'root'.\n *\n * After 'bandcamp/', the uri consists of segments representing the following views:\n * - discover[@genre=...][@subgenre=...][@sortBy=...][@artistRecommendationType=...][@location=...][@format=...][@time=...][@pageRef=...]\n * - album[@albumUrl=...]\n * - search[@query=...][@itemType=...][@pageRef=...]\n * - band[@bandUrl=...][band.type==='label': @view=artists|discography][@pageRef=...]*\n * - track[@trackUrl=...]\n * - shows[@showUrl=...|@pageRef=...][@view=tracks|albums]\n * - tag[@tagUrl=...][@select=...][@format=...][@location=...][@sort=...][@pageRef=...]\n * - fan[@username=...][@view=collection|wishlist|followingArtistsAndLabels|followingGenres][@pageRef=...]\n *\n * *Replaces obsolete 'artist' and 'label' views\n */\n async browseUri(uri: string): Promise {\n bandcamp.getLogger().info(`[bandcamp-browse] browseUri: ${uri}`);\n\n const handler = this.#getHandler(uri);\n return handler.browse();\n }\n\n /**\n * Explodable uris:\n * - track[@trackUrl=...]\n * - album[@albumUrl=...]\n * - shows[@showUrl=...]\n */\n explodeUri(uri: string): Promise {\n bandcamp.getLogger().info(`[bandcamp-browse] explodeUri: ${uri}`);\n\n const handler = this.#getHandler(uri);\n return handler.explode();\n }\n\n #getHandler(uri: string): BaseViewHandler {\n return ViewHandlerFactory.getHandler(uri);\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/lib/controller/browse/index.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,4EAA6C;AAK7C,4FAAoE;AAEpE,MAAqB,gBAAgB;IAArC;;IA0CA,CAAC;IAxCC;;;;;;;;;;;;;;;OAeG;IACH,KAAK,CAAC,SAAS,CAAC,GAAW;QACzB,yBAAQ,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,gCAAgC,GAAG,EAAE,CAAC,CAAC;QAEjE,MAAM,OAAO,GAAG,uBAAA,IAAI,iEAAY,MAAhB,IAAI,EAAa,GAAG,CAAC,CAAC;QACtC,OAAO,OAAO,CAAC,MAAM,EAAE,CAAC;IAC1B,CAAC;IAED;;;;;;OAMG;IACH,UAAU,CAAC,GAAW;QACpB,yBAAQ,CAAC,SAAS,EAAE,CAAC,IAAI,CAAC,iCAAiC,GAAG,EAAE,CAAC,CAAC;QAElE,MAAM,OAAO,GAAG,uBAAA,IAAI,iEAAY,MAAhB,IAAI,EAAa,GAAG,CAAC,CAAC;QACtC,OAAO,OAAO,CAAC,OAAO,EAAE,CAAC;IAC3B,CAAC;CAKF;kHAH6B,GAAW;IACrC,OAAO,4BAAkB,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;AAC5C,CAAC;kBAzCkB,gBAAgB","sourcesContent":["import bandcamp from '../../BandcampContext';\nimport type BaseViewHandler from './view-handlers/BaseViewHandler';\nimport { type ExplodedTrackInfo } from './view-handlers/ExplodableViewHandler';\nimport type View from './view-handlers/View';\nimport { type RenderedPage } from './view-handlers/ViewHandler';\nimport ViewHandlerFactory from './view-handlers/ViewHandlerFactory';\n\nexport default class BrowseController {\n\n /*\n * Uri follows a hierarchical view structure, starting with 'bandcamp'.\n * - If nothing follows 'bandcamp', the view would be 'root'.\n *\n * After 'bandcamp/', the uri consists of segments representing the following views:\n * - discover[@genre=...][@subgenre=...][@sortBy=...][@location=...][@category=...][@time=...][@customTags=...][@pageRef=...]\n * - album[@albumUrl=...]\n * - search[@query=...][@itemType=...][@pageRef=...]\n * - band[@bandUrl=...][band.type==='label': @view=artists|discography][@pageRef=...]*\n * - track[@trackUrl=...]\n * - shows[@showUrl=...|@pageRef=...][@view=tracks|albums]\n * - tag\n * - fan[@username=...][@view=collection|wishlist|followingArtistsAndLabels|followingGenres][@pageRef=...]\n *\n * *Replaces obsolete 'artist' and 'label' views\n */\n async browseUri(uri: string): Promise {\n bandcamp.getLogger().info(`[bandcamp-browse] browseUri: ${uri}`);\n\n const handler = this.#getHandler(uri);\n return handler.browse();\n }\n\n /**\n * Explodable uris:\n * - track[@trackUrl=...]\n * - album[@albumUrl=...]\n * - shows[@showUrl=...]\n * - discover[@...]\n */\n explodeUri(uri: string): Promise {\n bandcamp.getLogger().info(`[bandcamp-browse] explodeUri: ${uri}`);\n\n const handler = this.#getHandler(uri);\n return handler.explode();\n }\n\n #getHandler(uri: string): BaseViewHandler {\n return ViewHandlerFactory.getHandler(uri);\n }\n}\n"]} \ No newline at end of file diff --git a/bandcamp/dist/lib/controller/browse/view-handlers/AlbumViewHandler.d.ts b/bandcamp/dist/lib/controller/browse/view-handlers/AlbumViewHandler.d.ts index 98ce7c5fd..aae66dcbb 100644 --- a/bandcamp/dist/lib/controller/browse/view-handlers/AlbumViewHandler.d.ts +++ b/bandcamp/dist/lib/controller/browse/view-handlers/AlbumViewHandler.d.ts @@ -1,11 +1,12 @@ import ExplodableViewHandler from './ExplodableViewHandler'; -import View from './View'; -import { RenderedPage } from './ViewHandler'; +import type View from './View'; +import { type RenderedPage } from './ViewHandler'; export interface AlbumView extends View { name: 'album'; albumUrl: string; track?: string; artistUrl?: string; + trackId?: string; } export default class AlbumViewHandler extends ExplodableViewHandler { #private; diff --git a/bandcamp/dist/lib/controller/browse/view-handlers/AlbumViewHandler.d.ts.map b/bandcamp/dist/lib/controller/browse/view-handlers/AlbumViewHandler.d.ts.map index 6c7061a5e..9b42e61b7 100644 --- a/bandcamp/dist/lib/controller/browse/view-handlers/AlbumViewHandler.d.ts.map +++ b/bandcamp/dist/lib/controller/browse/view-handlers/AlbumViewHandler.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"AlbumViewHandler.d.ts","sourceRoot":"","sources":["../../../../../src/lib/controller/browse/view-handlers/AlbumViewHandler.ts"],"names":[],"mappings":"AAIA,OAAO,qBAAqB,MAAM,yBAAyB,CAAC;AAC5D,OAAO,IAAI,MAAM,QAAQ,CAAC;AAC1B,OAAO,EAAgB,YAAY,EAAwB,MAAM,eAAe,CAAC;AAKjF,MAAM,WAAW,SAAU,SAAQ,IAAI;IACrC,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,CAAC,OAAO,OAAO,gBAAiB,SAAQ,qBAAqB,CAAC,SAAS,CAAC;;IAEtE,MAAM,IAAI,OAAO,CAAC,YAAY,CAAC;cAUrB,WAAW,CAAC,QAAQ,EAAE,MAAM;IAoFtC,kBAAkB;CAkBzB"} \ No newline at end of file +{"version":3,"file":"AlbumViewHandler.d.ts","sourceRoot":"","sources":["../../../../../src/lib/controller/browse/view-handlers/AlbumViewHandler.ts"],"names":[],"mappings":"AAIA,OAAO,qBAAqB,MAAM,yBAAyB,CAAC;AAC5D,OAAO,KAAK,IAAI,MAAM,QAAQ,CAAC;AAC/B,OAAO,EAAqB,KAAK,YAAY,EAA6B,MAAM,eAAe,CAAC;AAKhG,MAAM,WAAW,SAAU,SAAQ,IAAI;IACrC,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,KAAK,CAAC,EAAE,MAAM,CAAC;IAEf,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,CAAC,OAAO,OAAO,gBAAiB,SAAQ,qBAAqB,CAAC,SAAS,CAAC;;IAEtE,MAAM,IAAI,OAAO,CAAC,YAAY,CAAC;cAUrB,WAAW,CAAC,QAAQ,EAAE,MAAM;IAoFtC,kBAAkB;CAkBzB"} \ No newline at end of file diff --git a/bandcamp/dist/lib/controller/browse/view-handlers/AlbumViewHandler.js b/bandcamp/dist/lib/controller/browse/view-handlers/AlbumViewHandler.js index ae0e7ad09..3deeb77a4 100644 --- a/bandcamp/dist/lib/controller/browse/view-handlers/AlbumViewHandler.js +++ b/bandcamp/dist/lib/controller/browse/view-handlers/AlbumViewHandler.js @@ -82,7 +82,6 @@ class AlbumViewHandler extends ExplodableViewHandler_1.default { return albumTracks || []; } } -exports.default = AlbumViewHandler; _AlbumViewHandler_instances = new WeakSet(), _AlbumViewHandler_addArtistLink = async function _AlbumViewHandler_addArtistLink(nav, artistUrl) { if (!nav || !artistUrl) { return; @@ -117,4 +116,5 @@ _AlbumViewHandler_instances = new WeakSet(), _AlbumViewHandler_addArtistLink = a nav.lists.unshift(linksList); } }; +exports.default = AlbumViewHandler; //# sourceMappingURL=AlbumViewHandler.js.map \ No newline at end of file diff --git a/bandcamp/dist/lib/controller/browse/view-handlers/AlbumViewHandler.js.map b/bandcamp/dist/lib/controller/browse/view-handlers/AlbumViewHandler.js.map index d1713c682..2ae80f027 100644 --- a/bandcamp/dist/lib/controller/browse/view-handlers/AlbumViewHandler.js.map +++ b/bandcamp/dist/lib/controller/browse/view-handlers/AlbumViewHandler.js.map @@ -1 +1 @@ -{"version":3,"file":"AlbumViewHandler.js","sourceRoot":"","sources":["../../../../../src/lib/controller/browse/view-handlers/AlbumViewHandler.ts"],"names":[],"mappings":"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","sourcesContent":["import bandcamp from '../../../BandcampContext';\nimport { ModelType } from '../../../model';\nimport UIHelper, { UILink } from '../../../util/UIHelper';\nimport { BandView } from './BandViewHandler';\nimport ExplodableViewHandler from './ExplodableViewHandler';\nimport View from './View';\nimport { RenderedList, RenderedPage, RenderedPageContents } from './ViewHandler';\nimport ViewHelper from './ViewHelper';\nimport { RendererType } from './renderers';\nimport { RenderedListItem } from './renderers/BaseRenderer';\n\nexport interface AlbumView extends View {\n name: 'album';\n albumUrl: string;\n track?: string;\n // For explode track URIs (used by `goto()`)\n artistUrl?: string;\n}\n\nexport default class AlbumViewHandler extends ExplodableViewHandler {\n\n async browse(): Promise {\n const albumUrl = this.currentView.albumUrl;\n\n if (!albumUrl) {\n throw Error('Album URL missing');\n }\n\n return this.browseAlbum(albumUrl);\n }\n\n protected async browseAlbum(albumUrl: string) {\n const model = this.getModel(ModelType.Album);\n const albumRenderer = this.getRenderer(RendererType.Album);\n const trackRenderer = this.getRenderer(RendererType.Track);\n\n const albumInfo = await model.getAlbum(albumUrl);\n\n const trackItems = albumInfo.tracks?.reduce((result, track) => {\n const parsed = trackRenderer.renderToListItem({...track, type: 'track'});\n if (parsed) {\n result.push(parsed);\n }\n return result;\n }, []);\n\n const header = albumRenderer.renderToHeader(albumInfo);\n\n const page: RenderedPage = {\n navigation: {\n prev: { uri: this.constructPrevUri() },\n info: header,\n lists: [ {\n availableListViews: [ 'list' ],\n items: trackItems || []\n } ]\n }\n };\n\n await this.#addArtistLink(page.navigation, albumInfo.artist?.url);\n\n const link: UILink = {\n url: albumUrl,\n text: bandcamp.getI18n('BANDCAMP_VIEW_LINK_ALBUM'),\n icon: { type: 'bandcamp' },\n target: '_blank'\n };\n if (page.navigation?.lists) {\n if (page.navigation?.lists.length > 1) { // Artist link added\n page.navigation.lists[1].title = UIHelper.constructListTitleWithLink('', link, false);\n }\n else {\n page.navigation.lists[0].title = UIHelper.constructListTitleWithLink('', link, true);\n }\n }\n\n return page;\n }\n\n async #addArtistLink(nav?: RenderedPageContents, artistUrl?: string) {\n if (!nav || !artistUrl) {\n return;\n }\n\n // Check if we're coming from band view.\n // If not, include artist link.\n const comingFrom = this.previousViews[this.previousViews.length - 1]?.name;\n if (comingFrom !== 'band') {\n const model = this.getModel(ModelType.Band);\n const bandInfo = await model.getBand(artistUrl);\n if (!bandInfo.url) {\n return;\n }\n const bandView: BandView = {\n name: 'band',\n bandUrl: bandInfo.url\n };\n const artistLinkItem: RenderedListItem = {\n service: 'bandcamp',\n type: 'item-no-menu',\n icon: 'fa fa-user',\n title: bandcamp.getI18n('BANDCAMP_MORE_FROM', bandInfo.name),\n uri: `${this.uri}/${ViewHelper.constructUriSegmentFromView(bandView)}`\n };\n const linksList: RenderedList = {\n availableListViews: [ 'list' ],\n items: [ artistLinkItem ]\n };\n if (!nav.lists) {\n nav.lists = [];\n }\n nav.lists.unshift(linksList);\n }\n }\n\n async getTracksOnExplode() {\n const albumUrl = this.currentView.albumUrl;\n\n if (!albumUrl) {\n throw Error('No albumUrl specified');\n }\n\n const model = this.getModel(ModelType.Album);\n const albumInfo = await model.getAlbum(albumUrl);\n const albumTracks = albumInfo.tracks;\n const trackPosition = this.currentView.track;\n\n if (albumTracks && trackPosition) {\n return albumTracks[parseInt(trackPosition, 10) - 1] || [];\n }\n\n return albumTracks || [];\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"AlbumViewHandler.js","sourceRoot":"","sources":["../../../../../src/lib/controller/browse/view-handlers/AlbumViewHandler.ts"],"names":[],"mappings":"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","sourcesContent":["import bandcamp from '../../../BandcampContext';\nimport { ModelType } from '../../../model';\nimport UIHelper, { type UILink } from '../../../util/UIHelper';\nimport { type BandView } from './BandViewHandler';\nimport ExplodableViewHandler from './ExplodableViewHandler';\nimport type View from './View';\nimport { type RenderedList, type RenderedPage, type RenderedPageContents } from './ViewHandler';\nimport ViewHelper from './ViewHelper';\nimport { RendererType } from './renderers';\nimport { type RenderedListItem } from './renderers/BaseRenderer';\n\nexport interface AlbumView extends View {\n name: 'album';\n albumUrl: string;\n track?: string;\n // For explode track URIs (used by `goto()`)\n artistUrl?: string;\n trackId?: string;\n}\n\nexport default class AlbumViewHandler extends ExplodableViewHandler {\n\n async browse(): Promise {\n const albumUrl = this.currentView.albumUrl;\n\n if (!albumUrl) {\n throw Error('Album URL missing');\n }\n\n return this.browseAlbum(albumUrl);\n }\n\n protected async browseAlbum(albumUrl: string) {\n const model = this.getModel(ModelType.Album);\n const albumRenderer = this.getRenderer(RendererType.Album);\n const trackRenderer = this.getRenderer(RendererType.Track);\n\n const albumInfo = await model.getAlbum(albumUrl);\n\n const trackItems = albumInfo.tracks?.reduce((result, track) => {\n const parsed = trackRenderer.renderToListItem({...track, type: 'track'});\n if (parsed) {\n result.push(parsed);\n }\n return result;\n }, []);\n\n const header = albumRenderer.renderToHeader(albumInfo);\n\n const page: RenderedPage = {\n navigation: {\n prev: { uri: this.constructPrevUri() },\n info: header,\n lists: [ {\n availableListViews: [ 'list' ],\n items: trackItems || []\n } ]\n }\n };\n\n await this.#addArtistLink(page.navigation, albumInfo.artist?.url);\n\n const link: UILink = {\n url: albumUrl,\n text: bandcamp.getI18n('BANDCAMP_VIEW_LINK_ALBUM'),\n icon: { type: 'bandcamp' },\n target: '_blank'\n };\n if (page.navigation?.lists) {\n if (page.navigation?.lists.length > 1) { // Artist link added\n page.navigation.lists[1].title = UIHelper.constructListTitleWithLink('', link, false);\n }\n else {\n page.navigation.lists[0].title = UIHelper.constructListTitleWithLink('', link, true);\n }\n }\n\n return page;\n }\n\n async #addArtistLink(nav?: RenderedPageContents, artistUrl?: string) {\n if (!nav || !artistUrl) {\n return;\n }\n\n // Check if we're coming from band view.\n // If not, include artist link.\n const comingFrom = this.previousViews[this.previousViews.length - 1]?.name;\n if (comingFrom !== 'band') {\n const model = this.getModel(ModelType.Band);\n const bandInfo = await model.getBand(artistUrl);\n if (!bandInfo.url) {\n return;\n }\n const bandView: BandView = {\n name: 'band',\n bandUrl: bandInfo.url\n };\n const artistLinkItem: RenderedListItem = {\n service: 'bandcamp',\n type: 'item-no-menu',\n icon: 'fa fa-user',\n title: bandcamp.getI18n('BANDCAMP_MORE_FROM', bandInfo.name),\n uri: `${this.uri}/${ViewHelper.constructUriSegmentFromView(bandView)}`\n };\n const linksList: RenderedList = {\n availableListViews: [ 'list' ],\n items: [ artistLinkItem ]\n };\n if (!nav.lists) {\n nav.lists = [];\n }\n nav.lists.unshift(linksList);\n }\n }\n\n async getTracksOnExplode() {\n const albumUrl = this.currentView.albumUrl;\n\n if (!albumUrl) {\n throw Error('No albumUrl specified');\n }\n\n const model = this.getModel(ModelType.Album);\n const albumInfo = await model.getAlbum(albumUrl);\n const albumTracks = albumInfo.tracks;\n const trackPosition = this.currentView.track;\n\n if (albumTracks && trackPosition) {\n return albumTracks[parseInt(trackPosition, 10) - 1] || [];\n }\n\n return albumTracks || [];\n }\n}\n"]} \ No newline at end of file diff --git a/bandcamp/dist/lib/controller/browse/view-handlers/ArticleViewHandler.d.ts b/bandcamp/dist/lib/controller/browse/view-handlers/ArticleViewHandler.d.ts index f440b28c3..eddf6e660 100644 --- a/bandcamp/dist/lib/controller/browse/view-handlers/ArticleViewHandler.d.ts +++ b/bandcamp/dist/lib/controller/browse/view-handlers/ArticleViewHandler.d.ts @@ -1,6 +1,6 @@ -import TrackEntity from '../../../entities/TrackEntity'; -import View from './View'; -import { RenderedPage } from './ViewHandler'; +import type TrackEntity from '../../../entities/TrackEntity'; +import type View from './View'; +import { type RenderedPage } from './ViewHandler'; import ExplodableViewHandler from './ExplodableViewHandler'; export interface ArticleView extends View { name: 'article'; diff --git a/bandcamp/dist/lib/controller/browse/view-handlers/ArticleViewHandler.d.ts.map b/bandcamp/dist/lib/controller/browse/view-handlers/ArticleViewHandler.d.ts.map index 02c15be30..7f12e3256 100644 --- a/bandcamp/dist/lib/controller/browse/view-handlers/ArticleViewHandler.d.ts.map +++ b/bandcamp/dist/lib/controller/browse/view-handlers/ArticleViewHandler.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"ArticleViewHandler.d.ts","sourceRoot":"","sources":["../../../../../src/lib/controller/browse/view-handlers/ArticleViewHandler.ts"],"names":[],"mappings":"AAIA,OAAO,WAAW,MAAM,+BAA+B,CAAC;AAGxD,OAAO,IAAI,MAAM,QAAQ,CAAC;AAC1B,OAAO,EAAgB,YAAY,EAAE,MAAM,eAAe,CAAC;AAI3D,OAAO,qBAAqB,MAAM,yBAAyB,CAAC;AAU5D,MAAM,WAAW,WAAY,SAAQ,IAAI;IACvC,IAAI,EAAE,SAAS,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,4BAA6B,SAAQ,WAAW;IAExD,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,CAAC,OAAO,OAAO,kBAAmB,SAAQ,qBAAqB,CAAC,WAAW,CAAC;;IAEhF,MAAM,IAAI,OAAO,CAAC,YAAY,CAAC;IA2YzB,kBAAkB,IAAI,OAAO,CAAC,4BAA4B,GAAG,4BAA4B,EAAE,CAAC;IAgElG;;;;;OAKG;IACH,SAAS,CAAC,WAAW,CAAC,KAAK,EAAE,4BAA4B,GAAG,MAAM,GAAG,IAAI;CAsB1E"} \ No newline at end of file +{"version":3,"file":"ArticleViewHandler.d.ts","sourceRoot":"","sources":["../../../../../src/lib/controller/browse/view-handlers/ArticleViewHandler.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,WAAW,MAAM,+BAA+B,CAAC;AAG7D,OAAO,KAAK,IAAI,MAAM,QAAQ,CAAC;AAC/B,OAAO,EAAqB,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AAIrE,OAAO,qBAAqB,MAAM,yBAAyB,CAAC;AAU5D,MAAM,WAAW,WAAY,SAAQ,IAAI;IACvC,IAAI,EAAE,SAAS,CAAC;IAChB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,MAAM,CAAC,EAAE,OAAO,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,UAAU,4BAA6B,SAAQ,WAAW;IAExD,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,MAAM,CAAC,OAAO,OAAO,kBAAmB,SAAQ,qBAAqB,CAAC,WAAW,CAAC;;IAEhF,MAAM,IAAI,OAAO,CAAC,YAAY,CAAC;IA2YzB,kBAAkB,IAAI,OAAO,CAAC,4BAA4B,GAAG,4BAA4B,EAAE,CAAC;IAgElG;;;;;OAKG;IACH,SAAS,CAAC,WAAW,CAAC,KAAK,EAAE,4BAA4B,GAAG,MAAM,GAAG,IAAI;CAsB1E"} \ No newline at end of file diff --git a/bandcamp/dist/lib/controller/browse/view-handlers/ArticleViewHandler.js b/bandcamp/dist/lib/controller/browse/view-handlers/ArticleViewHandler.js index fe91eff19..55ce94939 100644 --- a/bandcamp/dist/lib/controller/browse/view-handlers/ArticleViewHandler.js +++ b/bandcamp/dist/lib/controller/browse/view-handlers/ArticleViewHandler.js @@ -15,13 +15,23 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? ( }) : function(o, v) { o["default"] = v; }); -var __importStar = (this && this.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; -}; +var __importStar = (this && this.__importStar) || (function () { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + __setModuleDefault(result, mod); + return result; + }; +})(); var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); @@ -139,7 +149,6 @@ class ArticleViewHandler extends ExplodableViewHandler_1.default { return uri; } } -exports.default = ArticleViewHandler; _ArticleViewHandler_instances = new WeakSet(), _ArticleViewHandler_browseList = async function _ArticleViewHandler_browseList() { const category = await __classPrivateFieldGet(this, _ArticleViewHandler_instances, "m", _ArticleViewHandler_getCategoryFromUriOrDefault).call(this); if (!category.url) { @@ -475,4 +484,5 @@ _ArticleViewHandler_instances = new WeakSet(), _ArticleViewHandler_browseList = } }; }; +exports.default = ArticleViewHandler; //# sourceMappingURL=ArticleViewHandler.js.map \ No newline at end of file diff --git a/bandcamp/dist/lib/controller/browse/view-handlers/ArticleViewHandler.js.map b/bandcamp/dist/lib/controller/browse/view-handlers/ArticleViewHandler.js.map index 7a38734ba..c2ca8767f 100644 --- a/bandcamp/dist/lib/controller/browse/view-handlers/ArticleViewHandler.js.map +++ b/bandcamp/dist/lib/controller/browse/view-handlers/ArticleViewHandler.js.map @@ -1 +1 @@ -{"version":3,"file":"ArticleViewHandler.js","sourceRoot":"","sources":["../../../../../src/lib/controller/browse/view-handlers/ArticleViewHandler.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,+EAAgD;AAIhD,0CAA2C;AAC3C,mEAAqE;AAGrE,2CAA2C;AAE3C,8DAAsC;AACtC,oFAA4D;AAK5D,MAAM,oBAAoB,GAAG;IAC3B,GAAG,EAAE,KAAK;IACV,IAAI,EAAE,gBAAgB;CACvB,CAAC;AAiBF,MAAqB,kBAAmB,SAAQ,+BAAkC;IAAlF;;;IAyeA,CAAC;IAveC,MAAM;QACJ,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC;QAC9B,IAAI,IAAI,CAAC,UAAU,EAAE;YACnB,OAAO,uBAAA,IAAI,wEAAe,MAAnB,IAAI,EAAgB,IAAI,CAAC,UAAU,CAAC,CAAC;SAC7C;aACI,IAAI,IAAI,CAAC,MAAM,EAAE;YACpB,OAAO,uBAAA,IAAI,2EAAkB,MAAtB,IAAI,CAAoB,CAAC;SACjC;QAED,OAAO,uBAAA,IAAI,qEAAY,MAAhB,IAAI,CAAc,CAAC;IAE5B,CAAC;IAgYD,KAAK,CAAC,kBAAkB;QACtB,MAAM,UAAU,GAAG,IAAI,CAAC,WAAW,CAAC,UAAU,CAAC;QAC/C,IAAI,CAAC,UAAU,EAAE;YACf,MAAM,KAAK,CAAC,0BAA0B,CAAC,CAAC;SACzC;QAED,MAAM,cAAc,GAAG,CAAC,KAAkB,EAAE,OAAsB,EAAE,SAA4D,EAAE,EAAE;YAClI,MAAM,MAAM,GAAiC;gBAC3C,GAAG,KAAK;gBACR,UAAU,EAAE,OAAO,CAAC,GAAG;gBACvB,YAAY,EAAE,SAAS,CAAC,YAAY;aACrC,CAAC;YAEF,mCAAmC;YACnC,MAAM,CAAC,SAAS,GAAG,SAAS,CAAC,SAAS,CAAC;YACvC,OAAO,MAAM,CAAC,MAAM,CAAC;YACrB,IAAI,SAAS,CAAC,MAAM,EAAE;gBACpB,MAAM,CAAC,MAAM,GAAG,SAAS,CAAC,MAAM,CAAC;aAClC;YACD,IAAI,SAAS,CAAC,IAAI,KAAK,OAAO,EAAE;gBAC9B,MAAM,CAAC,KAAK,GAAG;oBACb,IAAI,EAAE,OAAO;oBACb,IAAI,EAAE,SAAS,CAAC,IAAI;oBACpB,GAAG,EAAE,SAAS,CAAC,GAAG;iBACnB,CAAC;aACH;YAED,OAAO,MAAM,CAAC;QAChB,CAAC,CAAC;QAEF,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,iBAAS,CAAC,OAAO,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;QAC9E,MAAM,EAAE,YAAY,EAAE,KAAK,EAAE,GAAG,IAAI,CAAC,WAAW,CAAC;QACjD,IAAI,YAAY,IAAI,KAAK,EAAE;YACzB,MAAM,aAAa,GAAG,QAAQ,CAAC,KAAK,EAAE,EAAE,CAAC,CAAC;YAC1C,gEAAgE;YAChE,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,YAAY,KAAK,YAAY,CAAC,CAAC;YACrF,IAAI,SAAS,EAAE,IAAI,KAAK,OAAO,EAAE;gBAC/B,MAAM,KAAK,GAAG,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,KAAK,aAAa,CAAC,CAAC;gBAC5E,IAAI,KAAK,EAAE;oBACT,OAAO,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC;iBAClD;aACF;YACD,YAAY;YACZ,OAAO,EAAE,CAAC;SACX;QAED,6BAA6B;QAC7B,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,EAAE,MAAM,CAAiC,CAAC,MAAM,EAAE,SAAS,EAAE,EAAE;YAC9F,IAAI,KAAK,CAAC;YACV,IAAI,SAAS,CAAC,IAAI,KAAK,OAAO,EAAE;gBAC9B,KAAK,GAAG,SAAS,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,IAAI,SAAS,CAAC,qBAAqB,CAAC,CAAC;aACxF;iBACI,IAAI,SAAS,CAAC,IAAI,KAAK,OAAO,EAAE;gBACnC,KAAK,GAAG,SAAS,CAAC;aACnB;YACD,IAAI,KAAK,EAAE;gBACT,MAAM,CAAC,IAAI,CAAC,cAAc,CAAC,KAAK,EAAE,OAAO,EAAE,SAAS,CAAC,CAAC,CAAC;aACxD;YACD,OAAO,MAAM,CAAC;QAChB,CAAC,EAAE,EAAE,CAAC,CAAC;QAEP,OAAO,MAAM,IAAI,EAAE,CAAC;IACtB,CAAC;IAED;;;;;OAKG;IACO,WAAW,CAAC,KAAmC;QACvD,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,EAAE,GAAG,IAAI,IAAI,CAAC;QAC5C,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,EAAE,GAAG,IAAI,SAAS,CAAC;QAE/C,MAAM,WAAW,GAAgB;YAC/B,IAAI,EAAE,SAAS;YACf,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,YAAY,EAAE,KAAK,CAAC,YAAY;YAChC,KAAK,EAAE,KAAK,CAAC,QAAQ,EAAE,QAAQ,EAAE;SAClC,CAAC;QAEF,IAAI,SAAS,EAAE;YACb,WAAW,CAAC,SAAS,GAAG,SAAS,CAAC;SACnC;QACD,IAAI,QAAQ,EAAE;YACZ,WAAW,CAAC,QAAQ,GAAG,QAAQ,CAAC;SACjC;QAED,MAAM,GAAG,GAAG,YAAY,oBAAU,CAAC,2BAA2B,CAAC,WAAW,CAAC,EAAE,CAAC;QAE9E,OAAO,GAAG,CAAC;IACb,CAAC;CACF;AAzeD,qCAyeC;gFA1dC,KAAK;IACH,MAAM,QAAQ,GAAG,MAAM,uBAAA,IAAI,sFAA6B,MAAjC,IAAI,CAA+B,CAAC;IAC3D,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE;QACjB,MAAM,KAAK,CAAC,sBAAsB,CAAC,CAAC;KACrC;IACD,MAAM,KAAK,GAAmB,CAAE,uBAAA,IAAI,wEAAe,MAAnB,IAAI,EAAgB,QAAQ,CAAC,CAAE,CAAC;IAChE,MAAM,WAAW,GAAG,MAAM,uBAAA,IAAI,yEAAgB,MAApB,IAAI,EAAiB,QAAQ,CAAC,GAAG,CAAC,CAAC;IAC7D,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;IAExB,OAAO;QACL,UAAU,EAAE;YACV,IAAI,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,gBAAgB,EAAE,EAAE;YACtC,KAAK;SACN;KACF,CAAC;AACJ,CAAC,oDAED,KAAK;IACH,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,WAAW,CAAC;IACjD,IAAI,WAAW,KAAK,oBAAoB,CAAC,GAAG,EAAE;QAC5C,OAAO,oBAAoB,CAAC;KAC7B;IAED,IAAI,WAAW,EAAE;QACf,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,iBAAS,CAAC,OAAO,CAAC,CAAC,oBAAoB,EAAE,CAAC;QACvF,MAAM,QAAQ,GAAG,uBAAA,IAAI,iFAAwB,MAA5B,IAAI,EAAyB,WAAW,EAAE,gBAAgB,CAAC,CAAC;QAC7E,IAAI,QAAQ,EAAE;YACZ,OAAO,QAAQ,CAAC;SACjB;KACF;IAED,OAAO,yBAAQ,CAAC,cAAc,CAAC,wBAAwB,EAAE,oBAAoB,EAAE,IAAI,CAAC,CAAC;AACvF,CAAC,mGAEuB,WAAmB,EAAE,QAAkC;IAC7E,KAAK,MAAM,OAAO,IAAI,QAAQ,EAAE;QAC9B,IAAI,OAAO,CAAC,QAAQ,EAAE;YACpB,MAAM,MAAM,GAAG,uBAAA,IAAI,iFAAwB,MAA5B,IAAI,EAAyB,WAAW,EAAE,OAAO,CAAC,QAAQ,CAAC,CAAC;YAC3E,IAAI,MAAM,EAAE;gBACV,OAAO,MAAM,CAAC;aACf;SACF;aACI,IAAI,OAAO,CAAC,UAAU,EAAE;YAC3B,MAAM,MAAM,GAAG,OAAO,CAAC,UAAU,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,CAAC,GAAG,KAAK,WAAW,CAAC,CAAC;YACnF,IAAI,MAAM,EAAE;gBACV,OAAO,MAAM,CAAC;aACf;SACF;KACF;IACD,OAAO,IAAI,CAAC;AACd,CAAC,iFAEc,QAAyB;IACtC,MAAM,YAAY,GAAG;iCACQ,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC;;;;;;0GAMiD,CAAC;IACvG,MAAM,cAAc,GAAW;QAC7B,GAAG,EAAE,GAAG;QACR,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE;QACxC,IAAI,EAAE,yBAAQ,CAAC,OAAO,CAAC,uCAAuC,CAAC;QAC/D,OAAO,EAAE,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;KACvE,CAAC;IACF,MAAM,KAAK,GAAG,kBAAQ,CAAC,0BAA0B,CAAC,kBAAQ,CAAC,0BAA0B,CAAC,yBAAQ,CAAC,OAAO,CAAC,gBAAgB,CAAC,CAAC,EAAE,cAAc,EAAE,IAAI,CAAC,CAAC;IACjJ,MAAM,UAAU,GAAiB;QAC/B,KAAK;QACL,kBAAkB,EAAE,CAAE,MAAM,CAAE;QAC9B,KAAK,EAAE,EAAE;KACV,CAAC;IACF,MAAM,YAAY,GAAG,QAAQ,CAAC,GAAG,KAAK,oBAAoB,CAAC,GAAG,CAAC,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,yBAAQ,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC;IAC7H,UAAU,CAAC,KAAK,CAAC,IAAI,CAAC;QACpB,OAAO,EAAE,UAAU;QACnB,IAAI,EAAE,cAAc;QACpB,KAAK,EAAE,YAAY;QACnB,IAAI,EAAE,cAAc;QACpB,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,kBAAkB;KACnC,CAAC,CAAC;IACH,OAAO,UAAU,CAAC;AACpB,CAAC,uCAED,KAAK,6CAAiB,WAAmB;IACvC,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC;IAC9B,MAAM,WAAW,GAAkC;QACjD,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,yBAAQ,CAAC,cAAc,CAAC,iBAAiB,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,yBAAQ,CAAC,cAAc,CAAC,cAAc,EAAE,EAAE,CAAC;KACpH,CAAC;IAEF,IAAI,IAAI,CAAC,OAAO,EAAE;QAChB,WAAW,CAAC,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;QAC/C,WAAW,CAAC,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;KAClD;IAED,IAAI,WAAW,KAAK,oBAAoB,CAAC,GAAG,EAAE;QAC5C,WAAW,CAAC,WAAW,GAAG,WAAW,CAAC;KACvC;IAED,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,iBAAS,CAAC,OAAO,CAAC,CAAC,WAAW,CAAC,WAAW,CAAC,CAAC;IACpF,MAAM,eAAe,GAAG,IAAI,CAAC,WAAW,CAAC,wBAAY,CAAC,OAAO,CAAC,CAAC;IAC/D,MAAM,SAAS,GAAG,WAAW,CAAC,KAAK,CAAC,MAAM,CAAqB,CAAC,MAAM,EAAE,OAAO,EAAE,EAAE;QACjF,MAAM,QAAQ,GAAG,eAAe,CAAC,gBAAgB,CAAC,OAAO,CAAC,CAAC;QAC3D,IAAI,QAAQ,EAAE;YACZ,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;SACvB;QACD,OAAO,MAAM,CAAC;IAChB,CAAC,EAAE,EAAE,CAAC,CAAC;IACP,MAAM,WAAW,GAAG,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,aAAa,EAAE,WAAW,CAAC,cAAc,CAAC,CAAC;IACjG,IAAI,WAAW,EAAE;QACf,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC;QACnD,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC,CAAC;KACrD;IAED,OAAO;QACL,kBAAkB,EAAE,CAAE,MAAM,EAAE,MAAM,CAAE;QACtC,KAAK,EAAE,SAAS;KACjB,CAAC;AACJ,CAAC,yCAED,KAAK;IACH,MAAM,eAAe,GAAG,MAAM,uBAAA,IAAI,sFAA6B,MAAjC,IAAI,CAA+B,CAAC;IAClE,MAAM,SAAS,GAAiB;QAC9B,KAAK,EAAE,kBAAQ,CAAC,kBAAkB,CAAC,cAAc,EAAE,yBAAQ,CAAC,OAAO,CAAC,6BAA6B,CAAC,CAAC;QACnG,kBAAkB,EAAE,CAAE,MAAM,CAAE;QAC9B,KAAK,EAAE,EAAE;KACV,CAAC;IACF,IAAI,kBAAkB,GAAG,yBAAQ,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC;IACrE,MAAM,eAAe,GAAG,eAAe,CAAC,GAAG,KAAK,oBAAoB,CAAC,GAAG,CAAC;IACzE,IAAI,eAAe,EAAE;QACnB,kBAAkB,GAAG,kBAAQ,CAAC,SAAS,CAAC,kBAAkB,EAAE,oBAAS,CAAC,kBAAkB,CAAC,CAAC;KAC3F;IACD,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC;QACnB,OAAO,EAAE,UAAU;QACnB,IAAI,EAAE,cAAc;QACpB,KAAK,EAAE,kBAAkB;QACzB,IAAI,EAAE,eAAe,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI;QAC5C,GAAG,EAAE,uBAAA,IAAI,sFAA6B,MAAjC,IAAI,EAA8B,oBAAoB,CAAC,GAAG,CAAC;KACjE,CAAC,CAAC;IAEH,MAAM,gBAAgB,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,iBAAS,CAAC,OAAO,CAAC,CAAC,oBAAoB,EAAE,CAAC;IACvF,MAAM,KAAK,GAAG,uBAAA,IAAI,2FAAkC,MAAtC,IAAI,EAAmC,gBAAgB,EAAE,eAAe,CAAC,CAAC;IACxF,KAAK,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;IAEzB,OAAO;QACL,UAAU,EAAE;YACV,IAAI,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,gBAAgB,EAAE,EAAE;YACtC,KAAK;SACN;KACF,CAAC;AACJ,CAAC,uHAEiC,QAAkC,EAAE,eAAgC,EAAE,QAAwB,EAAE;IAChI,QAAQ,CAAC,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC3B,IAAI,OAAO,CAAC,QAAQ,EAAE;YACpB,uBAAA,IAAI,2FAAkC,MAAtC,IAAI,EAAmC,OAAO,CAAC,QAAQ,EAAE,eAAe,EAAE,KAAK,CAAC,CAAC;SAClF;aACI,IAAI,OAAO,CAAC,UAAU,EAAE;YAC3B,MAAM,YAAY,GAAiB;gBACjC,KAAK,EAAE,OAAO,CAAC,KAAK;gBACpB,kBAAkB,EAAE,CAAE,MAAM,CAAE;gBAC9B,KAAK,EAAE,EAAE;aACV,CAAC;YACF,OAAO,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;gBACtC,IAAI,QAAQ,CAAC,GAAG,EAAE;oBAChB,MAAM,UAAU,GAAG,eAAe,CAAC,CAAC,CAAC,eAAe,CAAC,GAAG,KAAK,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,KAAK,CAAC;oBAClF,IAAI,KAAK,GAAG,QAAQ,CAAC,IAAI,CAAC;oBAC1B,IAAI,UAAU,EAAE;wBACd,KAAK,GAAG,kBAAQ,CAAC,SAAS,CAAC,KAAK,EAAE,oBAAS,CAAC,kBAAkB,CAAC,CAAC;qBACjE;oBACD,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC;wBACtB,OAAO,EAAE,UAAU;wBACnB,IAAI,EAAE,cAAc;wBACpB,KAAK;wBACL,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI;wBACvC,GAAG,EAAE,uBAAA,IAAI,sFAA6B,MAAjC,IAAI,EAA8B,QAAQ,CAAC,GAAG,CAAC;qBACrD,CAAC,CAAC;iBACJ;YACH,CAAC,CAAC,CAAC;YAEH,KAAK,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC;SAC1B;IACH,CAAC,CAAC,CAAC;IAEH,OAAO,KAAK,CAAC;AACf,CAAC,6GAE4B,WAAmB;IAC9C,MAAM,UAAU,GAAG,EAAE,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;IAE3C,IAAI,UAAU,CAAC,WAAW,KAAK,WAAW,EAAE;QAC1C,OAAO,UAAU,CAAC,OAAO,CAAC;QAC1B,OAAO,UAAU,CAAC,YAAY,CAAC;QAC/B,IAAI,WAAW,EAAE;YACf,UAAU,CAAC,WAAW,GAAG,WAAW,CAAC;SACtC;aACI;YACH,OAAO,UAAU,CAAC,WAAW,CAAC;SAC/B;KACF;IACD,OAAO,UAAU,CAAC,MAAM,CAAC;IAEzB,OAAO,oBAAU,CAAC,qBAAqB,CAAC,CAAE,GAAG,IAAI,CAAC,aAAa,EAAE,UAAU,CAAE,CAAC,CAAC;AACjF,CAAC,sCAED,KAAK,4CAAgB,UAAkB;IACrC,MAAM,OAAO,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,iBAAS,CAAC,OAAO,CAAC,CAAC,UAAU,CAAC,UAAU,CAAC,CAAC;IAE9E,OAAO;QACL,UAAU,EAAE;YACV,IAAI,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,gBAAgB,EAAE,EAAE;YACtC,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,wBAAY,CAAC,OAAO,CAAC,CAAC,cAAc,CAAC,OAAO,CAAC;YACpE,KAAK,EAAE,uBAAA,IAAI,iFAAwB,MAA5B,IAAI,EAAyB,OAAO,CAAC;SAC7C;KACF,CAAC;AACJ,CAAC,mGAEuB,OAAsB;IAC5C,8DAA8D;IAC9D,8DAA8D;IAC9D,gEAAgE;IAChE,iEAAiE;IACjE,8BAA8B;IAC9B,MAAM,eAAe,GAAG,IAAI,CAAC,WAAW,CAAC,wBAAY,CAAC,OAAO,CAAC,CAAC;IAC/D,MAAM,iBAAiB,GAAG,OAAO,CAAC,UAAU,EAAE,MAAM,KAAK,CAAC,CAAC;IAC3D,MAAM,KAAK,GAAmB,EAAE,CAAC;IAEjC,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,EAAE;QAC/D,MAAM,WAAW,GAAG,WAAW,CAAC,YAAY,GAAG,CAAC,CAAC,CAAC;QAClD,IAAI,SAAS,GAAuB,EAAE,CAAC;QACvC,IAAI,KAAK,GAAG,EAAE,CAAC;QAEf,4CAA4C;QAC5C,IAAI,YAAY,KAAK,CAAC,EAAE;YACtB,MAAM,eAAe,GAAW;gBAC9B,GAAG,EAAE,OAAO,CAAC,GAAG;gBAChB,IAAI,EAAE,yBAAQ,CAAC,OAAO,CAAC,4BAA4B,CAAC;gBACpD,IAAI,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE;gBAC1B,MAAM,EAAE,QAAQ;aACjB,CAAC;YACF,KAAK,GAAG,kBAAQ,CAAC,0BAA0B,CAAC,EAAE,EAAE,eAAe,EAAE,IAAI,CAAC,CAAC;SACxE;QAED,eAAe;QACf,KAAK,IAAI,kBAAQ,CAAC,SAAS,CAAC,uBAAA,IAAI,4EAAmB,MAAvB,IAAI,EAAoB,OAAO,CAAC,IAAI,CAAC,EAAE,oBAAS,CAAC,eAAe,CAAC,IAAI,CAAC,CAAC;QAEnG,qEAAqE;QACrE,IAAI,iBAAiB,IAAI,CAAC,WAAW,EAAE;YACrC,MAAM,KAAK,GAAG,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,IAAI,KAAK,OAAO,CAAwC,CAAC;YAC3G,IAAI,KAAK,EAAE;gBACT,IAAI,UAAU,GAAG,EAAE,CAAC;gBACpB,IAAI,KAAK,CAAC,MAAM,EAAE;oBAChB,UAAU,GAAG,GAAG,kBAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,IAAI,EAAE,oBAAS,CAAC,eAAe,CAAC,iBAAiB,CAAC,OAAO,CAAC;iBAC3G;gBACD,UAAU,IAAI,kBAAQ,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,EAAE,oBAAS,CAAC,eAAe,CAAC,eAAe,CAAC,CAAC;gBACxF,MAAM,QAAQ,GAAG,uBAAA,IAAI,+EAAsB,MAA1B,IAAI,EAAuB,KAAK,CAAC,CAAC;gBACnD,IAAI,QAAQ,EAAE;oBACZ,IAAI,aAAa,GAAG,kBAAQ,CAAC,0BAA0B,CAAC,UAAU,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;oBACpF,aAAa,GAAG,kBAAQ,CAAC,SAAS,CAAC,aAAa,EAAE,gCAAgC,CAAC,CAAC;oBACpF,KAAK,IAAI,aAAa,CAAC;iBACxB;gBACD,SAAS,GAAG,KAAK,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,eAAe,CAAC,oBAAoB,CAAC,OAAO,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC,IAAI,EAAE,CAAC;aAC7G;SACF;aACI,IAAI,WAAW,EAAE,YAAY,EAAE;YAClC,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,YAAY,KAAK,WAAW,CAAC,YAAY,CAAC,CAAC;YACjG,IAAI,SAAS,EAAE;gBACb,IAAI,aAAa,CAAC;gBAClB,IAAI,SAAS,CAAC,IAAI,KAAK,OAAO,EAAE;oBAC9B,MAAM,KAAK,GAAG,SAAgD,CAAC;oBAC/D,aAAa,GAAG,KAAK,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC,EAAE,EAAE,EAAE,CAAC,EAAE,CAAC,QAAQ,IAAI,KAAK,CAAC,qBAAqB,CAAC,CAAC;iBACxF;gBACD,IAAI,SAAS,CAAC,IAAI,KAAK,OAAO,EAAE;oBAC9B,aAAa,GAAG,SAAS,CAAC;iBAC3B;gBACD,IAAI,aAAa,EAAE;oBACjB,IAAI,cAAc,GAAG,EAAE,CAAC;oBACxB,IAAI,WAAW,CAAC,OAAO,EAAE;wBACvB,IAAI,SAAS,CAAC,MAAM,EAAE;4BACpB,cAAc,GAAG,GAAG,kBAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,EAAE,oBAAS,CAAC,eAAe,CAAC,iBAAiB,CAAC,OAAO,CAAC;yBACnH;wBACD,cAAc,IAAI,kBAAQ,CAAC,SAAS,CAAC,SAAS,CAAC,IAAI,EAAE,oBAAS,CAAC,eAAe,CAAC,eAAe,CAAC,CAAC;qBACjG;oBACD,MAAM,QAAQ,GAAG,uBAAA,IAAI,+EAAsB,MAA1B,IAAI,EAAuB,SAAS,CAAC,CAAC;oBACvD,IAAI,QAAQ,EAAE;wBACZ,IAAI,aAAa,GAAG,kBAAQ,CAAC,0BAA0B,CAAC,cAAc,EAAE,QAAQ,EAAE,IAAI,CAAC,CAAC;wBACxF,IAAI,CAAC,WAAW,CAAC,OAAO,EAAE;4BACxB,aAAa,GAAG,kBAAQ,CAAC,SAAS,CAAC,aAAa,EAAE,gCAAgC,CAAC,CAAC;yBACrF;6BACI;4BACH,aAAa,GAAG,kBAAQ,CAAC,SAAS,CAAC,aAAa,EAAE,gCAAgC,CAAC,CAAC;yBACrF;wBACD,KAAK,IAAI,aAAa,CAAC;qBACxB;oBACD,SAAS,CAAC,IAAI,CAAC,eAAe,CAAC,oBAAoB,CAAC,OAAO,EAAE,SAAS,EAAE,aAAa,CAAC,CAAC,CAAC;iBACzF;aACF;SACF;QAED,IAAI,YAAY,GAAG,CAAC,EAAE;YACpB,KAAK,GAAG,kBAAQ,CAAC,SAAS,CAAC,KAAK,EAAE,iCAAiC,CAAC,CAAC;SACtE;aACI;YACH,KAAK,GAAG,kBAAQ,CAAC,SAAS,CAAC,KAAK,EAAE,cAAc,CAAC,CAAC;SACnD;QACD,IAAI,CAAC,kBAAQ,CAAC,sBAAsB,EAAE,EAAE;YACtC,KAAK,GAAG,yBAAQ,CAAC,OAAO,CAAC,4BAA4B,CAAC,CAAC;SACxD;QAED,KAAK,CAAC,IAAI,CAAC;YACT,KAAK;YACL,kBAAkB,EAAE,CAAE,MAAM,CAAE;YAC9B,KAAK,EAAE,SAAS;SACjB,CAAC,CAAC;IAEL,CAAC,CAAC,CAAC;IAEH,IAAI,OAAO,CAAC,QAAQ,EAAE,GAAG,EAAE;QACzB,MAAM,WAAW,GAAgB;YAC/B,IAAI,EAAE,SAAS;YACf,WAAW,EAAE,OAAO,CAAC,QAAQ,CAAC,GAAG;SAClC,CAAC;QACF,MAAM,OAAO,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,oBAAU,CAAC,2BAA2B,CAAC,WAAW,CAAC,EAAE,CAAC;QACrF,MAAM,QAAQ,GAAqB;YACjC,OAAO,EAAE,UAAU;YACnB,IAAI,EAAE,cAAc;YACpB,OAAO,EAAE,yBAAQ,CAAC,OAAO,CAAC,iCAAiC,EAAE,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC;YACnF,KAAK,EAAE,GAAG,OAAO,cAAc;YAC/B,MAAM,EAAE,0BAA0B;SACnC,CAAC;QAEF,MAAM,IAAI,GAAG,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACrC,IAAI,IAAI,EAAE,KAAK,EAAE,MAAM,KAAK,CAAC,EAAE;YAC7B,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;SAC3B;aACI;YACH,KAAK,CAAC,IAAI,CAAC;gBACT,kBAAkB,EAAE,CAAE,MAAM,CAAE;gBAC9B,KAAK,EAAE,CAAE,QAAQ,CAAE;aACpB,CAAC,CAAC;SACJ;KACF;IAED,OAAO,KAAK,CAAC;AACf,CAAC,yFAEkB,CAAS;IAC1B,OAAO,CAAC,CAAC,OAAO,CAAC,iBAAiB,EAAE,OAAO,CAAC,CAAC;AAC/C,CAAC,+FAEqB,SAA4D;IAChF,IAAI,CAAC,SAAS,CAAC,GAAG,EAAE;QAClB,OAAO,IAAI,CAAC;KACb;IACD,IAAI,QAAQ,CAAC;IACb,IAAI,SAAS,CAAC,IAAI,KAAK,OAAO,EAAE;QAC9B,QAAQ,GAAG;YACT,IAAI,EAAE,OAAO;YACb,QAAQ,EAAE,SAAS,CAAC,GAAG;SACX,CAAC;KAChB;SACI;QACH,QAAQ,GAAG;YACT,IAAI,EAAE,OAAO;YACb,QAAQ,EAAE,SAAS,CAAC,GAAG;SACX,CAAC;KAChB;IACD,MAAM,QAAQ,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,oBAAU,CAAC,2BAA2B,CAAC,QAAQ,CAAC,EAAE,CAAC;IACnF,MAAM,QAAQ,GAAG,SAAS,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,yBAAQ,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC,CAAC,CAAC,yBAAQ,CAAC,OAAO,CAAC,sBAAsB,CAAC,CAAC;IAClI,OAAO;QACL,GAAG,EAAE,GAAG;QACR,IAAI,EAAE,QAAQ;QACd,OAAO,EAAE,sEAAsE,QAAQ,KAAK;QAC5F,IAAI,EAAE;YACJ,IAAI,EAAE,IAAI;YACV,KAAK,EAAE,0BAA0B;YACjC,KAAK,EAAE,OAAO;YACd,KAAK,EAAE,SAAS;SACjB;KACF,CAAC;AACJ,CAAC","sourcesContent":["import { ArticleCategory, ArticleCategorySection } from 'bandcamp-fetch';\nimport bandcamp from '../../../BandcampContext';\nimport AlbumEntity from '../../../entities/AlbumEntity';\nimport ArticleEntity, { ArticleEntityMediaItem } from '../../../entities/ArticleEntity';\nimport TrackEntity from '../../../entities/TrackEntity';\nimport { ModelType } from '../../../model';\nimport UIHelper, { UILink, UI_STYLES } from '../../../util/UIHelper';\nimport View from './View';\nimport { RenderedList, RenderedPage } from './ViewHandler';\nimport { RendererType } from './renderers';\nimport { RenderedListItem } from './renderers/BaseRenderer';\nimport ViewHelper from './ViewHelper';\nimport ExplodableViewHandler from './ExplodableViewHandler';\nimport { ArticleModelGetArticlesParams } from '../../../model/ArticleModel';\nimport { AlbumView } from './AlbumViewHandler';\nimport { TrackView } from './TrackViewHandler';\n\nconst ARTICLE_CATEGORY_ALL = {\n url: 'all',\n name: 'All categories'\n};\n\nexport interface ArticleView extends View {\n name: 'article';\n articleUrl?: string;\n select?: boolean;\n categoryUrl?: string;\n mediaItemRef?: string;\n track?: string;\n}\n\ninterface ArticleMediaItemExplodeTrack extends TrackEntity {\n // For `getTrackUri()`\n articleUrl: string;\n mediaItemRef?: string;\n}\n\nexport default class ArticleViewHandler extends ExplodableViewHandler {\n\n browse(): Promise {\n const view = this.currentView;\n if (view.articleUrl) {\n return this.#browseArticle(view.articleUrl);\n }\n else if (view.select) {\n return this.#browseCategories();\n }\n\n return this.#browseList();\n\n }\n\n async #browseList(): Promise {\n const category = await this.#getCategoryFromUriOrDefault();\n if (!category.url) {\n throw Error('Category URL missing');\n }\n const lists: RenderedList[] = [ this.#getParamsList(category) ];\n const articleList = await this.#getArticleList(category.url);\n lists.push(articleList);\n\n return {\n navigation: {\n prev: { uri: this.constructPrevUri() },\n lists\n }\n };\n }\n\n async #getCategoryFromUriOrDefault(): Promise {\n const categoryUrl = this.currentView.categoryUrl;\n if (categoryUrl === ARTICLE_CATEGORY_ALL.url) {\n return ARTICLE_CATEGORY_ALL;\n }\n\n if (categoryUrl) {\n const categorySections = await this.getModel(ModelType.Article).getArticleCategories();\n const category = this.#findCategoryInSections(categoryUrl, categorySections);\n if (category) {\n return category;\n }\n }\n\n return bandcamp.getConfigValue('defaultArticleCategory', ARTICLE_CATEGORY_ALL, true);\n }\n\n #findCategoryInSections(categoryUrl: string, sections: ArticleCategorySection[]): ArticleCategory | null {\n for (const section of sections) {\n if (section.sections) {\n const result = this.#findCategoryInSections(categoryUrl, section.sections);\n if (result) {\n return result;\n }\n }\n else if (section.categories) {\n const result = section.categories.find((category) => category.url === categoryUrl);\n if (result) {\n return result;\n }\n }\n }\n return null;\n }\n\n #getParamsList(category: ArticleCategory) {\n const setDefaultJS = `\n const params = ${JSON.stringify(category)};\n const payload = {\n 'endpoint': 'music_service/bandcamp',\n 'method': 'saveDefaultArticleCategory',\n 'data': params\n };\n angular.element('#browse-page').scope().browse.socketService.emit('callMethod', payload);`;\n const setDefaultLink: UILink = {\n url: '#',\n icon: { type: 'fa', class: 'fa fa-cog' },\n text: bandcamp.getI18n('BANDCAMP_SET_DEFAULT_ARTICLE_CATEGORY'),\n onclick: setDefaultJS.replace(/\"/g, '"').replace(/\\r?\\n|\\r/g, '')\n };\n const title = UIHelper.constructListTitleWithLink(UIHelper.addBandcampIconToListTitle(bandcamp.getI18n('BANDCAMP_DAILY')), setDefaultLink, true);\n const paramsList: RenderedList = {\n title,\n availableListViews: [ 'list' ],\n items: []\n };\n const categoryName = category.url !== ARTICLE_CATEGORY_ALL.url ? category.name : bandcamp.getI18n('BANDCAMP_ALL_CATEGORIES');\n paramsList.items.push({\n service: 'bandcamp',\n type: 'item-no-menu',\n title: categoryName,\n icon: 'fa fa-filter',\n uri: `${this.uri}@select=category`\n });\n return paramsList;\n }\n\n async #getArticleList(categoryUrl: string): Promise {\n const view = this.currentView;\n const modelParams: ArticleModelGetArticlesParams = {\n limit: view.inSection ? bandcamp.getConfigValue('itemsPerSection', 5) : bandcamp.getConfigValue('itemsPerPage', 47)\n };\n\n if (view.pageRef) {\n modelParams.pageToken = view.pageRef.pageToken;\n modelParams.pageOffset = view.pageRef.pageOffset;\n }\n\n if (categoryUrl !== ARTICLE_CATEGORY_ALL.url) {\n modelParams.categoryUrl = categoryUrl;\n }\n\n const articleList = await this.getModel(ModelType.Article).getArticles(modelParams);\n const articleRenderer = this.getRenderer(RendererType.Article);\n const listItems = articleList.items.reduce((result, article) => {\n const rendered = articleRenderer.renderToListItem(article);\n if (rendered) {\n result.push(rendered);\n }\n return result;\n }, []);\n const nextPageRef = this.constructPageRef(articleList.nextPageToken, articleList.nextPageOffset);\n if (nextPageRef) {\n const nextUri = this.constructNextUri(nextPageRef);\n listItems.push(this.constructNextPageItem(nextUri));\n }\n\n return {\n availableListViews: [ 'list', 'grid' ],\n items: listItems\n };\n }\n\n async #browseCategories(): Promise {\n const currentCategory = await this.#getCategoryFromUriOrDefault();\n const firstList: RenderedList = {\n title: UIHelper.addIconToListTitle('fa fa-filter', bandcamp.getI18n('BANDCAMP_ARTICLE_CATEGORIES')),\n availableListViews: [ 'list' ],\n items: []\n };\n let allCategoriesTitle = bandcamp.getI18n('BANDCAMP_ALL_CATEGORIES');\n const isAllCategories = currentCategory.url === ARTICLE_CATEGORY_ALL.url;\n if (isAllCategories) {\n allCategoriesTitle = UIHelper.styleText(allCategoriesTitle, UI_STYLES.LIST_ITEM_SELECTED);\n }\n firstList.items.push({\n service: 'bandcamp',\n type: 'item-no-menu',\n title: allCategoriesTitle,\n icon: isAllCategories ? 'fa fa-check' : 'fa',\n uri: this.#constructArticleCategoryUri(ARTICLE_CATEGORY_ALL.url)\n });\n\n const categorySections = await this.getModel(ModelType.Article).getArticleCategories();\n const lists = this.#getArticleCategoryListPerSection(categorySections, currentCategory);\n lists.unshift(firstList);\n\n return {\n navigation: {\n prev: { uri: this.constructPrevUri() },\n lists\n }\n };\n }\n\n #getArticleCategoryListPerSection(sections: ArticleCategorySection[], currentCategory: ArticleCategory, lists: RenderedList[] = []) {\n sections.forEach((section) => {\n if (section.sections) {\n this.#getArticleCategoryListPerSection(section.sections, currentCategory, lists);\n }\n else if (section.categories) {\n const categoryList: RenderedList = {\n title: section.title,\n availableListViews: [ 'list' ],\n items: []\n };\n section.categories.forEach((category) => {\n if (category.url) {\n const isSelected = currentCategory ? currentCategory.url === category.url : false;\n let title = category.name;\n if (isSelected) {\n title = UIHelper.styleText(title, UI_STYLES.LIST_ITEM_SELECTED);\n }\n categoryList.items.push({\n service: 'bandcamp',\n type: 'item-no-menu',\n title,\n icon: isSelected ? 'fa fa-check' : 'fa',\n uri: this.#constructArticleCategoryUri(category.url)\n });\n }\n });\n\n lists.push(categoryList);\n }\n });\n\n return lists;\n }\n\n #constructArticleCategoryUri(categoryUrl: string) {\n const targetView = { ...this.currentView };\n\n if (targetView.categoryUrl !== categoryUrl) {\n delete targetView.pageRef;\n delete targetView.prevPageRefs;\n if (categoryUrl) {\n targetView.categoryUrl = categoryUrl;\n }\n else {\n delete targetView.categoryUrl;\n }\n }\n delete targetView.select;\n\n return ViewHelper.constructUriFromViews([ ...this.previousViews, targetView ]);\n }\n\n async #browseArticle(articleUrl: string) {\n const article = await this.getModel(ModelType.Article).getArticle(articleUrl);\n\n return {\n navigation: {\n prev: { uri: this.constructPrevUri() },\n info: this.getRenderer(RendererType.Article).renderToHeader(article),\n lists: this.#getArticleSectionLists(article)\n }\n };\n }\n\n #getArticleSectionLists(article: ArticleEntity) {\n // Each 'list' in Volumio contains the article section's text,\n // As well as the track featured in the next section (if any).\n // If the article covers a single media item (album / track) and\n // There is no nextSection, then all tracks will be shown instead\n // Of just the featured track.\n const articleRenderer = this.getRenderer(RendererType.Article);\n const isSingleMediaItem = article.mediaItems?.length === 1;\n const lists: RenderedList[] = [];\n\n article.sections?.forEach((section, sectionIndex, allSections) => {\n const nextSection = allSections[sectionIndex + 1];\n let listItems: RenderedListItem[] = [];\n let title = '';\n\n // First section has 'View on Bandcamp' link\n if (sectionIndex === 0) {\n const viewArticleLink: UILink = {\n url: article.url,\n text: bandcamp.getI18n('BANDCAMP_VIEW_LINK_ARTICLE'),\n icon: { type: 'bandcamp' },\n target: '_blank'\n };\n title = UIHelper.constructListTitleWithLink('', viewArticleLink, true);\n }\n\n // Section text\n title += UIHelper.wrapInDiv(this.#formatArticleText(section.text), UI_STYLES.ARTICLE_SECTION.TEXT);\n\n // Next section's featured track (or all tracks if single media item)\n if (isSingleMediaItem && !nextSection) {\n const album = article.mediaItems?.find((mi) => mi.type === 'album') as ArticleEntityMediaItem;\n if (album) {\n let albumTitle = '';\n if (album.artist) {\n albumTitle = `${UIHelper.styleText(album.artist.name, UI_STYLES.ARTICLE_SECTION.MEDIA_ITEM_ARTIST)}
`;\n }\n albumTitle += UIHelper.styleText(album.name, UI_STYLES.ARTICLE_SECTION.MEDIA_ITEM_NAME);\n const gotoLink = this.#getGoToMediaItemLink(album);\n if (gotoLink) {\n let titleWithGoto = UIHelper.constructListTitleWithLink(albumTitle, gotoLink, true);\n titleWithGoto = UIHelper.wrapInDiv(titleWithGoto, 'position: relative; top: 18px;');\n title += titleWithGoto;\n }\n listItems = album.tracks?.map((track) => articleRenderer.renderMediaItemTrack(article, album, track)) || [];\n }\n }\n else if (nextSection?.mediaItemRef) {\n const mediaItem = article.mediaItems?.find((mi) => mi.mediaItemRef === nextSection.mediaItemRef);\n if (mediaItem) {\n let featuredTrack;\n if (mediaItem.type === 'album') {\n const album = mediaItem as ArticleEntityMediaItem;\n featuredTrack = album.tracks?.find((tr) => tr.position == album.featuredTrackPosition);\n }\n if (mediaItem.type === 'track') {\n featuredTrack = mediaItem;\n }\n if (featuredTrack) {\n let mediaItemTitle = '';\n if (nextSection.heading) {\n if (mediaItem.artist) {\n mediaItemTitle = `${UIHelper.styleText(mediaItem.artist.name, UI_STYLES.ARTICLE_SECTION.MEDIA_ITEM_ARTIST)}
`;\n }\n mediaItemTitle += UIHelper.styleText(mediaItem.name, UI_STYLES.ARTICLE_SECTION.MEDIA_ITEM_NAME);\n }\n const gotoLink = this.#getGoToMediaItemLink(mediaItem);\n if (gotoLink) {\n let titleWithGoto = UIHelper.constructListTitleWithLink(mediaItemTitle, gotoLink, true);\n if (!nextSection.heading) {\n titleWithGoto = UIHelper.wrapInDiv(titleWithGoto, 'position: relative; top: 28px;');\n }\n else {\n titleWithGoto = UIHelper.wrapInDiv(titleWithGoto, 'position: relative; top: 18px;');\n }\n title += titleWithGoto;\n }\n listItems.push(articleRenderer.renderMediaItemTrack(article, mediaItem, featuredTrack));\n }\n }\n }\n\n if (sectionIndex > 0) {\n title = UIHelper.wrapInDiv(title, 'width: 100%; margin-top: -48px;');\n }\n else {\n title = UIHelper.wrapInDiv(title, 'width: 100%;');\n }\n if (!UIHelper.supportsEnhancedTitles()) {\n title = bandcamp.getI18n('BANDCAMP_UI_CONTENT_HIDDEN');\n }\n\n lists.push({\n title,\n availableListViews: [ 'list' ],\n items: listItems\n });\n\n });\n\n if (article.category?.url) {\n const articleView: ArticleView = {\n name: 'article',\n categoryUrl: article.category.url\n };\n const moreUri = `${this.uri}/${ViewHelper.constructUriSegmentFromView(articleView)}`;\n const moreItem: RenderedListItem = {\n service: 'bandcamp',\n type: 'item-no-menu',\n 'title': bandcamp.getI18n('BANDCAMP_MORE_CATEGORY_ARTICLES', article.category.name),\n 'uri': `${moreUri}@noExplode=1`,\n 'icon': 'fa fa-arrow-circle-right'\n };\n\n const last = lists[lists.length - 1];\n if (last?.items?.length === 0) {\n last.items.push(moreItem);\n }\n else {\n lists.push({\n availableListViews: [ 'list' ],\n items: [ moreItem ]\n });\n }\n }\n\n return lists;\n }\n\n #formatArticleText(s: string): string {\n return s.replace(/(?:\\r\\n|\\r|\\n)/g, '
');\n }\n\n #getGoToMediaItemLink(mediaItem: ArticleEntityMediaItem): UILink | null {\n if (!mediaItem.url) {\n return null;\n }\n let gotoView;\n if (mediaItem.type === 'album') {\n gotoView = {\n name: 'album',\n albumUrl: mediaItem.url\n } as AlbumView;\n }\n else {\n gotoView = {\n name: 'track',\n trackUrl: mediaItem.url\n } as TrackView;\n }\n const gotoPath = `${this.uri}/${ViewHelper.constructUriSegmentFromView(gotoView)}`;\n const gotoText = mediaItem.type === 'album' ? bandcamp.getI18n('BANDCAMP_GO_TO_ALBUM') : bandcamp.getI18n('BANDCAMP_GO_TO_TRACK');\n return {\n url: '#',\n text: gotoText,\n onclick: `angular.element('#browse-page').scope().browse.fetchLibrary({uri: '${gotoPath}'})`,\n icon: {\n type: 'fa',\n class: 'fa fa-arrow-circle-right',\n float: 'right',\n color: '#54c688'\n }\n };\n }\n\n async getTracksOnExplode(): Promise {\n const articleUrl = this.currentView.articleUrl;\n if (!articleUrl) {\n throw Error('No article URL specified');\n }\n\n const _setTrackProps = (track: TrackEntity, article: ArticleEntity, mediaItem: ArticleEntityMediaItem) => {\n const result: ArticleMediaItemExplodeTrack = {\n ...track,\n articleUrl: article.url,\n mediaItemRef: mediaItem.mediaItemRef\n };\n\n // Set props so track can be parsed\n result.thumbnail = mediaItem.thumbnail;\n delete result.artist;\n if (mediaItem.artist) {\n result.artist = mediaItem.artist;\n }\n if (mediaItem.type === 'album') {\n result.album = {\n type: 'album',\n name: mediaItem.name,\n url: mediaItem.url\n };\n }\n\n return result;\n };\n\n const article = await this.getModel(ModelType.Article).getArticle(articleUrl);\n const { mediaItemRef, track } = this.currentView;\n if (mediaItemRef && track) {\n const trackPosition = parseInt(track, 10);\n // Return track corresponding to mediaItemRef and track position\n const mediaItem = article.mediaItems?.find((mi) => mi.mediaItemRef === mediaItemRef);\n if (mediaItem?.type === 'album') {\n const track = mediaItem.tracks?.find((tr) => tr.position === trackPosition);\n if (track) {\n return _setTrackProps(track, article, mediaItem);\n }\n }\n // Not found\n return [];\n }\n\n // Return all featured tracks\n const tracks = article.mediaItems?.reduce((result, mediaItem) => {\n let track;\n if (mediaItem.type === 'album') {\n track = mediaItem.tracks?.find((tr) => tr.position == mediaItem.featuredTrackPosition);\n }\n else if (mediaItem.type === 'track') {\n track = mediaItem;\n }\n if (track) {\n result.push(_setTrackProps(track, article, mediaItem));\n }\n return result;\n }, []);\n\n return tracks || [];\n }\n\n /**\n * Override\n *\n * Track uri:\n * bandcamp/articles@articleUrl={articleUrl}@mediaItemRef={...}@track={trackPosition}@artistUrl={...}@albumUrl={...}\n */\n protected getTrackUri(track: ArticleMediaItemExplodeTrack): string | null {\n const artistUrl = track.artist?.url || null;\n const albumUrl = track.album?.url || artistUrl;\n\n const articleView: ArticleView = {\n name: 'article',\n articleUrl: track.articleUrl,\n mediaItemRef: track.mediaItemRef,\n track: track.position?.toString()\n };\n\n if (artistUrl) {\n articleView.artistUrl = artistUrl;\n }\n if (albumUrl) {\n articleView.albumUrl = albumUrl;\n }\n\n const uri = `bandcamp/${ViewHelper.constructUriSegmentFromView(articleView)}`;\n\n return uri;\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"ArticleViewHandler.js","sourceRoot":"","sources":["../../../../../src/lib/controller/browse/view-handlers/ArticleViewHandler.ts"],"names":[],"mappings":"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","sourcesContent":["import { type ArticleCategory, type ArticleCategorySection } from 'bandcamp-fetch';\nimport bandcamp from '../../../BandcampContext';\nimport type AlbumEntity from '../../../entities/AlbumEntity';\nimport {type ArticleEntityMediaItem} from '../../../entities/ArticleEntity';\nimport type ArticleEntity from '../../../entities/ArticleEntity';\nimport type TrackEntity from '../../../entities/TrackEntity';\nimport { ModelType } from '../../../model';\nimport UIHelper, { type UILink, UI_STYLES } from '../../../util/UIHelper';\nimport type View from './View';\nimport { type RenderedList, type RenderedPage } from './ViewHandler';\nimport { RendererType } from './renderers';\nimport { type RenderedListItem } from './renderers/BaseRenderer';\nimport ViewHelper from './ViewHelper';\nimport ExplodableViewHandler from './ExplodableViewHandler';\nimport { type ArticleModelGetArticlesParams } from '../../../model/ArticleModel';\nimport { type AlbumView } from './AlbumViewHandler';\nimport { type TrackView } from './TrackViewHandler';\n\nconst ARTICLE_CATEGORY_ALL = {\n url: 'all',\n name: 'All categories'\n};\n\nexport interface ArticleView extends View {\n name: 'article';\n articleUrl?: string;\n select?: boolean;\n categoryUrl?: string;\n mediaItemRef?: string;\n track?: string;\n}\n\ninterface ArticleMediaItemExplodeTrack extends TrackEntity {\n // For `getTrackUri()`\n articleUrl: string;\n mediaItemRef?: string;\n}\n\nexport default class ArticleViewHandler extends ExplodableViewHandler {\n\n browse(): Promise {\n const view = this.currentView;\n if (view.articleUrl) {\n return this.#browseArticle(view.articleUrl);\n }\n else if (view.select) {\n return this.#browseCategories();\n }\n\n return this.#browseList();\n\n }\n\n async #browseList(): Promise {\n const category = await this.#getCategoryFromUriOrDefault();\n if (!category.url) {\n throw Error('Category URL missing');\n }\n const lists: RenderedList[] = [ this.#getParamsList(category) ];\n const articleList = await this.#getArticleList(category.url);\n lists.push(articleList);\n\n return {\n navigation: {\n prev: { uri: this.constructPrevUri() },\n lists\n }\n };\n }\n\n async #getCategoryFromUriOrDefault(): Promise {\n const categoryUrl = this.currentView.categoryUrl;\n if (categoryUrl === ARTICLE_CATEGORY_ALL.url) {\n return ARTICLE_CATEGORY_ALL;\n }\n\n if (categoryUrl) {\n const categorySections = await this.getModel(ModelType.Article).getArticleCategories();\n const category = this.#findCategoryInSections(categoryUrl, categorySections);\n if (category) {\n return category;\n }\n }\n\n return bandcamp.getConfigValue('defaultArticleCategory', ARTICLE_CATEGORY_ALL, true);\n }\n\n #findCategoryInSections(categoryUrl: string, sections: ArticleCategorySection[]): ArticleCategory | null {\n for (const section of sections) {\n if (section.sections) {\n const result = this.#findCategoryInSections(categoryUrl, section.sections);\n if (result) {\n return result;\n }\n }\n else if (section.categories) {\n const result = section.categories.find((category) => category.url === categoryUrl);\n if (result) {\n return result;\n }\n }\n }\n return null;\n }\n\n #getParamsList(category: ArticleCategory) {\n const setDefaultJS = `\n const params = ${JSON.stringify(category)};\n const payload = {\n 'endpoint': 'music_service/bandcamp',\n 'method': 'saveDefaultArticleCategory',\n 'data': params\n };\n angular.element('#browse-page').scope().browse.socketService.emit('callMethod', payload);`;\n const setDefaultLink: UILink = {\n url: '#',\n icon: { type: 'fa', class: 'fa fa-cog' },\n text: bandcamp.getI18n('BANDCAMP_SET_DEFAULT_ARTICLE_CATEGORY'),\n onclick: setDefaultJS.replace(/\"/g, '"').replace(/\\r?\\n|\\r/g, '')\n };\n const title = UIHelper.constructListTitleWithLink(UIHelper.addBandcampIconToListTitle(bandcamp.getI18n('BANDCAMP_DAILY')), setDefaultLink, true);\n const paramsList: RenderedList = {\n title,\n availableListViews: [ 'list' ],\n items: []\n };\n const categoryName = category.url !== ARTICLE_CATEGORY_ALL.url ? category.name : bandcamp.getI18n('BANDCAMP_ALL_CATEGORIES');\n paramsList.items.push({\n service: 'bandcamp',\n type: 'item-no-menu',\n title: categoryName,\n icon: 'fa fa-filter',\n uri: `${this.uri}@select=category`\n });\n return paramsList;\n }\n\n async #getArticleList(categoryUrl: string): Promise {\n const view = this.currentView;\n const modelParams: ArticleModelGetArticlesParams = {\n limit: view.inSection ? bandcamp.getConfigValue('itemsPerSection', 5) : bandcamp.getConfigValue('itemsPerPage', 47)\n };\n\n if (view.pageRef) {\n modelParams.pageToken = view.pageRef.pageToken;\n modelParams.pageOffset = view.pageRef.pageOffset;\n }\n\n if (categoryUrl !== ARTICLE_CATEGORY_ALL.url) {\n modelParams.categoryUrl = categoryUrl;\n }\n\n const articleList = await this.getModel(ModelType.Article).getArticles(modelParams);\n const articleRenderer = this.getRenderer(RendererType.Article);\n const listItems = articleList.items.reduce((result, article) => {\n const rendered = articleRenderer.renderToListItem(article);\n if (rendered) {\n result.push(rendered);\n }\n return result;\n }, []);\n const nextPageRef = this.constructPageRef(articleList.nextPageToken, articleList.nextPageOffset);\n if (nextPageRef) {\n const nextUri = this.constructNextUri(nextPageRef);\n listItems.push(this.constructNextPageItem(nextUri));\n }\n\n return {\n availableListViews: [ 'list', 'grid' ],\n items: listItems\n };\n }\n\n async #browseCategories(): Promise {\n const currentCategory = await this.#getCategoryFromUriOrDefault();\n const firstList: RenderedList = {\n title: UIHelper.addIconToListTitle('fa fa-filter', bandcamp.getI18n('BANDCAMP_ARTICLE_CATEGORIES')),\n availableListViews: [ 'list' ],\n items: []\n };\n let allCategoriesTitle = bandcamp.getI18n('BANDCAMP_ALL_CATEGORIES');\n const isAllCategories = currentCategory.url === ARTICLE_CATEGORY_ALL.url;\n if (isAllCategories) {\n allCategoriesTitle = UIHelper.styleText(allCategoriesTitle, UI_STYLES.LIST_ITEM_SELECTED);\n }\n firstList.items.push({\n service: 'bandcamp',\n type: 'item-no-menu',\n title: allCategoriesTitle,\n icon: isAllCategories ? 'fa fa-check' : 'fa',\n uri: this.#constructArticleCategoryUri(ARTICLE_CATEGORY_ALL.url)\n });\n\n const categorySections = await this.getModel(ModelType.Article).getArticleCategories();\n const lists = this.#getArticleCategoryListPerSection(categorySections, currentCategory);\n lists.unshift(firstList);\n\n return {\n navigation: {\n prev: { uri: this.constructPrevUri() },\n lists\n }\n };\n }\n\n #getArticleCategoryListPerSection(sections: ArticleCategorySection[], currentCategory: ArticleCategory, lists: RenderedList[] = []) {\n sections.forEach((section) => {\n if (section.sections) {\n this.#getArticleCategoryListPerSection(section.sections, currentCategory, lists);\n }\n else if (section.categories) {\n const categoryList: RenderedList = {\n title: section.title,\n availableListViews: [ 'list' ],\n items: []\n };\n section.categories.forEach((category) => {\n if (category.url) {\n const isSelected = currentCategory ? currentCategory.url === category.url : false;\n let title = category.name;\n if (isSelected) {\n title = UIHelper.styleText(title, UI_STYLES.LIST_ITEM_SELECTED);\n }\n categoryList.items.push({\n service: 'bandcamp',\n type: 'item-no-menu',\n title,\n icon: isSelected ? 'fa fa-check' : 'fa',\n uri: this.#constructArticleCategoryUri(category.url)\n });\n }\n });\n\n lists.push(categoryList);\n }\n });\n\n return lists;\n }\n\n #constructArticleCategoryUri(categoryUrl: string) {\n const targetView = { ...this.currentView };\n\n if (targetView.categoryUrl !== categoryUrl) {\n delete targetView.pageRef;\n delete targetView.prevPageRefs;\n if (categoryUrl) {\n targetView.categoryUrl = categoryUrl;\n }\n else {\n delete targetView.categoryUrl;\n }\n }\n delete targetView.select;\n\n return ViewHelper.constructUriFromViews([ ...this.previousViews, targetView ]);\n }\n\n async #browseArticle(articleUrl: string) {\n const article = await this.getModel(ModelType.Article).getArticle(articleUrl);\n\n return {\n navigation: {\n prev: { uri: this.constructPrevUri() },\n info: this.getRenderer(RendererType.Article).renderToHeader(article),\n lists: this.#getArticleSectionLists(article)\n }\n };\n }\n\n #getArticleSectionLists(article: ArticleEntity) {\n // Each 'list' in Volumio contains the article section's text,\n // As well as the track featured in the next section (if any).\n // If the article covers a single media item (album / track) and\n // There is no nextSection, then all tracks will be shown instead\n // Of just the featured track.\n const articleRenderer = this.getRenderer(RendererType.Article);\n const isSingleMediaItem = article.mediaItems?.length === 1;\n const lists: RenderedList[] = [];\n\n article.sections?.forEach((section, sectionIndex, allSections) => {\n const nextSection = allSections[sectionIndex + 1];\n let listItems: RenderedListItem[] = [];\n let title = '';\n\n // First section has 'View on Bandcamp' link\n if (sectionIndex === 0) {\n const viewArticleLink: UILink = {\n url: article.url,\n text: bandcamp.getI18n('BANDCAMP_VIEW_LINK_ARTICLE'),\n icon: { type: 'bandcamp' },\n target: '_blank'\n };\n title = UIHelper.constructListTitleWithLink('', viewArticleLink, true);\n }\n\n // Section text\n title += UIHelper.wrapInDiv(this.#formatArticleText(section.text), UI_STYLES.ARTICLE_SECTION.TEXT);\n\n // Next section's featured track (or all tracks if single media item)\n if (isSingleMediaItem && !nextSection) {\n const album = article.mediaItems?.find((mi) => mi.type === 'album') as ArticleEntityMediaItem;\n if (album) {\n let albumTitle = '';\n if (album.artist) {\n albumTitle = `${UIHelper.styleText(album.artist.name, UI_STYLES.ARTICLE_SECTION.MEDIA_ITEM_ARTIST)}
`;\n }\n albumTitle += UIHelper.styleText(album.name, UI_STYLES.ARTICLE_SECTION.MEDIA_ITEM_NAME);\n const gotoLink = this.#getGoToMediaItemLink(album);\n if (gotoLink) {\n let titleWithGoto = UIHelper.constructListTitleWithLink(albumTitle, gotoLink, true);\n titleWithGoto = UIHelper.wrapInDiv(titleWithGoto, 'position: relative; top: 18px;');\n title += titleWithGoto;\n }\n listItems = album.tracks?.map((track) => articleRenderer.renderMediaItemTrack(article, album, track)) || [];\n }\n }\n else if (nextSection?.mediaItemRef) {\n const mediaItem = article.mediaItems?.find((mi) => mi.mediaItemRef === nextSection.mediaItemRef);\n if (mediaItem) {\n let featuredTrack;\n if (mediaItem.type === 'album') {\n const album = mediaItem as ArticleEntityMediaItem;\n featuredTrack = album.tracks?.find((tr) => tr.position == album.featuredTrackPosition);\n }\n if (mediaItem.type === 'track') {\n featuredTrack = mediaItem;\n }\n if (featuredTrack) {\n let mediaItemTitle = '';\n if (nextSection.heading) {\n if (mediaItem.artist) {\n mediaItemTitle = `${UIHelper.styleText(mediaItem.artist.name, UI_STYLES.ARTICLE_SECTION.MEDIA_ITEM_ARTIST)}
`;\n }\n mediaItemTitle += UIHelper.styleText(mediaItem.name, UI_STYLES.ARTICLE_SECTION.MEDIA_ITEM_NAME);\n }\n const gotoLink = this.#getGoToMediaItemLink(mediaItem);\n if (gotoLink) {\n let titleWithGoto = UIHelper.constructListTitleWithLink(mediaItemTitle, gotoLink, true);\n if (!nextSection.heading) {\n titleWithGoto = UIHelper.wrapInDiv(titleWithGoto, 'position: relative; top: 28px;');\n }\n else {\n titleWithGoto = UIHelper.wrapInDiv(titleWithGoto, 'position: relative; top: 18px;');\n }\n title += titleWithGoto;\n }\n listItems.push(articleRenderer.renderMediaItemTrack(article, mediaItem, featuredTrack));\n }\n }\n }\n\n if (sectionIndex > 0) {\n title = UIHelper.wrapInDiv(title, 'width: 100%; margin-top: -48px;');\n }\n else {\n title = UIHelper.wrapInDiv(title, 'width: 100%;');\n }\n if (!UIHelper.supportsEnhancedTitles()) {\n title = bandcamp.getI18n('BANDCAMP_UI_CONTENT_HIDDEN');\n }\n\n lists.push({\n title,\n availableListViews: [ 'list' ],\n items: listItems\n });\n\n });\n\n if (article.category?.url) {\n const articleView: ArticleView = {\n name: 'article',\n categoryUrl: article.category.url\n };\n const moreUri = `${this.uri}/${ViewHelper.constructUriSegmentFromView(articleView)}`;\n const moreItem: RenderedListItem = {\n service: 'bandcamp',\n type: 'item-no-menu',\n 'title': bandcamp.getI18n('BANDCAMP_MORE_CATEGORY_ARTICLES', article.category.name),\n 'uri': `${moreUri}@noExplode=1`,\n 'icon': 'fa fa-arrow-circle-right'\n };\n\n const last = lists[lists.length - 1];\n if (last?.items?.length === 0) {\n last.items.push(moreItem);\n }\n else {\n lists.push({\n availableListViews: [ 'list' ],\n items: [ moreItem ]\n });\n }\n }\n\n return lists;\n }\n\n #formatArticleText(s: string): string {\n return s.replace(/(?:\\r\\n|\\r|\\n)/g, '
');\n }\n\n #getGoToMediaItemLink(mediaItem: ArticleEntityMediaItem): UILink | null {\n if (!mediaItem.url) {\n return null;\n }\n let gotoView;\n if (mediaItem.type === 'album') {\n gotoView = {\n name: 'album',\n albumUrl: mediaItem.url\n } as AlbumView;\n }\n else {\n gotoView = {\n name: 'track',\n trackUrl: mediaItem.url\n } as TrackView;\n }\n const gotoPath = `${this.uri}/${ViewHelper.constructUriSegmentFromView(gotoView)}`;\n const gotoText = mediaItem.type === 'album' ? bandcamp.getI18n('BANDCAMP_GO_TO_ALBUM') : bandcamp.getI18n('BANDCAMP_GO_TO_TRACK');\n return {\n url: '#',\n text: gotoText,\n onclick: `angular.element('#browse-page').scope().browse.fetchLibrary({uri: '${gotoPath}'})`,\n icon: {\n type: 'fa',\n class: 'fa fa-arrow-circle-right',\n float: 'right',\n color: '#54c688'\n }\n };\n }\n\n async getTracksOnExplode(): Promise {\n const articleUrl = this.currentView.articleUrl;\n if (!articleUrl) {\n throw Error('No article URL specified');\n }\n\n const _setTrackProps = (track: TrackEntity, article: ArticleEntity, mediaItem: ArticleEntityMediaItem) => {\n const result: ArticleMediaItemExplodeTrack = {\n ...track,\n articleUrl: article.url,\n mediaItemRef: mediaItem.mediaItemRef\n };\n\n // Set props so track can be parsed\n result.thumbnail = mediaItem.thumbnail;\n delete result.artist;\n if (mediaItem.artist) {\n result.artist = mediaItem.artist;\n }\n if (mediaItem.type === 'album') {\n result.album = {\n type: 'album',\n name: mediaItem.name,\n url: mediaItem.url\n };\n }\n\n return result;\n };\n\n const article = await this.getModel(ModelType.Article).getArticle(articleUrl);\n const { mediaItemRef, track } = this.currentView;\n if (mediaItemRef && track) {\n const trackPosition = parseInt(track, 10);\n // Return track corresponding to mediaItemRef and track position\n const mediaItem = article.mediaItems?.find((mi) => mi.mediaItemRef === mediaItemRef);\n if (mediaItem?.type === 'album') {\n const track = mediaItem.tracks?.find((tr) => tr.position === trackPosition);\n if (track) {\n return _setTrackProps(track, article, mediaItem);\n }\n }\n // Not found\n return [];\n }\n\n // Return all featured tracks\n const tracks = article.mediaItems?.reduce((result, mediaItem) => {\n let track;\n if (mediaItem.type === 'album') {\n track = mediaItem.tracks?.find((tr) => tr.position == mediaItem.featuredTrackPosition);\n }\n else if (mediaItem.type === 'track') {\n track = mediaItem;\n }\n if (track) {\n result.push(_setTrackProps(track, article, mediaItem));\n }\n return result;\n }, []);\n\n return tracks || [];\n }\n\n /**\n * Override\n *\n * Track uri:\n * bandcamp/articles@articleUrl={articleUrl}@mediaItemRef={...}@track={trackPosition}@artistUrl={...}@albumUrl={...}\n */\n protected getTrackUri(track: ArticleMediaItemExplodeTrack): string | null {\n const artistUrl = track.artist?.url || null;\n const albumUrl = track.album?.url || artistUrl;\n\n const articleView: ArticleView = {\n name: 'article',\n articleUrl: track.articleUrl,\n mediaItemRef: track.mediaItemRef,\n track: track.position?.toString()\n };\n\n if (artistUrl) {\n articleView.artistUrl = artistUrl;\n }\n if (albumUrl) {\n articleView.albumUrl = albumUrl;\n }\n\n const uri = `bandcamp/${ViewHelper.constructUriSegmentFromView(articleView)}`;\n\n return uri;\n }\n}\n"]} \ No newline at end of file diff --git a/bandcamp/dist/lib/controller/browse/view-handlers/BandViewHandler.d.ts b/bandcamp/dist/lib/controller/browse/view-handlers/BandViewHandler.d.ts index 250cd6d7d..93fd80a1c 100644 --- a/bandcamp/dist/lib/controller/browse/view-handlers/BandViewHandler.d.ts +++ b/bandcamp/dist/lib/controller/browse/view-handlers/BandViewHandler.d.ts @@ -1,7 +1,7 @@ -import TrackEntity from '../../../entities/TrackEntity'; +import type TrackEntity from '../../../entities/TrackEntity'; import ExplodableViewHandler from './ExplodableViewHandler'; -import View from './View'; -import { RenderedPage } from './ViewHandler'; +import type View from './View'; +import { type RenderedPage } from './ViewHandler'; export interface BandView extends View { name: 'band'; bandUrl: string; diff --git a/bandcamp/dist/lib/controller/browse/view-handlers/BandViewHandler.d.ts.map b/bandcamp/dist/lib/controller/browse/view-handlers/BandViewHandler.d.ts.map index 073748500..794acab8c 100644 --- a/bandcamp/dist/lib/controller/browse/view-handlers/BandViewHandler.d.ts.map +++ b/bandcamp/dist/lib/controller/browse/view-handlers/BandViewHandler.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"BandViewHandler.d.ts","sourceRoot":"","sources":["../../../../../src/lib/controller/browse/view-handlers/BandViewHandler.ts"],"names":[],"mappings":"AACA,OAAO,WAAW,MAAM,+BAA+B,CAAC;AAIxD,OAAO,qBAAqB,MAAM,yBAAyB,CAAC;AAC5D,OAAO,IAAI,MAAM,QAAQ,CAAC;AAC1B,OAAO,EAAgB,YAAY,EAAE,MAAM,eAAe,CAAC;AAK3D,MAAM,WAAW,QAAS,SAAQ,IAAI;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,aAAa,GAAG,SAAS,CAAC;CAClC;AAED,MAAM,CAAC,OAAO,OAAO,eAAgB,SAAQ,qBAAqB,CAAC,QAAQ,CAAC;;IAEpE,MAAM,IAAI,OAAO,CAAC,YAAY,CAAC;IA8N/B,kBAAkB,IAAI,OAAO,CAAC,WAAW,GAAG,WAAW,EAAE,CAAC;CA0BjE"} \ No newline at end of file +{"version":3,"file":"BandViewHandler.d.ts","sourceRoot":"","sources":["../../../../../src/lib/controller/browse/view-handlers/BandViewHandler.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,WAAW,MAAM,+BAA+B,CAAC;AAI7D,OAAO,qBAAqB,MAAM,yBAAyB,CAAC;AAC5D,OAAO,KAAK,IAAI,MAAM,QAAQ,CAAC;AAC/B,OAAO,EAAqB,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AAKrE,MAAM,WAAW,QAAS,SAAQ,IAAI;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,aAAa,GAAG,SAAS,CAAC;CAClC;AAED,MAAM,CAAC,OAAO,OAAO,eAAgB,SAAQ,qBAAqB,CAAC,QAAQ,CAAC;;IAEpE,MAAM,IAAI,OAAO,CAAC,YAAY,CAAC;IA8N/B,kBAAkB,IAAI,OAAO,CAAC,WAAW,GAAG,WAAW,EAAE,CAAC;CA0BjE"} \ No newline at end of file diff --git a/bandcamp/dist/lib/controller/browse/view-handlers/BandViewHandler.js b/bandcamp/dist/lib/controller/browse/view-handlers/BandViewHandler.js index d00a1b70d..d923f6196 100644 --- a/bandcamp/dist/lib/controller/browse/view-handlers/BandViewHandler.js +++ b/bandcamp/dist/lib/controller/browse/view-handlers/BandViewHandler.js @@ -122,7 +122,6 @@ class BandViewHandler extends ExplodableViewHandler_1.default { return []; } } -exports.default = BandViewHandler; _BandViewHandler_instances = new WeakSet(), _BandViewHandler_getContentListsForArtist = async function _BandViewHandler_getContentListsForArtist(artistUrl) { return [await __classPrivateFieldGet(this, _BandViewHandler_instances, "m", _BandViewHandler_getDiscographyList).call(this, artistUrl)]; }, _BandViewHandler_getContentListsForLabel = async function _BandViewHandler_getContentListsForLabel(labelUrl) { @@ -238,4 +237,5 @@ _BandViewHandler_instances = new WeakSet(), _BandViewHandler_getContentListsForA return ''; } }; +exports.default = BandViewHandler; //# sourceMappingURL=BandViewHandler.js.map \ No newline at end of file diff --git a/bandcamp/dist/lib/controller/browse/view-handlers/BandViewHandler.js.map b/bandcamp/dist/lib/controller/browse/view-handlers/BandViewHandler.js.map index c298a7c70..60c65e9f5 100644 --- a/bandcamp/dist/lib/controller/browse/view-handlers/BandViewHandler.js.map +++ b/bandcamp/dist/lib/controller/browse/view-handlers/BandViewHandler.js.map @@ -1 +1 @@ -{"version":3,"file":"BandViewHandler.js","sourceRoot":"","sources":["../../../../../src/lib/controller/browse/view-handlers/BandViewHandler.ts"],"names":[],"mappings":"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","sourcesContent":["import bandcamp from '../../../BandcampContext';\nimport TrackEntity from '../../../entities/TrackEntity';\nimport { ModelType } from '../../../model';\nimport { BandModelGetDiscographyParams, BandModelGetLabelArtistsParams } from '../../../model/BandModel';\nimport UIHelper, { UILink } from '../../../util/UIHelper';\nimport ExplodableViewHandler from './ExplodableViewHandler';\nimport View from './View';\nimport { RenderedList, RenderedPage } from './ViewHandler';\nimport ViewHelper from './ViewHelper';\nimport { RendererType } from './renderers';\nimport { RenderedListItem } from './renderers/BaseRenderer';\n\nexport interface BandView extends View {\n name: 'band';\n bandUrl: string;\n view?: 'discography' | 'artists';\n}\n\nexport default class BandViewHandler extends ExplodableViewHandler {\n\n async browse(): Promise {\n const bandUrl = this.currentView.bandUrl;\n const bandInfo = await this.getModel(ModelType.Band).getBand(bandUrl);\n const header = this.getRenderer(RendererType.Band).renderToHeader(bandInfo);\n let backToList: RenderedList | null = null;\n if (bandInfo.type === 'artist' && bandInfo.label?.url) {\n // Check if we're coming from the label:\n // Label -> artist ; or\n // Label -> album -> artist\n const _getBackToUri = (labelUrl: string, matchLevel: number) => {\n const prevViews = this.previousViews;\n const viewToMatch = prevViews[prevViews.length - (matchLevel + 1)];\n if (viewToMatch && viewToMatch.name === 'band' && viewToMatch.bandUrl === labelUrl) {\n return ViewHelper.constructUriFromViews(prevViews.slice(0, prevViews.length - matchLevel));\n }\n return null;\n };\n\n let labelLinkListItem: RenderedListItem;\n const backToUri = _getBackToUri(bandInfo.label.url, 0) || _getBackToUri(bandInfo.label.url, 1);\n if (backToUri) {\n labelLinkListItem = {\n service: 'bandcamp',\n type: 'item-no-menu',\n title: bandcamp.getI18n('BANDCAMP_BACK_TO', bandInfo.label.name),\n uri: backToUri\n };\n }\n else {\n const bandView: BandView = {\n name: 'band',\n bandUrl: bandInfo.label.url\n };\n labelLinkListItem = {\n service: 'bandcamp',\n type: 'item-no-menu',\n title: bandInfo.label.name,\n uri: `${this.uri}/${ViewHelper.constructUriSegmentFromView(bandView)}`\n };\n }\n labelLinkListItem.icon = 'fa fa-link';\n\n backToList = {\n availableListViews: [ 'list' ],\n items: [ labelLinkListItem ]\n };\n }\n\n let contentLists: RenderedList[];\n switch (bandInfo.type) {\n case 'artist':\n contentLists = await this.#getContentListsForArtist(bandUrl);\n break;\n case 'label':\n contentLists = await this.#getContentListsForLabel(bandUrl);\n break;\n default:\n contentLists = [];\n }\n\n if (backToList) {\n contentLists.unshift(backToList);\n }\n\n const viewBandExternalLink: UILink = {\n url: bandUrl,\n text: this.#getViewLinkText(bandInfo.type),\n icon: { type: 'bandcamp' },\n target: '_blank'\n };\n\n if (contentLists.length > 1) {\n contentLists[1].title = UIHelper.constructListTitleWithLink(contentLists[1].title || '', viewBandExternalLink, false);\n }\n else {\n contentLists[0].title = UIHelper.constructListTitleWithLink(contentLists[0].title || '', viewBandExternalLink, true);\n }\n\n return {\n navigation: {\n prev: { uri: this.constructPrevUri() },\n info: header,\n lists: contentLists\n }\n };\n }\n\n async #getContentListsForArtist(artistUrl: string) {\n return [ await this.#getDiscographyList(artistUrl) ];\n }\n\n async #getContentListsForLabel(labelUrl: string): Promise {\n let contentsList;\n let viewLinkListItem: RenderedListItem;\n if (this.currentView.view === 'artists') {\n contentsList = await this.#getLabelArtistsList(labelUrl);\n const bandView: BandView = {\n name: 'band',\n bandUrl: labelUrl,\n view: 'discography'\n };\n viewLinkListItem = {\n service: 'bandcamp',\n type: 'item-no-menu',\n icon: 'fa fa-music',\n title: bandcamp.getI18n('BANDCAMP_DISCOGRAPHY'),\n uri: `${this.uri}/${ViewHelper.constructUriSegmentFromView(bandView)}`\n };\n }\n else {\n contentsList = await this.#getDiscographyList(labelUrl);\n const bandView: BandView = {\n name: 'band',\n bandUrl: labelUrl,\n view: 'artists'\n };\n viewLinkListItem = {\n service: 'bandcamp',\n type: 'item-no-menu',\n icon: 'fa fa-users',\n title: bandcamp.getI18n('BANDCAMP_LABEL_ARTISTS'),\n uri: `${this.uri}/${ViewHelper.constructUriSegmentFromView(bandView)}`\n };\n }\n const linksList: RenderedList = {\n availableListViews: [ 'list' ],\n items: [ viewLinkListItem ]\n };\n\n return [ linksList, contentsList ];\n }\n\n async #getDiscographyList(bandUrl: string): Promise {\n const view = this.currentView;\n const model = this.getModel(ModelType.Band);\n const albumRenderer = this.getRenderer(RendererType.Album);\n const trackRenderer = this.getRenderer(RendererType.Track);\n\n const modelParams: BandModelGetDiscographyParams = {\n bandUrl,\n limit: bandcamp.getConfigValue('itemsPerPage', 47)\n };\n\n if (view.pageRef) {\n modelParams.pageToken = view.pageRef.pageToken;\n modelParams.pageOffset = view.pageRef.pageOffset;\n }\n\n const discog = await model.getDiscography(modelParams);\n const listItems = discog.items.reduce((result, discogItem) => {\n let rendered;\n if (discogItem.type === 'album') {\n rendered = albumRenderer.renderToListItem(discogItem);\n }\n else { // Track\n rendered = trackRenderer.renderToListItem(discogItem, true, true, false);\n }\n if (rendered) {\n result.push(rendered);\n }\n return result;\n }, []);\n\n const nextPageRef = this.constructPageRef(discog.nextPageToken, discog.nextPageOffset);\n if (nextPageRef) {\n const nextUri = this.constructNextUri(nextPageRef);\n listItems.push(this.constructNextPageItem(nextUri));\n }\n\n return {\n title: bandcamp.getI18n('BANDCAMP_DISCOGRAPHY'),\n availableListViews: [ 'list', 'grid' ],\n items: listItems\n };\n }\n\n async #getLabelArtistsList(labelUrl: string): Promise {\n\n const modelParams: BandModelGetLabelArtistsParams = {\n labelUrl,\n limit: bandcamp.getConfigValue('itemsPerPage', 47)\n };\n\n if (this.currentView.pageRef) {\n modelParams.pageToken = this.currentView.pageRef.pageToken;\n modelParams.pageOffset = this.currentView.pageRef.pageOffset;\n }\n\n const artists = await this.getModel(ModelType.Band).getLabelArtists(modelParams);\n const artistRenderer = this.getRenderer(RendererType.Band);\n const listItems = artists.items.reduce((result, artist) => {\n const rendered = artistRenderer.renderToListItem(artist);\n if (rendered) {\n result.push(rendered);\n }\n return result;\n }, []);\n\n const nextPageRef = this.constructPageRef(artists.nextPageToken, artists.nextPageOffset);\n if (nextPageRef) {\n const nextUri = this.constructNextUri(nextPageRef);\n listItems.push(this.constructNextPageItem(nextUri));\n }\n\n return {\n title: bandcamp.getI18n('BANDCAMP_LABEL_ARTISTS'),\n availableListViews: [ 'list', 'grid' ],\n items: listItems\n };\n }\n\n #getViewLinkText(bandType: string) {\n switch (bandType) {\n case 'artist':\n return bandcamp.getI18n('BANDCAMP_VIEW_LINK_ARTIST');\n case 'label':\n return bandcamp.getI18n('BANDCAMP_VIEW_LINK_LABEL');\n default:\n return '';\n }\n }\n\n async getTracksOnExplode(): Promise {\n const bandUrl = this.currentView.bandUrl;\n if (!bandUrl) {\n throw Error('Band URL is missing');\n }\n\n const modelParams: BandModelGetDiscographyParams = {\n limit: 1,\n bandUrl\n };\n\n const discog = await this.getModel(ModelType.Band).getDiscography(modelParams);\n const first = discog.items[0] || {};\n if (first.type === 'track' && first.url) {\n const trackModel = this.getModel(ModelType.Track);\n return trackModel.getTrack(first.url);\n }\n else if (first.type === 'album' && first.url) {\n const albumModel = this.getModel(ModelType.Album);\n const album = await albumModel.getAlbum(first.url);\n return album.tracks || [];\n }\n\n return [];\n\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"BandViewHandler.js","sourceRoot":"","sources":["../../../../../src/lib/controller/browse/view-handlers/BandViewHandler.ts"],"names":[],"mappings":"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","sourcesContent":["import bandcamp from '../../../BandcampContext';\nimport type TrackEntity from '../../../entities/TrackEntity';\nimport { ModelType } from '../../../model';\nimport { type BandModelGetDiscographyParams, type BandModelGetLabelArtistsParams } from '../../../model/BandModel';\nimport UIHelper, { type UILink } from '../../../util/UIHelper';\nimport ExplodableViewHandler from './ExplodableViewHandler';\nimport type View from './View';\nimport { type RenderedList, type RenderedPage } from './ViewHandler';\nimport ViewHelper from './ViewHelper';\nimport { RendererType } from './renderers';\nimport { type RenderedListItem } from './renderers/BaseRenderer';\n\nexport interface BandView extends View {\n name: 'band';\n bandUrl: string;\n view?: 'discography' | 'artists';\n}\n\nexport default class BandViewHandler extends ExplodableViewHandler {\n\n async browse(): Promise {\n const bandUrl = this.currentView.bandUrl;\n const bandInfo = await this.getModel(ModelType.Band).getBand(bandUrl);\n const header = this.getRenderer(RendererType.Band).renderToHeader(bandInfo);\n let backToList: RenderedList | null = null;\n if (bandInfo.type === 'artist' && bandInfo.label?.url) {\n // Check if we're coming from the label:\n // Label -> artist ; or\n // Label -> album -> artist\n const _getBackToUri = (labelUrl: string, matchLevel: number) => {\n const prevViews = this.previousViews;\n const viewToMatch = prevViews[prevViews.length - (matchLevel + 1)];\n if (viewToMatch && viewToMatch.name === 'band' && viewToMatch.bandUrl === labelUrl) {\n return ViewHelper.constructUriFromViews(prevViews.slice(0, prevViews.length - matchLevel));\n }\n return null;\n };\n\n let labelLinkListItem: RenderedListItem;\n const backToUri = _getBackToUri(bandInfo.label.url, 0) || _getBackToUri(bandInfo.label.url, 1);\n if (backToUri) {\n labelLinkListItem = {\n service: 'bandcamp',\n type: 'item-no-menu',\n title: bandcamp.getI18n('BANDCAMP_BACK_TO', bandInfo.label.name),\n uri: backToUri\n };\n }\n else {\n const bandView: BandView = {\n name: 'band',\n bandUrl: bandInfo.label.url\n };\n labelLinkListItem = {\n service: 'bandcamp',\n type: 'item-no-menu',\n title: bandInfo.label.name,\n uri: `${this.uri}/${ViewHelper.constructUriSegmentFromView(bandView)}`\n };\n }\n labelLinkListItem.icon = 'fa fa-link';\n\n backToList = {\n availableListViews: [ 'list' ],\n items: [ labelLinkListItem ]\n };\n }\n\n let contentLists: RenderedList[];\n switch (bandInfo.type) {\n case 'artist':\n contentLists = await this.#getContentListsForArtist(bandUrl);\n break;\n case 'label':\n contentLists = await this.#getContentListsForLabel(bandUrl);\n break;\n default:\n contentLists = [];\n }\n\n if (backToList) {\n contentLists.unshift(backToList);\n }\n\n const viewBandExternalLink: UILink = {\n url: bandUrl,\n text: this.#getViewLinkText(bandInfo.type),\n icon: { type: 'bandcamp' },\n target: '_blank'\n };\n\n if (contentLists.length > 1) {\n contentLists[1].title = UIHelper.constructListTitleWithLink(contentLists[1].title || '', viewBandExternalLink, false);\n }\n else {\n contentLists[0].title = UIHelper.constructListTitleWithLink(contentLists[0].title || '', viewBandExternalLink, true);\n }\n\n return {\n navigation: {\n prev: { uri: this.constructPrevUri() },\n info: header,\n lists: contentLists\n }\n };\n }\n\n async #getContentListsForArtist(artistUrl: string) {\n return [ await this.#getDiscographyList(artistUrl) ];\n }\n\n async #getContentListsForLabel(labelUrl: string): Promise {\n let contentsList;\n let viewLinkListItem: RenderedListItem;\n if (this.currentView.view === 'artists') {\n contentsList = await this.#getLabelArtistsList(labelUrl);\n const bandView: BandView = {\n name: 'band',\n bandUrl: labelUrl,\n view: 'discography'\n };\n viewLinkListItem = {\n service: 'bandcamp',\n type: 'item-no-menu',\n icon: 'fa fa-music',\n title: bandcamp.getI18n('BANDCAMP_DISCOGRAPHY'),\n uri: `${this.uri}/${ViewHelper.constructUriSegmentFromView(bandView)}`\n };\n }\n else {\n contentsList = await this.#getDiscographyList(labelUrl);\n const bandView: BandView = {\n name: 'band',\n bandUrl: labelUrl,\n view: 'artists'\n };\n viewLinkListItem = {\n service: 'bandcamp',\n type: 'item-no-menu',\n icon: 'fa fa-users',\n title: bandcamp.getI18n('BANDCAMP_LABEL_ARTISTS'),\n uri: `${this.uri}/${ViewHelper.constructUriSegmentFromView(bandView)}`\n };\n }\n const linksList: RenderedList = {\n availableListViews: [ 'list' ],\n items: [ viewLinkListItem ]\n };\n\n return [ linksList, contentsList ];\n }\n\n async #getDiscographyList(bandUrl: string): Promise {\n const view = this.currentView;\n const model = this.getModel(ModelType.Band);\n const albumRenderer = this.getRenderer(RendererType.Album);\n const trackRenderer = this.getRenderer(RendererType.Track);\n\n const modelParams: BandModelGetDiscographyParams = {\n bandUrl,\n limit: bandcamp.getConfigValue('itemsPerPage', 47)\n };\n\n if (view.pageRef) {\n modelParams.pageToken = view.pageRef.pageToken;\n modelParams.pageOffset = view.pageRef.pageOffset;\n }\n\n const discog = await model.getDiscography(modelParams);\n const listItems = discog.items.reduce((result, discogItem) => {\n let rendered;\n if (discogItem.type === 'album') {\n rendered = albumRenderer.renderToListItem(discogItem);\n }\n else { // Track\n rendered = trackRenderer.renderToListItem(discogItem, true, true, false);\n }\n if (rendered) {\n result.push(rendered);\n }\n return result;\n }, []);\n\n const nextPageRef = this.constructPageRef(discog.nextPageToken, discog.nextPageOffset);\n if (nextPageRef) {\n const nextUri = this.constructNextUri(nextPageRef);\n listItems.push(this.constructNextPageItem(nextUri));\n }\n\n return {\n title: bandcamp.getI18n('BANDCAMP_DISCOGRAPHY'),\n availableListViews: [ 'list', 'grid' ],\n items: listItems\n };\n }\n\n async #getLabelArtistsList(labelUrl: string): Promise {\n\n const modelParams: BandModelGetLabelArtistsParams = {\n labelUrl,\n limit: bandcamp.getConfigValue('itemsPerPage', 47)\n };\n\n if (this.currentView.pageRef) {\n modelParams.pageToken = this.currentView.pageRef.pageToken;\n modelParams.pageOffset = this.currentView.pageRef.pageOffset;\n }\n\n const artists = await this.getModel(ModelType.Band).getLabelArtists(modelParams);\n const artistRenderer = this.getRenderer(RendererType.Band);\n const listItems = artists.items.reduce((result, artist) => {\n const rendered = artistRenderer.renderToListItem(artist);\n if (rendered) {\n result.push(rendered);\n }\n return result;\n }, []);\n\n const nextPageRef = this.constructPageRef(artists.nextPageToken, artists.nextPageOffset);\n if (nextPageRef) {\n const nextUri = this.constructNextUri(nextPageRef);\n listItems.push(this.constructNextPageItem(nextUri));\n }\n\n return {\n title: bandcamp.getI18n('BANDCAMP_LABEL_ARTISTS'),\n availableListViews: [ 'list', 'grid' ],\n items: listItems\n };\n }\n\n #getViewLinkText(bandType: string) {\n switch (bandType) {\n case 'artist':\n return bandcamp.getI18n('BANDCAMP_VIEW_LINK_ARTIST');\n case 'label':\n return bandcamp.getI18n('BANDCAMP_VIEW_LINK_LABEL');\n default:\n return '';\n }\n }\n\n async getTracksOnExplode(): Promise {\n const bandUrl = this.currentView.bandUrl;\n if (!bandUrl) {\n throw Error('Band URL is missing');\n }\n\n const modelParams: BandModelGetDiscographyParams = {\n limit: 1,\n bandUrl\n };\n\n const discog = await this.getModel(ModelType.Band).getDiscography(modelParams);\n const first = discog.items[0] || {};\n if (first.type === 'track' && first.url) {\n const trackModel = this.getModel(ModelType.Track);\n return trackModel.getTrack(first.url);\n }\n else if (first.type === 'album' && first.url) {\n const albumModel = this.getModel(ModelType.Album);\n const album = await albumModel.getAlbum(first.url);\n return album.tracks || [];\n }\n\n return [];\n\n }\n}\n"]} \ No newline at end of file diff --git a/bandcamp/dist/lib/controller/browse/view-handlers/BaseViewHandler.d.ts b/bandcamp/dist/lib/controller/browse/view-handlers/BaseViewHandler.d.ts index deeed758e..ae8b312ba 100644 --- a/bandcamp/dist/lib/controller/browse/view-handlers/BaseViewHandler.d.ts +++ b/bandcamp/dist/lib/controller/browse/view-handlers/BaseViewHandler.d.ts @@ -1,25 +1,27 @@ import { ModelType } from '../../../model'; -import AlbumModel from '../../../model/AlbumModel'; -import ArticleModel from '../../../model/ArticleModel'; -import BandModel from '../../../model/BandModel'; -import DiscoverModel from '../../../model/DiscoverModel'; -import FanModel from '../../../model/FanModel'; -import SearchModel from '../../../model/SearchModel'; -import ShowModel from '../../../model/ShowModel'; -import TagModel from '../../../model/TagModel'; -import TrackModel from '../../../model/TrackModel'; -import { ExplodedTrackInfo } from './ExplodableViewHandler'; -import View, { PageRef } from './View'; -import ViewHandler, { RenderedPage } from './ViewHandler'; +import type AlbumModel from '../../../model/AlbumModel'; +import type ArticleModel from '../../../model/ArticleModel'; +import type BandModel from '../../../model/BandModel'; +import type DiscoverModel from '../../../model/DiscoverModel'; +import type FanModel from '../../../model/FanModel'; +import type SearchModel from '../../../model/SearchModel'; +import type ShowModel from '../../../model/ShowModel'; +import type TagModel from '../../../model/TagModel'; +import type TrackModel from '../../../model/TrackModel'; +import { type ExplodedTrackInfo } from './ExplodableViewHandler'; +import { type PageRef } from './View'; +import type View from './View'; +import { type RenderedPage } from './ViewHandler'; +import type ViewHandler from './ViewHandler'; import { RendererType } from './renderers'; -import AlbumRenderer from './renderers/AlbumRenderer'; -import ArticleRenderer from './renderers/ArticleRenderer'; -import BandRenderer from './renderers/BandRenderer'; -import { RenderedListItem } from './renderers/BaseRenderer'; -import SearchResultRenderer from './renderers/SearchResultParser'; -import ShowRenderer from './renderers/ShowRenderer'; -import TagRenderer from './renderers/TagRenderer'; -import TrackRenderer from './renderers/TrackRenderer'; +import type AlbumRenderer from './renderers/AlbumRenderer'; +import type ArticleRenderer from './renderers/ArticleRenderer'; +import type BandRenderer from './renderers/BandRenderer'; +import { type RenderedListItem } from './renderers/BaseRenderer'; +import type SearchResultRenderer from './renderers/SearchResultParser'; +import type ShowRenderer from './renderers/ShowRenderer'; +import type TagRenderer from './renderers/TagRenderer'; +import type TrackRenderer from './renderers/TrackRenderer'; export default class BaseViewHandler implements ViewHandler { #private; constructor(uri: string, currentView: V, previousViews: View[]); diff --git a/bandcamp/dist/lib/controller/browse/view-handlers/BaseViewHandler.d.ts.map b/bandcamp/dist/lib/controller/browse/view-handlers/BaseViewHandler.d.ts.map index 00702f101..1da17d74d 100644 --- a/bandcamp/dist/lib/controller/browse/view-handlers/BaseViewHandler.d.ts.map +++ b/bandcamp/dist/lib/controller/browse/view-handlers/BaseViewHandler.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"BaseViewHandler.d.ts","sourceRoot":"","sources":["../../../../../src/lib/controller/browse/view-handlers/BaseViewHandler.ts"],"names":[],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"BaseViewHandler.d.ts","sourceRoot":"","sources":["../../../../../src/lib/controller/browse/view-handlers/BaseViewHandler.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/bandcamp/dist/lib/controller/browse/view-handlers/BaseViewHandler.js b/bandcamp/dist/lib/controller/browse/view-handlers/BaseViewHandler.js index bcfc64158..b20ecfc05 100644 --- a/bandcamp/dist/lib/controller/browse/view-handlers/BaseViewHandler.js +++ b/bandcamp/dist/lib/controller/browse/view-handlers/BaseViewHandler.js @@ -15,13 +15,23 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? ( }) : function(o, v) { o["default"] = v; }); -var __importStar = (this && this.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; -}; +var __importStar = (this && this.__importStar) || (function () { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + __setModuleDefault(result, mod); + return result; + }; +})(); var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { if (kind === "m") throw new TypeError("Private method is not writable"); if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); @@ -55,8 +65,8 @@ class BaseViewHandler { __classPrivateFieldSet(this, _BaseViewHandler_models, {}, "f"); __classPrivateFieldSet(this, _BaseViewHandler_renderers, {}, "f"); } - async browse() { - return {}; + browse() { + return Promise.resolve({}); } explode() { throw Error('Operation not supported'); @@ -102,7 +112,7 @@ class BaseViewHandler { model = model_1.default.getInstance(model_1.ModelType.Track); break; default: - throw Error(`Unknown model type: ${type}`); + throw Error(`Unknown model type: ${String(type)}`); } __classPrivateFieldGet(this, _BaseViewHandler_models, "f")[type] = model; } @@ -134,7 +144,7 @@ class BaseViewHandler { renderer = renderers_1.default.getInstance(renderers_1.RendererType.Track, __classPrivateFieldGet(this, _BaseViewHandler_uri, "f"), __classPrivateFieldGet(this, _BaseViewHandler_currentView, "f"), __classPrivateFieldGet(this, _BaseViewHandler_previousViews, "f")); break; default: - throw Error(`Unknown renderer type: ${type}`); + throw Error(`Unknown renderer type: ${String(type)}`); } __classPrivateFieldGet(this, _BaseViewHandler_renderers, "f")[type] = renderer; } @@ -199,6 +209,6 @@ class BaseViewHandler { }; } } -exports.default = BaseViewHandler; _BaseViewHandler_uri = new WeakMap(), _BaseViewHandler_currentView = new WeakMap(), _BaseViewHandler_previousViews = new WeakMap(), _BaseViewHandler_models = new WeakMap(), _BaseViewHandler_renderers = new WeakMap(); +exports.default = BaseViewHandler; //# sourceMappingURL=BaseViewHandler.js.map \ No newline at end of file diff --git a/bandcamp/dist/lib/controller/browse/view-handlers/BaseViewHandler.js.map b/bandcamp/dist/lib/controller/browse/view-handlers/BaseViewHandler.js.map index 92f98937f..39e088d8c 100644 --- a/bandcamp/dist/lib/controller/browse/view-handlers/BaseViewHandler.js.map +++ b/bandcamp/dist/lib/controller/browse/view-handlers/BaseViewHandler.js.map @@ -1 +1 @@ -{"version":3,"file":"BaseViewHandler.js","sourceRoot":"","sources":["../../../../../src/lib/controller/browse/view-handlers/BaseViewHandler.ts"],"names":[],"mappings":"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","sourcesContent":["import Model, { ModelType } from '../../../model';\nimport AlbumModel from '../../../model/AlbumModel';\nimport ArticleModel from '../../../model/ArticleModel';\nimport BandModel from '../../../model/BandModel';\nimport BaseModel from '../../../model/BaseModel';\nimport DiscoverModel from '../../../model/DiscoverModel';\nimport FanModel from '../../../model/FanModel';\nimport SearchModel from '../../../model/SearchModel';\nimport ShowModel from '../../../model/ShowModel';\nimport TagModel from '../../../model/TagModel';\nimport TrackModel from '../../../model/TrackModel';\nimport UIHelper from '../../../util/UIHelper';\nimport { ExplodedTrackInfo } from './ExplodableViewHandler';\nimport View, { PageRef } from './View';\nimport ViewHandler, { RenderedPage } from './ViewHandler';\nimport ViewHelper from './ViewHelper';\nimport Renderer, { RendererType } from './renderers';\nimport AlbumRenderer from './renderers/AlbumRenderer';\nimport ArticleRenderer from './renderers/ArticleRenderer';\nimport BandRenderer from './renderers/BandRenderer';\nimport BaseRenderer, { RenderedListItem } from './renderers/BaseRenderer';\nimport SearchResultRenderer from './renderers/SearchResultParser';\nimport ShowRenderer from './renderers/ShowRenderer';\nimport TagRenderer from './renderers/TagRenderer';\nimport TrackRenderer from './renderers/TrackRenderer';\n\nexport default class BaseViewHandler implements ViewHandler {\n\n #uri: string;\n #currentView: V;\n #previousViews: View[];\n #models: Partial>;\n #renderers: Partial>>;\n\n constructor(uri: string, currentView: V, previousViews: View[]) {\n this.#uri = uri;\n this.#currentView = currentView;\n this.#previousViews = previousViews;\n this.#models = {};\n this.#renderers = {};\n }\n\n async browse(): Promise {\n return {};\n }\n\n explode(): Promise {\n throw Error('Operation not supported');\n }\n\n get uri(): string {\n return this.#uri;\n }\n\n get currentView(): V {\n return this.#currentView;\n }\n\n get previousViews(): View[] {\n return this.#previousViews;\n }\n\n getModel(type: ModelType.Album): AlbumModel;\n getModel(type: ModelType.Article): ArticleModel;\n getModel(type: ModelType.Band): BandModel;\n getModel(type: ModelType.Discover): DiscoverModel;\n getModel(type: ModelType.Fan): FanModel;\n getModel(type: ModelType.Search): SearchModel;\n getModel(type: ModelType.Show): ShowModel;\n getModel(type: ModelType.Tag): TagModel;\n getModel(type: ModelType.Track): TrackModel;\n getModel(type: ModelType) {\n if (!this.#models[type]) {\n let model;\n switch (type) {\n case ModelType.Album:\n model = Model.getInstance(ModelType.Album);\n break;\n case ModelType.Article:\n model = Model.getInstance(ModelType.Article);\n break;\n case ModelType.Band:\n model = Model.getInstance(ModelType.Band);\n break;\n case ModelType.Discover:\n model = Model.getInstance(ModelType.Discover);\n break;\n case ModelType.Fan:\n model = Model.getInstance(ModelType.Fan);\n break;\n case ModelType.Search:\n model = Model.getInstance(ModelType.Search);\n break;\n case ModelType.Show:\n model = Model.getInstance(ModelType.Show);\n break;\n case ModelType.Tag:\n model = Model.getInstance(ModelType.Tag);\n break;\n case ModelType.Track:\n model = Model.getInstance(ModelType.Track);\n break;\n default:\n throw Error(`Unknown model type: ${type}`);\n }\n this.#models[type] = model;\n }\n\n return this.#models[type];\n }\n\n getRenderer(type: RendererType.Album): AlbumRenderer;\n getRenderer(type: RendererType.Band): BandRenderer;\n getRenderer(type: RendererType.Article): ArticleRenderer;\n getRenderer(type: RendererType.SearchResult): SearchResultRenderer;\n getRenderer(type: RendererType.Show): ShowRenderer;\n getRenderer(type: RendererType.Tag): TagRenderer;\n getRenderer(type: RendererType.Track): TrackRenderer;\n getRenderer(type: RendererType) {\n if (!this.#renderers[type]) {\n let renderer;\n switch (type) {\n case RendererType.Album:\n renderer = Renderer.getInstance(RendererType.Album, this.#uri,\n this.#currentView, this.#previousViews);\n break;\n case RendererType.Band:\n renderer = Renderer.getInstance(RendererType.Band, this.#uri,\n this.#currentView, this.#previousViews);\n break;\n case RendererType.Article:\n renderer = Renderer.getInstance(RendererType.Article, this.#uri,\n this.#currentView, this.#previousViews);\n break;\n case RendererType.SearchResult:\n renderer = Renderer.getInstance(RendererType.SearchResult, this.#uri,\n this.#currentView, this.#previousViews);\n break;\n case RendererType.Show:\n renderer = Renderer.getInstance(RendererType.Show, this.#uri,\n this.#currentView, this.#previousViews);\n break;\n case RendererType.Tag:\n renderer = Renderer.getInstance(RendererType.Tag, this.#uri,\n this.#currentView, this.#previousViews);\n break;\n case RendererType.Track:\n renderer = Renderer.getInstance(RendererType.Track, this.#uri,\n this.#currentView, this.#previousViews);\n break;\n default:\n throw Error(`Unknown renderer type: ${type}`);\n }\n this.#renderers[type] = renderer;\n }\n return this.#renderers[type];\n }\n\n constructPrevUri(): string {\n const segments = this.#previousViews.map(((view) => ViewHelper.constructUriSegmentFromView(view)));\n\n const currentView = this.#currentView;\n if (currentView.pageRef) {\n const newView = { ...currentView };\n delete newView.pageRef;\n delete newView.prevPageRefs;\n\n if (currentView.prevPageRefs) {\n const prevPageRefs = [ ...currentView.prevPageRefs ];\n const prevPageRef = prevPageRefs.pop();\n if (prevPageRef && prevPageRefs.length > 0) {\n newView.prevPageRefs = prevPageRefs;\n }\n if (prevPageRef) {\n newView.pageRef = prevPageRef;\n }\n }\n\n segments.push(ViewHelper.constructUriSegmentFromView(newView));\n }\n\n return segments.join('/');\n }\n\n constructNextUri(nextPageRef: PageRef): string {\n const segments = this.#previousViews.map(((view) => ViewHelper.constructUriSegmentFromView(view)));\n\n const newView = { ...this.#currentView };\n if (this.#currentView.prevPageRefs) {\n newView.prevPageRefs = [ ...this.#currentView.prevPageRefs ];\n }\n else {\n newView.prevPageRefs = [];\n }\n if (newView.pageRef) {\n newView.prevPageRefs.push(newView.pageRef);\n }\n newView.pageRef = nextPageRef;\n\n segments.push(ViewHelper.constructUriSegmentFromView(newView));\n\n return segments.join('/');\n }\n\n constructNextPageItem(nextUri: string, title?: string): RenderedListItem {\n if (!title) {\n title = UIHelper.getMoreText();\n }\n return {\n service: 'bandcamp',\n type: 'item-no-menu',\n title,\n uri: `${nextUri}@noExplode=1`,\n icon: 'fa fa-arrow-circle-right'\n };\n }\n\n constructPageRef(pageToken?: string | null, pageOffset?: number): PageRef | null {\n if (!pageToken && !pageOffset) {\n return null;\n }\n return {\n pageToken: pageToken || '',\n pageOffset: pageOffset || 0\n };\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"BaseViewHandler.js","sourceRoot":"","sources":["../../../../../src/lib/controller/browse/view-handlers/BaseViewHandler.ts"],"names":[],"mappings":"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","sourcesContent":["import Model, { ModelType } from '../../../model';\nimport type AlbumModel from '../../../model/AlbumModel';\nimport type ArticleModel from '../../../model/ArticleModel';\nimport type BandModel from '../../../model/BandModel';\nimport type BaseModel from '../../../model/BaseModel';\nimport type DiscoverModel from '../../../model/DiscoverModel';\nimport type FanModel from '../../../model/FanModel';\nimport type SearchModel from '../../../model/SearchModel';\nimport type ShowModel from '../../../model/ShowModel';\nimport type TagModel from '../../../model/TagModel';\nimport type TrackModel from '../../../model/TrackModel';\nimport UIHelper from '../../../util/UIHelper';\nimport { type ExplodedTrackInfo } from './ExplodableViewHandler';\nimport {type PageRef} from './View';\nimport type View from './View';\nimport {type RenderedPage} from './ViewHandler';\nimport type ViewHandler from './ViewHandler';\nimport ViewHelper from './ViewHelper';\nimport Renderer, { RendererType } from './renderers';\nimport type AlbumRenderer from './renderers/AlbumRenderer';\nimport type ArticleRenderer from './renderers/ArticleRenderer';\nimport type BandRenderer from './renderers/BandRenderer';\nimport {type RenderedListItem} from './renderers/BaseRenderer';\nimport type BaseRenderer from './renderers/BaseRenderer';\nimport type SearchResultRenderer from './renderers/SearchResultParser';\nimport type ShowRenderer from './renderers/ShowRenderer';\nimport type TagRenderer from './renderers/TagRenderer';\nimport type TrackRenderer from './renderers/TrackRenderer';\n\nexport default class BaseViewHandler implements ViewHandler {\n\n #uri: string;\n #currentView: V;\n #previousViews: View[];\n #models: Partial>;\n #renderers: Partial>>;\n\n constructor(uri: string, currentView: V, previousViews: View[]) {\n this.#uri = uri;\n this.#currentView = currentView;\n this.#previousViews = previousViews;\n this.#models = {};\n this.#renderers = {};\n }\n\n browse(): Promise {\n return Promise.resolve({});\n }\n\n explode(): Promise {\n throw Error('Operation not supported');\n }\n\n get uri(): string {\n return this.#uri;\n }\n\n get currentView(): V {\n return this.#currentView;\n }\n\n get previousViews(): View[] {\n return this.#previousViews;\n }\n\n getModel(type: ModelType.Album): AlbumModel;\n getModel(type: ModelType.Article): ArticleModel;\n getModel(type: ModelType.Band): BandModel;\n getModel(type: ModelType.Discover): DiscoverModel;\n getModel(type: ModelType.Fan): FanModel;\n getModel(type: ModelType.Search): SearchModel;\n getModel(type: ModelType.Show): ShowModel;\n getModel(type: ModelType.Tag): TagModel;\n getModel(type: ModelType.Track): TrackModel;\n getModel(type: ModelType) {\n if (!this.#models[type]) {\n let model;\n switch (type) {\n case ModelType.Album:\n model = Model.getInstance(ModelType.Album);\n break;\n case ModelType.Article:\n model = Model.getInstance(ModelType.Article);\n break;\n case ModelType.Band:\n model = Model.getInstance(ModelType.Band);\n break;\n case ModelType.Discover:\n model = Model.getInstance(ModelType.Discover);\n break;\n case ModelType.Fan:\n model = Model.getInstance(ModelType.Fan);\n break;\n case ModelType.Search:\n model = Model.getInstance(ModelType.Search);\n break;\n case ModelType.Show:\n model = Model.getInstance(ModelType.Show);\n break;\n case ModelType.Tag:\n model = Model.getInstance(ModelType.Tag);\n break;\n case ModelType.Track:\n model = Model.getInstance(ModelType.Track);\n break;\n default:\n throw Error(`Unknown model type: ${String(type)}`);\n }\n this.#models[type] = model;\n }\n\n return this.#models[type];\n }\n\n getRenderer(type: RendererType.Album): AlbumRenderer;\n getRenderer(type: RendererType.Band): BandRenderer;\n getRenderer(type: RendererType.Article): ArticleRenderer;\n getRenderer(type: RendererType.SearchResult): SearchResultRenderer;\n getRenderer(type: RendererType.Show): ShowRenderer;\n getRenderer(type: RendererType.Tag): TagRenderer;\n getRenderer(type: RendererType.Track): TrackRenderer;\n getRenderer(type: RendererType) {\n if (!this.#renderers[type]) {\n let renderer;\n switch (type) {\n case RendererType.Album:\n renderer = Renderer.getInstance(RendererType.Album, this.#uri,\n this.#currentView, this.#previousViews);\n break;\n case RendererType.Band:\n renderer = Renderer.getInstance(RendererType.Band, this.#uri,\n this.#currentView, this.#previousViews);\n break;\n case RendererType.Article:\n renderer = Renderer.getInstance(RendererType.Article, this.#uri,\n this.#currentView, this.#previousViews);\n break;\n case RendererType.SearchResult:\n renderer = Renderer.getInstance(RendererType.SearchResult, this.#uri,\n this.#currentView, this.#previousViews);\n break;\n case RendererType.Show:\n renderer = Renderer.getInstance(RendererType.Show, this.#uri,\n this.#currentView, this.#previousViews);\n break;\n case RendererType.Tag:\n renderer = Renderer.getInstance(RendererType.Tag, this.#uri,\n this.#currentView, this.#previousViews);\n break;\n case RendererType.Track:\n renderer = Renderer.getInstance(RendererType.Track, this.#uri,\n this.#currentView, this.#previousViews);\n break;\n default:\n throw Error(`Unknown renderer type: ${String(type)}`);\n }\n this.#renderers[type] = renderer;\n }\n return this.#renderers[type];\n }\n\n constructPrevUri(): string {\n const segments = this.#previousViews.map(((view) => ViewHelper.constructUriSegmentFromView(view)));\n\n const currentView = this.#currentView;\n if (currentView.pageRef) {\n const newView = { ...currentView };\n delete newView.pageRef;\n delete newView.prevPageRefs;\n\n if (currentView.prevPageRefs) {\n const prevPageRefs = [ ...currentView.prevPageRefs ];\n const prevPageRef = prevPageRefs.pop();\n if (prevPageRef && prevPageRefs.length > 0) {\n newView.prevPageRefs = prevPageRefs;\n }\n if (prevPageRef) {\n newView.pageRef = prevPageRef;\n }\n }\n\n segments.push(ViewHelper.constructUriSegmentFromView(newView));\n }\n\n return segments.join('/');\n }\n\n constructNextUri(nextPageRef: PageRef): string {\n const segments = this.#previousViews.map(((view) => ViewHelper.constructUriSegmentFromView(view)));\n\n const newView = { ...this.#currentView };\n if (this.#currentView.prevPageRefs) {\n newView.prevPageRefs = [ ...this.#currentView.prevPageRefs ];\n }\n else {\n newView.prevPageRefs = [];\n }\n if (newView.pageRef) {\n newView.prevPageRefs.push(newView.pageRef);\n }\n newView.pageRef = nextPageRef;\n\n segments.push(ViewHelper.constructUriSegmentFromView(newView));\n\n return segments.join('/');\n }\n\n constructNextPageItem(nextUri: string, title?: string): RenderedListItem {\n if (!title) {\n title = UIHelper.getMoreText();\n }\n return {\n service: 'bandcamp',\n type: 'item-no-menu',\n title,\n uri: `${nextUri}@noExplode=1`,\n icon: 'fa fa-arrow-circle-right'\n };\n }\n\n constructPageRef(pageToken?: string | null, pageOffset?: number): PageRef | null {\n if (!pageToken && !pageOffset) {\n return null;\n }\n return {\n pageToken: pageToken || '',\n pageOffset: pageOffset || 0\n };\n }\n}\n"]} \ No newline at end of file diff --git a/bandcamp/dist/lib/controller/browse/view-handlers/DiscoverViewHandler.d.ts b/bandcamp/dist/lib/controller/browse/view-handlers/DiscoverViewHandler.d.ts index 598b36c88..be55730d7 100644 --- a/bandcamp/dist/lib/controller/browse/view-handlers/DiscoverViewHandler.d.ts +++ b/bandcamp/dist/lib/controller/browse/view-handlers/DiscoverViewHandler.d.ts @@ -1,19 +1,28 @@ -import BaseViewHandler from './BaseViewHandler'; -import View from './View'; -import { RenderedPage } from './ViewHandler'; +import type View from './View'; +import { type RenderedPage } from './ViewHandler'; +import ExplodableViewHandler from './ExplodableViewHandler'; +import type TrackEntity from '../../../entities/TrackEntity'; export interface DiscoverView extends View { name: 'discover'; - select?: 'genre' | 'subgenre' | 'sortBy' | 'artistRecommendationType' | 'location' | 'format' | 'time'; + select?: 'genre' | 'subgenre' | 'sortBy' | 'location' | 'category' | 'time' | 'relatedTag'; genre?: string; subgenre?: string; sortBy?: string; - artistRecommendationType?: string; location?: string; - format?: string; + category?: string; time?: string; + customTags?: string; } -export default class DiscoverViewHandler extends BaseViewHandler { +export default class DiscoverViewHandler extends ExplodableViewHandler { #private; browse(): Promise; + protected getTracksOnExplode(): Promise; + /** + * Override + * + * Add track uri: + * - bandcamp/album@albumUrl={...}@trackId={...}@artistUrl={...} + */ + getTrackUri(track: TrackEntity): string | null; } //# sourceMappingURL=DiscoverViewHandler.d.ts.map \ No newline at end of file diff --git a/bandcamp/dist/lib/controller/browse/view-handlers/DiscoverViewHandler.d.ts.map b/bandcamp/dist/lib/controller/browse/view-handlers/DiscoverViewHandler.d.ts.map index 2d8fec937..5b4b5985f 100644 --- a/bandcamp/dist/lib/controller/browse/view-handlers/DiscoverViewHandler.d.ts.map +++ b/bandcamp/dist/lib/controller/browse/view-handlers/DiscoverViewHandler.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"DiscoverViewHandler.d.ts","sourceRoot":"","sources":["../../../../../src/lib/controller/browse/view-handlers/DiscoverViewHandler.ts"],"names":[],"mappings":"AAEA,OAAO,eAAe,MAAM,mBAAmB,CAAC;AAChD,OAAO,IAAI,MAAM,QAAQ,CAAC;AAC1B,OAAO,EAAgB,YAAY,EAAE,MAAM,eAAe,CAAC;AAQ3D,MAAM,WAAW,YAAa,SAAQ,IAAI;IACxC,IAAI,EAAE,UAAU,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,GAAG,UAAU,GAAG,QAAQ,GAAG,0BAA0B,GACrE,UAAU,GAAG,QAAQ,GAAG,MAAM,CAAC;IAC/B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAClC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAYD,MAAM,CAAC,OAAO,OAAO,mBAAoB,SAAQ,eAAe,CAAC,YAAY,CAAC;;IAE5E,MAAM,IAAI,OAAO,CAAC,YAAY,CAAC;CA6PhC"} \ No newline at end of file +{"version":3,"file":"DiscoverViewHandler.d.ts","sourceRoot":"","sources":["../../../../../src/lib/controller/browse/view-handlers/DiscoverViewHandler.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,IAAI,MAAM,QAAQ,CAAC;AAC/B,OAAO,EAAqB,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AAOrE,OAAO,qBAAqB,MAAM,yBAAyB,CAAC;AAC5D,OAAO,KAAK,WAAW,MAAM,+BAA+B,CAAC;AAG7D,MAAM,WAAW,YAAa,SAAQ,IAAI;IACxC,IAAI,EAAE,UAAU,CAAC;IACjB,MAAM,CAAC,EAAE,OAAO,GAAG,UAAU,GAAG,QAAQ,GAAG,UAAU,GAAG,UAAU,GAAG,MAAM,GAAG,YAAY,CAAC;IAC3F,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAYD,MAAM,CAAC,OAAO,OAAO,mBAAoB,SAAQ,qBAAqB,CAAC,YAAY,CAAC;;IAElF,MAAM,IAAI,OAAO,CAAC,YAAY,CAAC;cAyWf,kBAAkB;IAgClC;;;;;OAKG;IACH,WAAW,CAAC,KAAK,EAAE,WAAW;CAqB/B"} \ No newline at end of file diff --git a/bandcamp/dist/lib/controller/browse/view-handlers/DiscoverViewHandler.js b/bandcamp/dist/lib/controller/browse/view-handlers/DiscoverViewHandler.js index 9c75a7289..9cda2dc3b 100644 --- a/bandcamp/dist/lib/controller/browse/view-handlers/DiscoverViewHandler.js +++ b/bandcamp/dist/lib/controller/browse/view-handlers/DiscoverViewHandler.js @@ -15,13 +15,23 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? ( }) : function(o, v) { o["default"] = v; }); -var __importStar = (this && this.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; -}; +var __importStar = (this && this.__importStar) || (function () { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + __setModuleDefault(result, mod); + return result; + }; +})(); var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); @@ -30,24 +40,24 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function ( var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; -var _DiscoverViewHandler_instances, _DiscoverViewHandler_browseDiscoverResult, _DiscoverViewHandler_getDiscoverParamsFromUriOrDefault, _DiscoverViewHandler_getParamsListFromDiscoverResult, _DiscoverViewHandler_getBrowseByTagsLink, _DiscoverViewHandler_getBrowseByTagsLinkData, _DiscoverViewHandler_getAlbumsListFromDiscoverResult, _DiscoverViewHandler_browseDiscoverOptions, _DiscoverViewHandler_constructDiscoverOptionUri, _DiscoverViewHandler_constructUriWithParams; +var _DiscoverViewHandler_instances, _DiscoverViewHandler_browseDiscoverResult, _DiscoverViewHandler_getDiscoverParamsFromUriOrDefault, _DiscoverViewHandler_getParamsListFromDiscoverResult, _DiscoverViewHandler_getBrowseByTagsLink, _DiscoverViewHandler_getBrowseByTagsLinkData, _DiscoverViewHandler_getAlbumsListFromDiscoverResult, _DiscoverViewHandler_browseDiscoverOptions, _DiscoverViewHandler_getDiscoverOptionListItems, _DiscoverViewHandler_getRelatedTagListItems, _DiscoverViewHandler_constructDiscoverOptionUri, _DiscoverViewHandler_constructUriWithParams; Object.defineProperty(exports, "__esModule", { value: true }); const BandcampContext_1 = __importDefault(require("../../../BandcampContext")); -const BaseViewHandler_1 = __importDefault(require("./BaseViewHandler")); const model_1 = require("../../../model"); const ViewHelper_1 = __importDefault(require("./ViewHelper")); const renderers_1 = require("./renderers"); const UIHelper_1 = __importStar(require("../../../util/UIHelper")); +const ExplodableViewHandler_1 = __importDefault(require("./ExplodableViewHandler")); const DISCOVER_OPTION_ICONS = { genre: 'fa fa-music', subgenre: 'fa fa-filter', sortBy: 'fa fa-sort', - artistRecommendationType: 'fa fa-thumbs-o-up', location: 'fa fa-map-marker', - format: 'fa fa-archive', - time: 'fa fa-clock-o' + category: 'fa fa-archive', + time: 'fa fa-clock-o', + relatedTag: 'fa fa-tag' }; -class DiscoverViewHandler extends BaseViewHandler_1.default { +class DiscoverViewHandler extends ExplodableViewHandler_1.default { constructor() { super(...arguments); _DiscoverViewHandler_instances.add(this); @@ -58,8 +68,61 @@ class DiscoverViewHandler extends BaseViewHandler_1.default { } return __classPrivateFieldGet(this, _DiscoverViewHandler_instances, "m", _DiscoverViewHandler_browseDiscoverResult).call(this); } + async getTracksOnExplode() { + const view = this.currentView; + const modelParams = { + discoverParams: __classPrivateFieldGet(this, _DiscoverViewHandler_instances, "m", _DiscoverViewHandler_getDiscoverParamsFromUriOrDefault).call(this), + limit: BandcampContext_1.default.getConfigValue('itemsPerPage', 47) + }; + const model = this.getModel(model_1.ModelType.Discover); + const discoverResults = await model.getDiscoverResult(modelParams); + const tracks = discoverResults.items.reduce((result, album) => { + const featured = album.featuredTrack; + if (featured?.streamUrl && featured.id) { + result.push({ + type: 'track', + id: featured.id, + name: featured.name, + url: album.url, + thumbnail: album.thumbnail, + artist: album.artist, + album: { + type: 'album', + name: album.name, + url: album.url + }, + streamUrl: featured.streamUrl + }); + } + return result; + }, []); + return tracks; + } + /** + * Override + * + * Add track uri: + * - bandcamp/album@albumUrl={...}@trackId={...}@artistUrl={...} + */ + getTrackUri(track) { + const artistUrl = track.artist?.url || null; + const albumUrl = track.album?.url || artistUrl; + if (track.album && albumUrl) { + const albumView = { + name: 'album', + albumUrl + }; + if (track.id) { + albumView.trackId = String(track.id); + } + if (artistUrl) { + albumView.artistUrl = artistUrl; + } + return `bandcamp/${ViewHelper_1.default.constructUriSegmentFromView(albumView)}`; + } + return super.getTrackUri(track); + } } -exports.default = DiscoverViewHandler; _DiscoverViewHandler_instances = new WeakSet(), _DiscoverViewHandler_browseDiscoverResult = async function _DiscoverViewHandler_browseDiscoverResult() { const view = this.currentView; const modelParams = { @@ -94,38 +157,59 @@ _DiscoverViewHandler_instances = new WeakSet(), _DiscoverViewHandler_browseDisco } if (view.sortBy) { params.sortBy = view.sortBy; - if (view.artistRecommendationType) { - params.artistRecommendationType = view.artistRecommendationType; - } } if (view.location) { - params.location = view.location; + params.location = Number(view.location); } - if (view.format) { - params.format = view.format; + if (view.category) { + params.category = Number(view.category); } if (view.time) { params.time = parseInt(view.time, 10); } + if (view.customTags) { + params.customTags = view.customTags.split(','); + } if (Object.keys(params).length) { return params; } const defaultParams = BandcampContext_1.default.getConfigValue('defaultDiscoverParams', null, true); return defaultParams || {}; -}, _DiscoverViewHandler_getParamsListFromDiscoverResult = function _DiscoverViewHandler_getParamsListFromDiscoverResult(params, discoverOptions) { +}, _DiscoverViewHandler_getParamsListFromDiscoverResult = function _DiscoverViewHandler_getParamsListFromDiscoverResult(_params, discoverOptions) { + const params = { ..._params }; + const defaultAllGenres = !params.genre && (!params.customTags || params.customTags.length === 0); + const defaultAllSubgenres = params.genre && !params.subgenre; const baseUri = __classPrivateFieldGet(this, _DiscoverViewHandler_instances, "m", _DiscoverViewHandler_constructUriWithParams).call(this, params); const listItems = []; - ['genre', 'subgenre', 'sortBy', 'artistRecommendationType', 'location', 'format', 'time'].forEach((o) => { + ['genre', 'subgenre', 'sortBy', 'location', 'category', 'time'].forEach((o) => { const paramValue = params[o]; - if (paramValue !== undefined) { - let optArr = discoverOptions[`${o}s`] || []; + if (paramValue !== undefined || (o === 'genre' && defaultAllGenres) || (o === 'subgenre' && defaultAllSubgenres)) { + let optKey; + switch (o) { + case 'category': + optKey = 'categories'; + break; + default: + optKey = `${o}s`; + } + let optArr = discoverOptions[optKey] || []; if (o === 'subgenre') { optArr = params.genre ? optArr[params.genre] || [] : []; } if (optArr.length) { const opts = optArr; const opt = opts.find((o) => o.value == paramValue); - const title = opt ? opt.name : opts[0].name; + let title; + if (o === 'genre' && defaultAllGenres) { + title = BandcampContext_1.default.getI18n('BANDCAMP_ALL_GENRES'); + } + else if (o === 'subgenre' && defaultAllSubgenres) { + const genre = discoverOptions.genres.find((g) => g.value === params.genre); + title = BandcampContext_1.default.getI18n('BANDCAMP_ALL_SUBGENRES', genre ? genre.name : params.genre); + } + else { + title = opt ? opt.name : opts[0].name; + } listItems.push({ service: 'bandcamp', type: 'item-no-menu', @@ -136,6 +220,15 @@ _DiscoverViewHandler_instances = new WeakSet(), _DiscoverViewHandler_browseDisco } } }); + if (params.customTags && params.customTags.length > 0) { + listItems.unshift({ + service: 'bandcamp', + type: 'item-no-menu', + title: BandcampContext_1.default.getI18n('BANDCAMP_SELECT_RELATEDTAG'), + icon: DISCOVER_OPTION_ICONS['relatedTag'], + uri: `${baseUri}@select=relatedTag` + }); + } const setDefaultJS = ` const params = ${JSON.stringify(params)}; const payload = { @@ -154,7 +247,13 @@ _DiscoverViewHandler_instances = new WeakSet(), _DiscoverViewHandler_browseDisco setDefaultLink, __classPrivateFieldGet(this, _DiscoverViewHandler_instances, "m", _DiscoverViewHandler_getBrowseByTagsLink).call(this) ]; - const title = UIHelper_1.default.constructListTitleWithLink(UIHelper_1.default.addBandcampIconToListTitle(BandcampContext_1.default.getI18n(this.currentView.inSection ? 'BANDCAMP_DISCOVER_SHORT' : 'BANDCAMP_DISCOVER')), links, true); + let title; + if (params.customTags && params.customTags.length > 0) { + title = params.customTags.join(', '); + } + else { + title = UIHelper_1.default.constructListTitleWithLink(UIHelper_1.default.addBandcampIconToListTitle(BandcampContext_1.default.getI18n(this.currentView.inSection ? 'BANDCAMP_DISCOVER_SHORT' : 'BANDCAMP_DISCOVER')), links, true); + } if (!UIHelper_1.default.supportsEnhancedTitles()) { // Compensate for loss of 'browse by tags' link const browseByTagsLinkData = __classPrivateFieldGet(this, _DiscoverViewHandler_instances, "m", _DiscoverViewHandler_getBrowseByTagsLinkData).call(this); @@ -213,9 +312,33 @@ _DiscoverViewHandler_instances = new WeakSet(), _DiscoverViewHandler_browseDisco if (!targetOption) { throw Error('Target option missing'); } + const listItems = await (targetOption === 'relatedTag' ? __classPrivateFieldGet(this, _DiscoverViewHandler_instances, "m", _DiscoverViewHandler_getRelatedTagListItems).call(this) : __classPrivateFieldGet(this, _DiscoverViewHandler_instances, "m", _DiscoverViewHandler_getDiscoverOptionListItems).call(this, targetOption)); + let title = BandcampContext_1.default.getI18n(`BANDCAMP_SELECT_${targetOption.toUpperCase()}`); + title = UIHelper_1.default.addIconToListTitle(DISCOVER_OPTION_ICONS[targetOption], title); + const lists = [{ + title, + availableListViews: ['list'], + items: listItems + }]; + return { + navigation: { + prev: { uri: this.constructPrevUri() }, + lists + } + }; +}, _DiscoverViewHandler_getDiscoverOptionListItems = async function _DiscoverViewHandler_getDiscoverOptionListItems(targetOption) { const discoverOptions = await this.getModel(model_1.ModelType.Discover).getDiscoverOptions(); - let optArr = discoverOptions[`${view.select}s`] || []; - if (view.select === 'subgenre' && optArr) { + let optKey; + switch (targetOption) { + case 'category': + optKey = 'categories'; + break; + default: + optKey = `${targetOption}s`; + } + let optArr = discoverOptions[optKey] || []; + const view = this.currentView; + if (targetOption === 'subgenre' && optArr) { optArr = view.genre ? optArr[view.genre] || [] : []; } const listItems = optArr.map((opt) => { @@ -232,19 +355,55 @@ _DiscoverViewHandler_instances = new WeakSet(), _DiscoverViewHandler_browseDisco uri: __classPrivateFieldGet(this, _DiscoverViewHandler_instances, "m", _DiscoverViewHandler_constructDiscoverOptionUri).call(this, targetOption, opt.value) }; }); - let title = BandcampContext_1.default.getI18n(`BANDCAMP_SELECT_${targetOption.toUpperCase()}`); - title = UIHelper_1.default.addIconToListTitle(DISCOVER_OPTION_ICONS[targetOption], title); - const lists = [{ + if (targetOption === 'genre') { + const isSelected = !view.genre; + let title = BandcampContext_1.default.getI18n('BANDCAMP_ALL_GENRES'); + if (isSelected) { + title = UIHelper_1.default.styleText(title, UIHelper_1.UI_STYLES.LIST_ITEM_SELECTED); + } + listItems.unshift({ + service: 'bandcamp', + type: 'item-no-menu', title, - availableListViews: ['list'], - items: listItems - }]; - return { - navigation: { - prev: { uri: this.constructPrevUri() }, - lists + icon: isSelected ? 'fa fa-check' : 'fa', + uri: __classPrivateFieldGet(this, _DiscoverViewHandler_instances, "m", _DiscoverViewHandler_constructDiscoverOptionUri).call(this, targetOption, undefined) + }); + } + if (targetOption === 'subgenre' && view.genre) { + const isSelected = !view.subgenre; + const genre = discoverOptions.genres.find((g) => g.value === view.genre); + let title = BandcampContext_1.default.getI18n('BANDCAMP_ALL_SUBGENRES', genre ? genre.name : view.genre); + if (isSelected) { + title = UIHelper_1.default.styleText(title, UIHelper_1.UI_STYLES.LIST_ITEM_SELECTED); } - }; + listItems.unshift({ + service: 'bandcamp', + type: 'item-no-menu', + title, + icon: isSelected ? 'fa fa-check' : 'fa', + uri: __classPrivateFieldGet(this, _DiscoverViewHandler_instances, "m", _DiscoverViewHandler_constructDiscoverOptionUri).call(this, targetOption, undefined) + }); + } + return listItems; +}, _DiscoverViewHandler_getRelatedTagListItems = async function _DiscoverViewHandler_getRelatedTagListItems() { + const view = this.currentView; + const customTags = view.customTags?.split(',') || []; + if (customTags.length === 0) { + throw Error('No target tags specified'); + } + const model = this.getModel(model_1.ModelType.Tag); + const relatedTags = model.getRelatedTags(customTags); + const listItems = (await relatedTags).map((tag) => { + const added = [...customTags, tag.value]; + return { + service: 'bandcamp', + type: 'item-no-menu', + title: tag.name, + icon: 'fa', + uri: __classPrivateFieldGet(this, _DiscoverViewHandler_instances, "m", _DiscoverViewHandler_constructDiscoverOptionUri).call(this, 'customTags', added.join(',')) + }; + }); + return listItems; }, _DiscoverViewHandler_constructDiscoverOptionUri = function _DiscoverViewHandler_constructDiscoverOptionUri(option, value) { const targetView = { ...this.currentView @@ -252,7 +411,12 @@ _DiscoverViewHandler_instances = new WeakSet(), _DiscoverViewHandler_browseDisco if (this.currentView[option] !== value) { delete targetView.pageRef; delete targetView.prevPageRefs; - targetView[option] = value; + if (value !== undefined) { + targetView[option] = value; + } + else { + delete targetView[option]; + } } delete targetView.select; return ViewHelper_1.default.constructUriFromViews([ @@ -269,4 +433,5 @@ _DiscoverViewHandler_instances = new WeakSet(), _DiscoverViewHandler_browseDisco targetView ]); }; +exports.default = DiscoverViewHandler; //# sourceMappingURL=DiscoverViewHandler.js.map \ No newline at end of file diff --git a/bandcamp/dist/lib/controller/browse/view-handlers/DiscoverViewHandler.js.map b/bandcamp/dist/lib/controller/browse/view-handlers/DiscoverViewHandler.js.map index 140b8a380..f4391c693 100644 --- a/bandcamp/dist/lib/controller/browse/view-handlers/DiscoverViewHandler.js.map +++ b/bandcamp/dist/lib/controller/browse/view-handlers/DiscoverViewHandler.js.map @@ -1 +1 @@ -{"version":3,"file":"DiscoverViewHandler.js","sourceRoot":"","sources":["../../../../../src/lib/controller/browse/view-handlers/DiscoverViewHandler.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,+EAAgD;AAChD,wEAAgD;AAGhD,0CAA2C;AAC3C,8DAAsC;AACtC,2CAA2C;AAG3C,mEAAqE;AAerE,MAAM,qBAAqB,GAA2B;IACpD,KAAK,EAAE,aAAa;IACpB,QAAQ,EAAE,cAAc;IACxB,MAAM,EAAE,YAAY;IACpB,wBAAwB,EAAE,mBAAmB;IAC7C,QAAQ,EAAE,kBAAkB;IAC5B,MAAM,EAAE,eAAe;IACvB,IAAI,EAAE,eAAe;CACtB,CAAC;AAEF,MAAqB,mBAAoB,SAAQ,yBAA6B;IAA9E;;;IA+PA,CAAC;IA7PC,MAAM;QACJ,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,EAAE;YAC3B,OAAO,uBAAA,IAAI,kFAAuB,MAA3B,IAAI,CAAyB,CAAC;SACtC;QAED,OAAO,uBAAA,IAAI,iFAAsB,MAA1B,IAAI,CAAwB,CAAC;IAEtC,CAAC;CAsPF;AA/PD,sCA+PC;4FApPC,KAAK;IACH,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC;IAC9B,MAAM,WAAW,GAA0C;QACzD,cAAc,EAAE,uBAAA,IAAI,8FAAmC,MAAvC,IAAI,CAAqC;QACzD,KAAK,EAAE,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,yBAAQ,CAAC,cAAc,CAAC,yBAAyB,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,yBAAQ,CAAC,cAAc,CAAC,cAAc,EAAE,EAAE,CAAC;KAC7H,CAAC;IAEF,IAAI,IAAI,CAAC,OAAO,EAAE;QAChB,WAAW,CAAC,SAAS,GAAG,IAAI,CAAC,OAAO,CAAC,SAAS,CAAC;QAC/C,WAAW,CAAC,UAAU,GAAG,IAAI,CAAC,OAAO,CAAC,UAAU,CAAC;KAClD;IAED,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,CAAC,iBAAS,CAAC,QAAQ,CAAC,CAAC;IAChD,MAAM,eAAe,GAAG,MAAM,KAAK,CAAC,iBAAiB,CAAC,WAAW,CAAC,CAAC;IACnE,MAAM,eAAe,GAAG,MAAM,KAAK,CAAC,kBAAkB,EAAE,CAAC;IACzD,MAAM,KAAK,GAAG;QACZ,uBAAA,IAAI,4FAAiC,MAArC,IAAI,EAAkC,eAAe,CAAC,MAAM,EAAE,eAAe,CAAC;QAC9E,uBAAA,IAAI,4FAAiC,MAArC,IAAI,EAAkC,eAAe,CAAC;KACvD,CAAC;IAEF,OAAO;QACL,UAAU,EAAE;YACV,IAAI,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,gBAAgB,EAAE,EAAE;YACtC,KAAK;SACN;KACF,CAAC;AACJ,CAAC;IAGC,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC;IAC9B,MAAM,MAAM,GAAmB,EAAE,CAAC;IAClC,IAAI,IAAI,CAAC,KAAK,EAAE;QACd,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC;QAE1B,IAAI,IAAI,CAAC,QAAQ,EAAE;YACjB,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;SACjC;KACF;IACD,IAAI,IAAI,CAAC,MAAM,EAAE;QACf,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;QAE5B,IAAI,IAAI,CAAC,wBAAwB,EAAE;YACjC,MAAM,CAAC,wBAAwB,GAAG,IAAI,CAAC,wBAAwB,CAAC;SACjE;KACF;IACD,IAAI,IAAI,CAAC,QAAQ,EAAE;QACjB,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;KACjC;IACD,IAAI,IAAI,CAAC,MAAM,EAAE;QACf,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC;KAC7B;IACD,IAAI,IAAI,CAAC,IAAI,EAAE;QACb,MAAM,CAAC,IAAI,GAAG,QAAQ,CAAC,IAAI,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;KACvC;IAED,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,MAAM,EAAE;QAC9B,OAAO,MAAM,CAAC;KACf;IAED,MAAM,aAAa,GAAG,yBAAQ,CAAC,cAAc,CAAC,uBAAuB,EAAE,IAAI,EAAE,IAAI,CAAC,CAAC;IACnF,OAAO,aAAa,IAAI,EAAE,CAAC;AAC7B,CAAC,uHAEgC,MAAsB,EAAE,eAAgC;IACvF,MAAM,OAAO,GAAG,uBAAA,IAAI,mFAAwB,MAA5B,IAAI,EAAyB,MAAM,CAAC,CAAC;IACrD,MAAM,SAAS,GAAuB,EAAE,CAAC;IACzC,CAAE,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,0BAA0B,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,CAAE,CAAC,OAAO,CAAC,CAAC,CAAC,EAAE,EAAE;QACxG,MAAM,UAAU,GAAG,MAAM,CAAC,CAAyB,CAAC,CAAC;QACrD,IAAI,UAAU,KAAK,SAAS,EAAE;YAC5B,IAAI,MAAM,GAAG,eAAe,CAAC,GAAG,CAAC,GAA4B,CAAC,IAAI,EAAE,CAAC;YACrE,IAAI,CAAC,KAAK,UAAU,EAAE;gBACpB,MAAM,GAAG,MAAM,CAAC,KAAK,CAAC,CAAC,CAAE,MAAuC,CAAC,MAAM,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAC3F;YACD,IAAI,MAAM,CAAC,MAAM,EAAE;gBACjB,MAAM,IAAI,GAAG,MAAoB,CAAC;gBAClC,MAAM,GAAG,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAM,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,IAAI,UAAU,CAAC,CAAC;gBACzD,MAAM,KAAK,GAAG,GAAG,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC;gBAC5C,SAAS,CAAC,IAAI,CAAC;oBACb,OAAO,EAAE,UAAU;oBACnB,IAAI,EAAE,cAAc;oBACpB,KAAK;oBACL,IAAI,EAAE,qBAAqB,CAAC,CAAC,CAAC;oBAC9B,GAAG,EAAE,GAAG,OAAO,WAAW,CAAC,EAAE;iBAC9B,CAAC,CAAC;aACJ;SACF;IACH,CAAC,CAAC,CAAC;IACH,MAAM,YAAY,GAAG;iCACQ,IAAI,CAAC,SAAS,CAAC,MAAM,CAAC;;;;;;0GAMmD,CAAC;IACvG,MAAM,cAAc,GAAW;QAC7B,GAAG,EAAE,GAAG;QACR,IAAI,EAAE,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,WAAW,EAAE;QACxC,IAAI,EAAE,yBAAQ,CAAC,OAAO,CAAC,sCAAsC,CAAC;QAC9D,OAAO,EAAE,YAAY,CAAC,OAAO,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC,OAAO,CAAC,WAAW,EAAE,EAAE,CAAC;KACvE,CAAC;IAEF,MAAM,KAAK,GAAG;QACZ,cAAc;QACd,uBAAA,IAAI,gFAAqB,MAAzB,IAAI,CAAuB;KAC5B,CAAC;IAEF,MAAM,KAAK,GAAG,kBAAQ,CAAC,0BAA0B,CAAC,kBAAQ,CAAC,0BAA0B,CAAC,yBAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,WAAW,CAAC,SAAS,CAAC,CAAC,CAAC,yBAAyB,CAAC,CAAC,CAAC,mBAAmB,CAAC,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;IAEpM,IAAI,CAAC,kBAAQ,CAAC,sBAAsB,EAAE,EAAE;QACtC,+CAA+C;QAC/C,MAAM,oBAAoB,GAAG,uBAAA,IAAI,oFAAyB,MAA7B,IAAI,CAA2B,CAAC;QAC7D,SAAS,CAAC,IAAI,CAAC;YACb,OAAO,EAAE,UAAU;YACnB,IAAI,EAAE,cAAc;YACpB,GAAG,EAAE,oBAAoB,CAAC,GAAG;YAC7B,KAAK,EAAE,oBAAoB,CAAC,IAAI;YAChC,IAAI,EAAE,0BAA0B;SACjC,CAAC,CAAC;KACJ;IAED,OAAO;QACL,KAAK;QACL,kBAAkB,EAAE,CAAE,MAAM,CAAE;QAC9B,KAAK,EAAE,SAAS;KACjB,CAAC;AACJ,CAAC;IAGC,MAAM,QAAQ,GAAG,uBAAA,IAAI,oFAAyB,MAA7B,IAAI,CAA2B,CAAC;IAEjD,OAAO;QACL,GAAG,EAAE,GAAG;QACR,IAAI,EAAE,QAAQ,CAAC,IAAI;QACnB,OAAO,EAAE,sEAAsE,QAAQ,CAAC,GAAG,KAAK;QAChG,IAAI,EAAE;YACJ,IAAI,EAAE,IAAI;YACV,KAAK,EAAE,0BAA0B;YACjC,KAAK,EAAE,OAAO;YACd,KAAK,EAAE,SAAS;SACjB;KACF,CAAC;AACJ,CAAC;IAGC,OAAO;QACL,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,MAAM;QACtB,IAAI,EAAE,yBAAQ,CAAC,OAAO,CAAC,yBAAyB,CAAC;KAClD,CAAC;AACJ,CAAC,uHAEgC,cAAuC;IACtE,MAAM,aAAa,GAAG,IAAI,CAAC,WAAW,CAAC,wBAAY,CAAC,KAAK,CAAC,CAAC;IAC3D,MAAM,SAAS,GAAG,cAAc,CAAC,KAAK,CAAC,MAAM,CAAqB,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE;QAClF,MAAM,QAAQ,GAAG,aAAa,CAAC,gBAAgB,CAAC,KAAK,CAAC,CAAC;QACvD,IAAI,QAAQ,EAAE;YACZ,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;SACvB;QACD,OAAO,MAAM,CAAC;IAChB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,MAAM,WAAW,GAAG,IAAI,CAAC,gBAAgB,CAAC,cAAc,CAAC,aAAa,EAAE,cAAc,CAAC,cAAc,CAAC,CAAC;IACvG,IAAI,WAAW,EAAE;QACf,MAAM,OAAO,GAAG,IAAI,CAAC,gBAAgB,CAAC,WAAW,CAAC,CAAC;QACnD,SAAS,CAAC,IAAI,CAAC,IAAI,CAAC,qBAAqB,CAAC,OAAO,CAAC,CAAC,CAAC;KACrD;IAED,OAAO;QACL,kBAAkB,EAAE,CAAE,MAAM,EAAE,MAAM,CAAE;QACtC,KAAK,EAAE,SAAS;KACjB,CAAC;AACJ,CAAC,+CAED,KAAK;IACH,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC;IAC9B,MAAM,YAAY,GAAG,IAAI,CAAC,MAAM,CAAC;IACjC,IAAI,CAAC,YAAY,EAAE;QACjB,MAAM,KAAK,CAAC,uBAAuB,CAAC,CAAC;KACtC;IAED,MAAM,eAAe,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,iBAAS,CAAC,QAAQ,CAAC,CAAC,kBAAkB,EAAE,CAAC;IACrF,IAAI,MAAM,GAAG,eAAe,CAAC,GAAG,IAAI,CAAC,MAAM,GAA4B,CAAC,IAAI,EAAE,CAAC;IAC/E,IAAI,IAAI,CAAC,MAAM,KAAK,UAAU,IAAI,MAAM,EAAE;QACxC,MAAM,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAE,MAAuC,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;KACvF;IACD,MAAM,SAAS,GAAI,MAAqB,CAAC,GAAG,CAAmB,CAAC,GAAG,EAAE,EAAE;QACrE,MAAM,UAAU,GAAG,GAAG,CAAC,KAAK,IAAI,IAAI,CAAC,IAAI,CAAC,MAA4B,CAAC,CAAC;QACxE,IAAI,KAAK,GAAG,GAAG,CAAC,IAAI,CAAC;QACrB,IAAI,UAAU,EAAE;YACd,KAAK,GAAG,kBAAQ,CAAC,SAAS,CAAC,KAAK,EAAE,oBAAS,CAAC,kBAAkB,CAAC,CAAC;SACjE;QAED,OAAO;YACL,OAAO,EAAE,UAAU;YACnB,IAAI,EAAE,cAAc;YACpB,KAAK;YACL,IAAI,EAAE,UAAU,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI;YACvC,GAAG,EAAE,uBAAA,IAAI,uFAA4B,MAAhC,IAAI,EAA6B,YAAY,EAAE,GAAG,CAAC,KAAK,CAAC;SAC/D,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,IAAI,KAAK,GAAG,yBAAQ,CAAC,OAAO,CAAC,mBAAmB,YAAY,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;IAC9E,KAAK,GAAG,kBAAQ,CAAC,kBAAkB,CAAC,qBAAqB,CAAC,YAAY,CAAC,EAAE,KAAK,CAAC,CAAC;IAChF,MAAM,KAAK,GAAmB,CAAE;YAC9B,KAAK;YACL,kBAAkB,EAAE,CAAE,MAAM,CAAE;YAC9B,KAAK,EAAE,SAAS;SACjB,CAAE,CAAC;IAEJ,OAAO;QACL,UAAU,EAAE;YACV,IAAI,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,gBAAgB,EAAE,EAAE;YACtC,KAAK;SACN;KACF,CAAC;AACJ,CAAC,6GAE2B,MAAc,EAAE,KAAa;IACvD,MAAM,UAAU,GAAG;QACjB,GAAG,IAAI,CAAC,WAAW;KACpB,CAAC;IACF,IAAI,IAAI,CAAC,WAAW,CAAC,MAAM,CAAC,KAAK,KAAK,EAAE;QACtC,OAAO,UAAU,CAAC,OAAO,CAAC;QAC1B,OAAO,UAAU,CAAC,YAAY,CAAC;QAC/B,UAAU,CAAC,MAAM,CAAC,GAAG,KAAK,CAAC;KAC5B;IACD,OAAO,UAAU,CAAC,MAAM,CAAC;IAEzB,OAAO,oBAAU,CAAC,qBAAqB,CAAC;QACtC,GAAG,IAAI,CAAC,aAAa;QACrB,UAAU;KACX,CAAC,CAAC;AACL,CAAC,qGAEuB,MAAc;IACpC,MAAM,UAAU,GAAG;QACjB,GAAG,IAAI,CAAC,WAAW;QACnB,GAAG,MAAM;KACV,CAAC;IACF,OAAO,oBAAU,CAAC,qBAAqB,CAAC;QACtC,GAAG,IAAI,CAAC,aAAa;QACrB,UAAU;KACX,CAAC,CAAC;AACL,CAAC","sourcesContent":["import { DiscoverOptions, DiscoverParams } from 'bandcamp-fetch';\nimport bandcamp from '../../../BandcampContext';\nimport BaseViewHandler from './BaseViewHandler';\nimport View from './View';\nimport { RenderedList, RenderedPage } from './ViewHandler';\nimport { ModelType } from '../../../model';\nimport ViewHelper from './ViewHelper';\nimport { RendererType } from './renderers';\nimport { RenderedListItem } from './renderers/BaseRenderer';\nimport { DiscoverLoopFetchResult, DiscoveryModelGetDiscoverResultParams } from '../../../model/DiscoverModel';\nimport UIHelper, { UILink, UI_STYLES } from '../../../util/UIHelper';\n\nexport interface DiscoverView extends View {\n name: 'discover';\n select?: 'genre' | 'subgenre' | 'sortBy' | 'artistRecommendationType' |\n 'location' | 'format' | 'time';\n genre?: string;\n subgenre?: string;\n sortBy?: string;\n artistRecommendationType?: string;\n location?: string;\n format?: string;\n time?: string;\n}\n\nconst DISCOVER_OPTION_ICONS: Record = {\n genre: 'fa fa-music',\n subgenre: 'fa fa-filter',\n sortBy: 'fa fa-sort',\n artistRecommendationType: 'fa fa-thumbs-o-up',\n location: 'fa fa-map-marker',\n format: 'fa fa-archive',\n time: 'fa fa-clock-o'\n};\n\nexport default class DiscoverViewHandler extends BaseViewHandler {\n\n browse(): Promise {\n if (this.currentView.select) {\n return this.#browseDiscoverOptions();\n }\n\n return this.#browseDiscoverResult();\n\n }\n\n async #browseDiscoverResult(): Promise {\n const view = this.currentView;\n const modelParams: DiscoveryModelGetDiscoverResultParams = {\n discoverParams: this.#getDiscoverParamsFromUriOrDefault(),\n limit: view.inSection ? bandcamp.getConfigValue('itemsPerSectionDiscover', 11) : bandcamp.getConfigValue('itemsPerPage', 47)\n };\n\n if (view.pageRef) {\n modelParams.pageToken = view.pageRef.pageToken;\n modelParams.pageOffset = view.pageRef.pageOffset;\n }\n\n const model = this.getModel(ModelType.Discover);\n const discoverResults = await model.getDiscoverResult(modelParams);\n const discoverOptions = await model.getDiscoverOptions();\n const lists = [\n this.#getParamsListFromDiscoverResult(discoverResults.params, discoverOptions),\n this.#getAlbumsListFromDiscoverResult(discoverResults)\n ];\n\n return {\n navigation: {\n prev: { uri: this.constructPrevUri() },\n lists\n }\n };\n }\n\n #getDiscoverParamsFromUriOrDefault(): DiscoverParams {\n const view = this.currentView;\n const params: DiscoverParams = {};\n if (view.genre) {\n params.genre = view.genre;\n\n if (view.subgenre) {\n params.subgenre = view.subgenre;\n }\n }\n if (view.sortBy) {\n params.sortBy = view.sortBy;\n\n if (view.artistRecommendationType) {\n params.artistRecommendationType = view.artistRecommendationType;\n }\n }\n if (view.location) {\n params.location = view.location;\n }\n if (view.format) {\n params.format = view.format;\n }\n if (view.time) {\n params.time = parseInt(view.time, 10);\n }\n\n if (Object.keys(params).length) {\n return params;\n }\n\n const defaultParams = bandcamp.getConfigValue('defaultDiscoverParams', null, true);\n return defaultParams || {};\n }\n\n #getParamsListFromDiscoverResult(params: DiscoverParams, discoverOptions: DiscoverOptions): RenderedList {\n const baseUri = this.#constructUriWithParams(params);\n const listItems: RenderedListItem[] = [];\n [ 'genre', 'subgenre', 'sortBy', 'artistRecommendationType', 'location', 'format', 'time' ].forEach((o) => {\n const paramValue = params[o as keyof DiscoverParams];\n if (paramValue !== undefined) {\n let optArr = discoverOptions[`${o}s` as keyof DiscoverOptions] || [];\n if (o === 'subgenre') {\n optArr = params.genre ? (optArr as DiscoverOptions['subgenres'])[params.genre] || [] : [];\n }\n if (optArr.length) {\n const opts = optArr as Array;\n const opt = opts.find((o: any) => o.value == paramValue);\n const title = opt ? opt.name : opts[0].name;\n listItems.push({\n service: 'bandcamp',\n type: 'item-no-menu',\n title,\n icon: DISCOVER_OPTION_ICONS[o],\n uri: `${baseUri}@select=${o}`\n });\n }\n }\n });\n const setDefaultJS = `\n const params = ${JSON.stringify(params)};\n const payload = {\n 'endpoint': 'music_service/bandcamp',\n 'method': 'saveDefaultDiscoverParams',\n 'data': params\n };\n angular.element('#browse-page').scope().browse.socketService.emit('callMethod', payload);`;\n const setDefaultLink: UILink = {\n url: '#',\n icon: { type: 'fa', class: 'fa fa-cog' },\n text: bandcamp.getI18n('BANDCAMP_SET_DEFAULT_DISCOVER_PARAMS'),\n onclick: setDefaultJS.replace(/\"/g, '"').replace(/\\r?\\n|\\r/g, '')\n };\n\n const links = [\n setDefaultLink,\n this.#getBrowseByTagsLink()\n ];\n\n const title = UIHelper.constructListTitleWithLink(UIHelper.addBandcampIconToListTitle(bandcamp.getI18n(this.currentView.inSection ? 'BANDCAMP_DISCOVER_SHORT' : 'BANDCAMP_DISCOVER')), links, true);\n\n if (!UIHelper.supportsEnhancedTitles()) {\n // Compensate for loss of 'browse by tags' link\n const browseByTagsLinkData = this.#getBrowseByTagsLinkData();\n listItems.push({\n service: 'bandcamp',\n type: 'item-no-menu',\n uri: browseByTagsLinkData.uri,\n title: browseByTagsLinkData.text,\n icon: 'fa fa-arrow-circle-right'\n });\n }\n\n return {\n title,\n availableListViews: [ 'list' ],\n items: listItems\n };\n }\n\n #getBrowseByTagsLink(): UILink {\n const linkData = this.#getBrowseByTagsLinkData();\n\n return {\n url: '#',\n text: linkData.text,\n onclick: `angular.element('#browse-page').scope().browse.fetchLibrary({uri: '${linkData.uri}'})`,\n icon: {\n type: 'fa',\n class: 'fa fa-arrow-circle-right',\n float: 'right',\n color: '#54c688'\n }\n };\n }\n\n #getBrowseByTagsLinkData() {\n return {\n uri: `${this.uri}/tag`,\n text: bandcamp.getI18n('BANDCAMP_BROWSE_BY_TAGS')\n };\n }\n\n #getAlbumsListFromDiscoverResult(discoverResult: DiscoverLoopFetchResult): RenderedList {\n const albumRenderer = this.getRenderer(RendererType.Album);\n const listItems = discoverResult.items.reduce((result, album) => {\n const rendered = albumRenderer.renderToListItem(album);\n if (rendered) {\n result.push(rendered);\n }\n return result;\n }, []);\n\n const nextPageRef = this.constructPageRef(discoverResult.nextPageToken, discoverResult.nextPageOffset);\n if (nextPageRef) {\n const nextUri = this.constructNextUri(nextPageRef);\n listItems.push(this.constructNextPageItem(nextUri));\n }\n\n return {\n availableListViews: [ 'list', 'grid' ],\n items: listItems\n };\n }\n\n async #browseDiscoverOptions(): Promise {\n const view = this.currentView;\n const targetOption = view.select;\n if (!targetOption) {\n throw Error('Target option missing');\n }\n\n const discoverOptions = await this.getModel(ModelType.Discover).getDiscoverOptions();\n let optArr = discoverOptions[`${view.select}s` as keyof DiscoverOptions] || [];\n if (view.select === 'subgenre' && optArr) {\n optArr = view.genre ? (optArr as DiscoverOptions['subgenres'])[view.genre] || [] : [];\n }\n const listItems = (optArr as Array).map((opt) => {\n const isSelected = opt.value == view[view.select as keyof DiscoverView];\n let title = opt.name;\n if (isSelected) {\n title = UIHelper.styleText(title, UI_STYLES.LIST_ITEM_SELECTED);\n }\n\n return {\n service: 'bandcamp',\n type: 'item-no-menu',\n title,\n icon: isSelected ? 'fa fa-check' : 'fa',\n uri: this.#constructDiscoverOptionUri(targetOption, opt.value)\n };\n });\n\n let title = bandcamp.getI18n(`BANDCAMP_SELECT_${targetOption.toUpperCase()}`);\n title = UIHelper.addIconToListTitle(DISCOVER_OPTION_ICONS[targetOption], title);\n const lists: RenderedList[] = [ {\n title,\n availableListViews: [ 'list' ],\n items: listItems\n } ];\n\n return {\n navigation: {\n prev: { uri: this.constructPrevUri() },\n lists\n }\n };\n }\n\n #constructDiscoverOptionUri(option: string, value: string) {\n const targetView = {\n ...this.currentView\n };\n if (this.currentView[option] !== value) {\n delete targetView.pageRef;\n delete targetView.prevPageRefs;\n targetView[option] = value;\n }\n delete targetView.select;\n\n return ViewHelper.constructUriFromViews([\n ...this.previousViews,\n targetView\n ]);\n }\n\n #constructUriWithParams(params: object) {\n const targetView = {\n ...this.currentView,\n ...params\n };\n return ViewHelper.constructUriFromViews([\n ...this.previousViews,\n targetView\n ]);\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"DiscoverViewHandler.js","sourceRoot":"","sources":["../../../../../src/lib/controller/browse/view-handlers/DiscoverViewHandler.ts"],"names":[],"mappings":"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","sourcesContent":["import { type DiscoverOptions, type DiscoverParams } from 'bandcamp-fetch';\nimport bandcamp from '../../../BandcampContext';\nimport type View from './View';\nimport { type RenderedList, type RenderedPage } from './ViewHandler';\nimport { ModelType } from '../../../model';\nimport ViewHelper from './ViewHelper';\nimport { RendererType } from './renderers';\nimport { type RenderedListItem } from './renderers/BaseRenderer';\nimport { type DiscoverLoopFetchResult, type DiscoveryModelGetDiscoverResultParams } from '../../../model/DiscoverModel';\nimport UIHelper, { type UILink, UI_STYLES } from '../../../util/UIHelper';\nimport ExplodableViewHandler from './ExplodableViewHandler';\nimport type TrackEntity from '../../../entities/TrackEntity';\nimport { type AlbumView } from './AlbumViewHandler';\n\nexport interface DiscoverView extends View {\n name: 'discover';\n select?: 'genre' | 'subgenre' | 'sortBy' | 'location' | 'category' | 'time' | 'relatedTag';\n genre?: string;\n subgenre?: string;\n sortBy?: string;\n location?: string;\n category?: string;\n time?: string;\n customTags?: string;\n}\n\nconst DISCOVER_OPTION_ICONS: Record = {\n genre: 'fa fa-music',\n subgenre: 'fa fa-filter',\n sortBy: 'fa fa-sort',\n location: 'fa fa-map-marker',\n category: 'fa fa-archive',\n time: 'fa fa-clock-o',\n relatedTag: 'fa fa-tag'\n};\n\nexport default class DiscoverViewHandler extends ExplodableViewHandler {\n\n browse(): Promise {\n if (this.currentView.select) {\n return this.#browseDiscoverOptions();\n }\n\n return this.#browseDiscoverResult();\n\n }\n\n async #browseDiscoverResult(): Promise {\n const view = this.currentView;\n const modelParams: DiscoveryModelGetDiscoverResultParams = {\n discoverParams: this.#getDiscoverParamsFromUriOrDefault(),\n limit: view.inSection ? bandcamp.getConfigValue('itemsPerSectionDiscover', 11) : bandcamp.getConfigValue('itemsPerPage', 47)\n };\n\n if (view.pageRef) {\n modelParams.pageToken = view.pageRef.pageToken;\n modelParams.pageOffset = view.pageRef.pageOffset;\n }\n\n const model = this.getModel(ModelType.Discover);\n const discoverResults = await model.getDiscoverResult(modelParams);\n const discoverOptions = await model.getDiscoverOptions();\n const lists = [\n this.#getParamsListFromDiscoverResult(discoverResults.params, discoverOptions),\n this.#getAlbumsListFromDiscoverResult(discoverResults)\n ];\n\n return {\n navigation: {\n prev: { uri: this.constructPrevUri() },\n lists\n }\n };\n }\n\n #getDiscoverParamsFromUriOrDefault(): DiscoverParams {\n const view = this.currentView;\n const params: DiscoverParams = {};\n if (view.genre) {\n params.genre = view.genre;\n\n if (view.subgenre) {\n params.subgenre = view.subgenre;\n }\n }\n if (view.sortBy) {\n params.sortBy = view.sortBy;\n }\n if (view.location) {\n params.location = Number(view.location);\n }\n if (view.category) {\n params.category = Number(view.category);\n }\n if (view.time) {\n params.time = parseInt(view.time, 10);\n }\n if (view.customTags) {\n params.customTags = view.customTags.split(',');\n }\n\n if (Object.keys(params).length) {\n return params;\n }\n\n const defaultParams = bandcamp.getConfigValue('defaultDiscoverParams', null, true);\n return defaultParams || {};\n }\n\n #getParamsListFromDiscoverResult(_params: DiscoverParams, discoverOptions: DiscoverOptions): RenderedList {\n const params = {..._params};\n const defaultAllGenres = !params.genre && (!params.customTags || params.customTags.length === 0);\n const defaultAllSubgenres = params.genre && !params.subgenre;\n const baseUri = this.#constructUriWithParams(params);\n const listItems: RenderedListItem[] = [];\n [ 'genre', 'subgenre', 'sortBy', 'location', 'category', 'time' ].forEach((o) => {\n const paramValue = params[o as keyof DiscoverParams];\n if (paramValue !== undefined || (o === 'genre' && defaultAllGenres) || (o === 'subgenre' && defaultAllSubgenres)) {\n let optKey;\n switch (o) {\n case 'category':\n optKey = 'categories';\n break;\n default:\n optKey = `${o}s`;\n }\n let optArr = discoverOptions[optKey as keyof DiscoverOptions] || [];\n if (o === 'subgenre') {\n optArr = params.genre ? (optArr as DiscoverOptions['subgenres'])[params.genre] || [] : [];\n }\n if (optArr.length) {\n const opts = optArr as Array;\n const opt = opts.find((o: any) => o.value == paramValue);\n let title;\n if (o === 'genre' && defaultAllGenres) {\n title = bandcamp.getI18n('BANDCAMP_ALL_GENRES');\n }\n else if (o === 'subgenre' && defaultAllSubgenres) {\n const genre = discoverOptions.genres.find((g) => g.value === params.genre);\n title = bandcamp.getI18n('BANDCAMP_ALL_SUBGENRES', genre ? genre.name : params.genre);\n }\n else {\n title = opt ? opt.name : opts[0].name;\n }\n listItems.push({\n service: 'bandcamp',\n type: 'item-no-menu',\n title,\n icon: DISCOVER_OPTION_ICONS[o],\n uri: `${baseUri}@select=${o}`\n });\n }\n }\n });\n if (params.customTags && params.customTags.length > 0) {\n listItems.unshift({\n service: 'bandcamp',\n type: 'item-no-menu',\n title: bandcamp.getI18n('BANDCAMP_SELECT_RELATEDTAG'),\n icon: DISCOVER_OPTION_ICONS['relatedTag'],\n uri: `${baseUri}@select=relatedTag`\n });\n }\n const setDefaultJS = `\n const params = ${JSON.stringify(params)};\n const payload = {\n 'endpoint': 'music_service/bandcamp',\n 'method': 'saveDefaultDiscoverParams',\n 'data': params\n };\n angular.element('#browse-page').scope().browse.socketService.emit('callMethod', payload);`;\n const setDefaultLink: UILink = {\n url: '#',\n icon: { type: 'fa', class: 'fa fa-cog' },\n text: bandcamp.getI18n('BANDCAMP_SET_DEFAULT_DISCOVER_PARAMS'),\n onclick: setDefaultJS.replace(/\"/g, '"').replace(/\\r?\\n|\\r/g, '')\n };\n\n const links = [\n setDefaultLink,\n this.#getBrowseByTagsLink()\n ];\n\n let title;\n if (params.customTags && params.customTags.length > 0) {\n title = params.customTags.join(', ');\n }\n else {\n title = UIHelper.constructListTitleWithLink(UIHelper.addBandcampIconToListTitle(bandcamp.getI18n(this.currentView.inSection ? 'BANDCAMP_DISCOVER_SHORT' : 'BANDCAMP_DISCOVER')), links, true);\n }\n\n if (!UIHelper.supportsEnhancedTitles()) {\n // Compensate for loss of 'browse by tags' link\n const browseByTagsLinkData = this.#getBrowseByTagsLinkData();\n listItems.push({\n service: 'bandcamp',\n type: 'item-no-menu',\n uri: browseByTagsLinkData.uri,\n title: browseByTagsLinkData.text,\n icon: 'fa fa-arrow-circle-right'\n });\n }\n\n return {\n title,\n availableListViews: [ 'list' ],\n items: listItems\n };\n }\n\n #getBrowseByTagsLink(): UILink {\n const linkData = this.#getBrowseByTagsLinkData();\n\n return {\n url: '#',\n text: linkData.text,\n onclick: `angular.element('#browse-page').scope().browse.fetchLibrary({uri: '${linkData.uri}'})`,\n icon: {\n type: 'fa',\n class: 'fa fa-arrow-circle-right',\n float: 'right',\n color: '#54c688'\n }\n };\n }\n\n #getBrowseByTagsLinkData() {\n return {\n uri: `${this.uri}/tag`,\n text: bandcamp.getI18n('BANDCAMP_BROWSE_BY_TAGS')\n };\n }\n\n #getAlbumsListFromDiscoverResult(discoverResult: DiscoverLoopFetchResult): RenderedList {\n const albumRenderer = this.getRenderer(RendererType.Album);\n const listItems = discoverResult.items.reduce((result, album) => {\n const rendered = albumRenderer.renderToListItem(album);\n if (rendered) {\n result.push(rendered);\n }\n return result;\n }, []);\n\n const nextPageRef = this.constructPageRef(discoverResult.nextPageToken, discoverResult.nextPageOffset);\n if (nextPageRef) {\n const nextUri = this.constructNextUri(nextPageRef);\n listItems.push(this.constructNextPageItem(nextUri));\n }\n\n return {\n availableListViews: [ 'list', 'grid' ],\n items: listItems\n };\n }\n\n async #browseDiscoverOptions(): Promise {\n const view = this.currentView;\n const targetOption = view.select;\n if (!targetOption) {\n throw Error('Target option missing');\n }\n\n const listItems = await (targetOption === 'relatedTag' ? this.#getRelatedTagListItems() : this.#getDiscoverOptionListItems(targetOption));\n let title = bandcamp.getI18n(`BANDCAMP_SELECT_${targetOption.toUpperCase()}`);\n title = UIHelper.addIconToListTitle(DISCOVER_OPTION_ICONS[targetOption], title);\n const lists: RenderedList[] = [ {\n title,\n availableListViews: [ 'list' ],\n items: listItems\n } ];\n\n return {\n navigation: {\n prev: { uri: this.constructPrevUri() },\n lists\n }\n };\n }\n\n async #getDiscoverOptionListItems(targetOption: Required>) {\n const discoverOptions = await this.getModel(ModelType.Discover).getDiscoverOptions();\n let optKey;\n switch (targetOption) {\n case 'category':\n optKey = 'categories';\n break;\n default:\n optKey = `${targetOption}s`;\n }\n let optArr = discoverOptions[optKey as keyof DiscoverOptions] || [];\n const view = this.currentView;\n if (targetOption === 'subgenre' && optArr) {\n optArr = view.genre ? (optArr as DiscoverOptions['subgenres'])[view.genre] || [] : [];\n }\n const listItems = (optArr as Array).map((opt) => {\n const isSelected = opt.value == view[view.select as keyof DiscoverView];\n let title = opt.name;\n if (isSelected) {\n title = UIHelper.styleText(title, UI_STYLES.LIST_ITEM_SELECTED);\n }\n\n return {\n service: 'bandcamp',\n type: 'item-no-menu',\n title,\n icon: isSelected ? 'fa fa-check' : 'fa',\n uri: this.#constructDiscoverOptionUri(targetOption as string, opt.value)\n };\n });\n\n if (targetOption === 'genre') {\n const isSelected = !view.genre;\n let title = bandcamp.getI18n('BANDCAMP_ALL_GENRES');\n if (isSelected) {\n title = UIHelper.styleText(title, UI_STYLES.LIST_ITEM_SELECTED);\n }\n listItems.unshift({\n service: 'bandcamp',\n type: 'item-no-menu',\n title,\n icon: isSelected ? 'fa fa-check' : 'fa',\n uri: this.#constructDiscoverOptionUri(targetOption as string, undefined)\n });\n }\n\n if (targetOption === 'subgenre' && view.genre) {\n const isSelected = !view.subgenre;\n const genre = discoverOptions.genres.find((g) => g.value === view.genre);\n let title = bandcamp.getI18n('BANDCAMP_ALL_SUBGENRES', genre ? genre.name : view.genre);\n if (isSelected) {\n title = UIHelper.styleText(title, UI_STYLES.LIST_ITEM_SELECTED);\n }\n listItems.unshift({\n service: 'bandcamp',\n type: 'item-no-menu',\n title,\n icon: isSelected ? 'fa fa-check' : 'fa',\n uri: this.#constructDiscoverOptionUri(targetOption as string, undefined)\n });\n }\n\n return listItems;\n }\n\n async #getRelatedTagListItems() {\n const view = this.currentView;\n const customTags = view.customTags?.split(',') || [];\n if (customTags.length === 0) {\n throw Error('No target tags specified');\n }\n const model = this.getModel(ModelType.Tag);\n const relatedTags = model.getRelatedTags(customTags);\n const listItems = (await relatedTags).map((tag) => {\n const added = [ ...customTags, tag.value ];\n return {\n service: 'bandcamp',\n type: 'item-no-menu',\n title: tag.name,\n icon: 'fa',\n uri: this.#constructDiscoverOptionUri('customTags', added.join(','))\n };\n });\n\n return listItems;\n }\n\n #constructDiscoverOptionUri(option: string, value?: string) {\n const targetView = {\n ...this.currentView\n };\n if (this.currentView[option] !== value) {\n delete targetView.pageRef;\n delete targetView.prevPageRefs;\n if (value !== undefined) {\n targetView[option] = value;\n }\n else {\n delete targetView[option];\n }\n }\n delete targetView.select;\n\n return ViewHelper.constructUriFromViews([\n ...this.previousViews,\n targetView\n ]);\n }\n\n #constructUriWithParams(params: object) {\n const targetView = {\n ...this.currentView,\n ...params\n };\n return ViewHelper.constructUriFromViews([\n ...this.previousViews,\n targetView\n ]);\n }\n\n protected async getTracksOnExplode() {\n const view = this.currentView;\n const modelParams: DiscoveryModelGetDiscoverResultParams = {\n discoverParams: this.#getDiscoverParamsFromUriOrDefault(),\n limit: bandcamp.getConfigValue('itemsPerPage', 47)\n };\n const model = this.getModel(ModelType.Discover);\n const discoverResults = await model.getDiscoverResult(modelParams);\n const tracks = discoverResults.items.reduce((result, album) => {\n const featured = album.featuredTrack;\n if (featured?.streamUrl && featured.id) {\n result.push({\n type: 'track',\n id: featured.id,\n name: featured.name,\n url: album.url,\n thumbnail: album.thumbnail,\n artist: album.artist,\n album: {\n type: 'album',\n name: album.name,\n url: album.url\n },\n streamUrl: featured.streamUrl\n });\n }\n return result;\n }, []);\n\n return tracks;\n }\n\n /**\n * Override\n *\n * Add track uri:\n * - bandcamp/album@albumUrl={...}@trackId={...}@artistUrl={...}\n */\n getTrackUri(track: TrackEntity) {\n const artistUrl = track.artist?.url || null;\n const albumUrl = track.album?.url || artistUrl;\n\n if (track.album && albumUrl) {\n const albumView: AlbumView = {\n name: 'album',\n albumUrl\n };\n if (track.id) {\n albumView.trackId = String(track.id);\n }\n if (artistUrl) {\n albumView.artistUrl = artistUrl;\n }\n\n return `bandcamp/${ViewHelper.constructUriSegmentFromView(albumView)}`;\n }\n\n return super.getTrackUri(track);\n }\n}\n"]} \ No newline at end of file diff --git a/bandcamp/dist/lib/controller/browse/view-handlers/ExplodableViewHandler.d.ts b/bandcamp/dist/lib/controller/browse/view-handlers/ExplodableViewHandler.d.ts index 34c25dc8b..1c01eb286 100644 --- a/bandcamp/dist/lib/controller/browse/view-handlers/ExplodableViewHandler.d.ts +++ b/bandcamp/dist/lib/controller/browse/view-handlers/ExplodableViewHandler.d.ts @@ -1,6 +1,6 @@ import BaseViewHandler from './BaseViewHandler'; -import View from './View'; -import TrackEntity from '../../../entities/TrackEntity'; +import type View from './View'; +import type TrackEntity from '../../../entities/TrackEntity'; export interface ExplodedTrackInfo { service: 'bandcamp'; uri: string; diff --git a/bandcamp/dist/lib/controller/browse/view-handlers/ExplodableViewHandler.d.ts.map b/bandcamp/dist/lib/controller/browse/view-handlers/ExplodableViewHandler.d.ts.map index a89645ff9..abbfaa850 100644 --- a/bandcamp/dist/lib/controller/browse/view-handlers/ExplodableViewHandler.d.ts.map +++ b/bandcamp/dist/lib/controller/browse/view-handlers/ExplodableViewHandler.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"ExplodableViewHandler.d.ts","sourceRoot":"","sources":["../../../../../src/lib/controller/browse/view-handlers/ExplodableViewHandler.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,MAAM,mBAAmB,CAAC;AAChD,OAAO,IAAI,MAAM,QAAQ,CAAC;AAE1B,OAAO,WAAW,MAAM,+BAA+B,CAAC;AAIxD,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,UAAU,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,CAAC,OAAO,CAAC,QAAQ,OAAO,qBAAqB,CAAC,CAAC,SAAS,IAAI,EAAE,CAAC,SAAS,WAAW,GAAG,WAAW,CAAE,SAAQ,eAAe,CAAC,CAAC,CAAC;IAE3H,OAAO,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;cAgB7B,oBAAoB,CAAC,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;IAkBjF,SAAS,CAAC,QAAQ,CAAC,kBAAkB,IAAI,OAAO,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;IAEzD;;;OAGG;IACH,SAAS,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;CAmB/B"} \ No newline at end of file +{"version":3,"file":"ExplodableViewHandler.d.ts","sourceRoot":"","sources":["../../../../../src/lib/controller/browse/view-handlers/ExplodableViewHandler.ts"],"names":[],"mappings":"AAAA,OAAO,eAAe,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,IAAI,MAAM,QAAQ,CAAC;AAE/B,OAAO,KAAK,WAAW,MAAM,+BAA+B,CAAC;AAI7D,MAAM,WAAW,iBAAiB;IAChC,OAAO,EAAE,UAAU,CAAC;IACpB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,CAAC,OAAO,CAAC,QAAQ,OAAO,qBAAqB,CAAC,CAAC,SAAS,IAAI,EAAE,CAAC,SAAS,WAAW,GAAG,WAAW,CAAE,SAAQ,eAAe,CAAC,CAAC,CAAC;IAE3H,OAAO,IAAI,OAAO,CAAC,iBAAiB,EAAE,CAAC;IAgB7C,SAAS,CAAC,oBAAoB,CAAC,KAAK,EAAE,CAAC,GAAG,OAAO,CAAC,iBAAiB,GAAG,IAAI,CAAC;IAkB3E,SAAS,CAAC,QAAQ,CAAC,kBAAkB,IAAI,OAAO,CAAC,CAAC,GAAG,CAAC,EAAE,CAAC;IAEzD;;;OAGG;IACH,SAAS,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;CAmB/B"} \ No newline at end of file diff --git a/bandcamp/dist/lib/controller/browse/view-handlers/ExplodableViewHandler.js b/bandcamp/dist/lib/controller/browse/view-handlers/ExplodableViewHandler.js index a85595db9..e1facf2f0 100644 --- a/bandcamp/dist/lib/controller/browse/view-handlers/ExplodableViewHandler.js +++ b/bandcamp/dist/lib/controller/browse/view-handlers/ExplodableViewHandler.js @@ -20,13 +20,13 @@ class ExplodableViewHandler extends BaseViewHandler_1.default { const trackInfoPromises = tracks.map((track) => this.parseTrackForExplode(track)); return (await Promise.all(trackInfoPromises)).filter((song) => song); } - async parseTrackForExplode(track) { + parseTrackForExplode(track) { const trackUri = this.getTrackUri(track); if (!trackUri) { - return null; + return Promise.resolve(null); } const trackName = track.streamUrl ? track.name : UIHelper_1.default.addNonPlayableText(track.name); - return { + return Promise.resolve({ service: 'bandcamp', uri: trackUri, albumart: track.thumbnail, @@ -35,7 +35,7 @@ class ExplodableViewHandler extends BaseViewHandler_1.default { name: trackName, title: trackName, duration: track.duration - }; + }); } /** * Track uri: diff --git a/bandcamp/dist/lib/controller/browse/view-handlers/ExplodableViewHandler.js.map b/bandcamp/dist/lib/controller/browse/view-handlers/ExplodableViewHandler.js.map index b7597d9cc..35f751bee 100644 --- a/bandcamp/dist/lib/controller/browse/view-handlers/ExplodableViewHandler.js.map +++ b/bandcamp/dist/lib/controller/browse/view-handlers/ExplodableViewHandler.js.map @@ -1 +1 @@ -{"version":3,"file":"ExplodableViewHandler.js","sourceRoot":"","sources":["../../../../../src/lib/controller/browse/view-handlers/ExplodableViewHandler.ts"],"names":[],"mappings":";;;;;AAAA,wEAAgD;AAEhD,sEAA8C;AAG9C,8DAAsC;AActC,MAA8B,qBAA2E,SAAQ,yBAAkB;IAEjI,KAAK,CAAC,OAAO;QACX,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC;QAC9B,IAAI,IAAI,CAAC,SAAS,EAAE;YAClB,OAAO,EAAE,CAAC;SACX;QAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC/C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE;YAC1B,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;YAC1D,OAAO,SAAS,CAAC,CAAC,CAAC,CAAE,SAAS,CAAE,CAAC,CAAC,CAAC,EAAE,CAAC;SACvC;QAED,MAAM,iBAAiB,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC,CAAC;QAClF,OAAO,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAwB,CAAC;IAC9F,CAAC;IAES,KAAK,CAAC,oBAAoB,CAAC,KAAQ;QAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QACzC,IAAI,CAAC,QAAQ,EAAE;YACb,OAAO,IAAI,CAAC;SACb;QACD,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,kBAAQ,CAAC,kBAAkB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACzF,OAAO;YACL,OAAO,EAAE,UAAU;YACnB,GAAG,EAAE,QAAQ;YACb,QAAQ,EAAE,KAAK,CAAC,SAAS;YACzB,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,IAAI;YAC1B,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,IAAI;YACxB,IAAI,EAAE,SAAS;YACf,KAAK,EAAE,SAAS;YAChB,QAAQ,EAAE,KAAK,CAAC,QAAQ;SACzB,CAAC;IACJ,CAAC;IAID;;;OAGG;IACO,WAAW,CAAC,KAAQ;QAC5B,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE;YACd,OAAO,IAAI,CAAC;SACb;QACD,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,EAAE,GAAG,IAAI,IAAI,CAAC;QAC5C,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,EAAE,GAAG,IAAI,SAAS,CAAC;QAC/C,MAAM,SAAS,GAAc;YAC3B,IAAI,EAAE,OAAO;YACb,QAAQ,EAAE,KAAK,CAAC,GAAG;SACpB,CAAC;QACF,IAAI,SAAS,EAAE;YACb,SAAS,CAAC,SAAS,GAAG,SAAS,CAAC;SACjC;QACD,IAAI,QAAQ,EAAE;YACZ,SAAS,CAAC,QAAQ,GAAG,QAAQ,CAAC;SAC/B;QAED,OAAO,YAAY,oBAAU,CAAC,2BAA2B,CAAC,SAAS,CAAC,EAAE,CAAC;IACzE,CAAC;CACF;AA7DD,wCA6DC","sourcesContent":["import BaseViewHandler from './BaseViewHandler';\nimport View from './View';\nimport UIHelper from '../../../util/UIHelper';\nimport TrackEntity from '../../../entities/TrackEntity';\nimport { TrackView } from './TrackViewHandler';\nimport ViewHelper from './ViewHelper';\n\nexport interface ExplodedTrackInfo {\n service: 'bandcamp';\n uri: string;\n albumart?: string;\n artist?: string;\n album?: string;\n name: string;\n title: string;\n duration?: number;\n samplerate?: string;\n}\n\nexport default abstract class ExplodableViewHandler extends BaseViewHandler {\n\n async explode(): Promise {\n const view = this.currentView;\n if (view.noExplode) {\n return [];\n }\n\n const tracks = await this.getTracksOnExplode();\n if (!Array.isArray(tracks)) {\n const trackInfo = await this.parseTrackForExplode(tracks);\n return trackInfo ? [ trackInfo ] : [];\n }\n\n const trackInfoPromises = tracks.map((track) => this.parseTrackForExplode(track));\n return (await Promise.all(trackInfoPromises)).filter((song) => song) as ExplodedTrackInfo[];\n }\n\n protected async parseTrackForExplode(track: E): Promise {\n const trackUri = this.getTrackUri(track);\n if (!trackUri) {\n return null;\n }\n const trackName = track.streamUrl ? track.name : UIHelper.addNonPlayableText(track.name);\n return {\n service: 'bandcamp',\n uri: trackUri,\n albumart: track.thumbnail,\n artist: track.artist?.name,\n album: track.album?.name,\n name: trackName,\n title: trackName,\n duration: track.duration\n };\n }\n\n protected abstract getTracksOnExplode(): Promise;\n\n /**\n * Track uri:\n * bandcamp/track@trackUrl={trackUrl}@artistUrl={...}@albumUrl={...}\n */\n protected getTrackUri(track: E) {\n if (!track.url) {\n return null;\n }\n const artistUrl = track.artist?.url || null;\n const albumUrl = track.album?.url || artistUrl;\n const trackView: TrackView = {\n name: 'track',\n trackUrl: track.url\n };\n if (artistUrl) {\n trackView.artistUrl = artistUrl;\n }\n if (albumUrl) {\n trackView.albumUrl = albumUrl;\n }\n\n return `bandcamp/${ViewHelper.constructUriSegmentFromView(trackView)}`;\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"ExplodableViewHandler.js","sourceRoot":"","sources":["../../../../../src/lib/controller/browse/view-handlers/ExplodableViewHandler.ts"],"names":[],"mappings":";;;;;AAAA,wEAAgD;AAEhD,sEAA8C;AAG9C,8DAAsC;AActC,MAA8B,qBAA2E,SAAQ,yBAAkB;IAEjI,KAAK,CAAC,OAAO;QACX,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC;QAC9B,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACnB,OAAO,EAAE,CAAC;QACZ,CAAC;QAED,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,kBAAkB,EAAE,CAAC;QAC/C,IAAI,CAAC,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;YAC3B,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,oBAAoB,CAAC,MAAM,CAAC,CAAC;YAC1D,OAAO,SAAS,CAAC,CAAC,CAAC,CAAE,SAAS,CAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QACxC,CAAC;QAED,MAAM,iBAAiB,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,oBAAoB,CAAC,KAAK,CAAC,CAAC,CAAC;QAClF,OAAO,CAAC,MAAM,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAwB,CAAC;IAC9F,CAAC;IAES,oBAAoB,CAAC,KAAQ;QACrC,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,KAAK,CAAC,CAAC;QACzC,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,OAAO,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC;QAC/B,CAAC;QACD,MAAM,SAAS,GAAG,KAAK,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,kBAAQ,CAAC,kBAAkB,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QACzF,OAAO,OAAO,CAAC,OAAO,CAAC;YACrB,OAAO,EAAE,UAAU;YACnB,GAAG,EAAE,QAAQ;YACb,QAAQ,EAAE,KAAK,CAAC,SAAS;YACzB,MAAM,EAAE,KAAK,CAAC,MAAM,EAAE,IAAI;YAC1B,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE,IAAI;YACxB,IAAI,EAAE,SAAS;YACf,KAAK,EAAE,SAAS;YAChB,QAAQ,EAAE,KAAK,CAAC,QAAQ;SACzB,CAAC,CAAC;IACL,CAAC;IAID;;;OAGG;IACO,WAAW,CAAC,KAAQ;QAC5B,IAAI,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC;YACf,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,SAAS,GAAG,KAAK,CAAC,MAAM,EAAE,GAAG,IAAI,IAAI,CAAC;QAC5C,MAAM,QAAQ,GAAG,KAAK,CAAC,KAAK,EAAE,GAAG,IAAI,SAAS,CAAC;QAC/C,MAAM,SAAS,GAAc;YAC3B,IAAI,EAAE,OAAO;YACb,QAAQ,EAAE,KAAK,CAAC,GAAG;SACpB,CAAC;QACF,IAAI,SAAS,EAAE,CAAC;YACd,SAAS,CAAC,SAAS,GAAG,SAAS,CAAC;QAClC,CAAC;QACD,IAAI,QAAQ,EAAE,CAAC;YACb,SAAS,CAAC,QAAQ,GAAG,QAAQ,CAAC;QAChC,CAAC;QAED,OAAO,YAAY,oBAAU,CAAC,2BAA2B,CAAC,SAAS,CAAC,EAAE,CAAC;IACzE,CAAC;CACF;AA7DD,wCA6DC","sourcesContent":["import BaseViewHandler from './BaseViewHandler';\nimport type View from './View';\nimport UIHelper from '../../../util/UIHelper';\nimport type TrackEntity from '../../../entities/TrackEntity';\nimport { type TrackView } from './TrackViewHandler';\nimport ViewHelper from './ViewHelper';\n\nexport interface ExplodedTrackInfo {\n service: 'bandcamp';\n uri: string;\n albumart?: string;\n artist?: string;\n album?: string;\n name: string;\n title: string;\n duration?: number;\n samplerate?: string;\n}\n\nexport default abstract class ExplodableViewHandler extends BaseViewHandler {\n\n async explode(): Promise {\n const view = this.currentView;\n if (view.noExplode) {\n return [];\n }\n\n const tracks = await this.getTracksOnExplode();\n if (!Array.isArray(tracks)) {\n const trackInfo = await this.parseTrackForExplode(tracks);\n return trackInfo ? [ trackInfo ] : [];\n }\n\n const trackInfoPromises = tracks.map((track) => this.parseTrackForExplode(track));\n return (await Promise.all(trackInfoPromises)).filter((song) => song) as ExplodedTrackInfo[];\n }\n\n protected parseTrackForExplode(track: E): Promise {\n const trackUri = this.getTrackUri(track);\n if (!trackUri) {\n return Promise.resolve(null);\n }\n const trackName = track.streamUrl ? track.name : UIHelper.addNonPlayableText(track.name);\n return Promise.resolve({\n service: 'bandcamp',\n uri: trackUri,\n albumart: track.thumbnail,\n artist: track.artist?.name,\n album: track.album?.name,\n name: trackName,\n title: trackName,\n duration: track.duration\n });\n }\n\n protected abstract getTracksOnExplode(): Promise;\n\n /**\n * Track uri:\n * bandcamp/track@trackUrl={trackUrl}@artistUrl={...}@albumUrl={...}\n */\n protected getTrackUri(track: E) {\n if (!track.url) {\n return null;\n }\n const artistUrl = track.artist?.url || null;\n const albumUrl = track.album?.url || artistUrl;\n const trackView: TrackView = {\n name: 'track',\n trackUrl: track.url\n };\n if (artistUrl) {\n trackView.artistUrl = artistUrl;\n }\n if (albumUrl) {\n trackView.albumUrl = albumUrl;\n }\n\n return `bandcamp/${ViewHelper.constructUriSegmentFromView(trackView)}`;\n }\n}\n"]} \ No newline at end of file diff --git a/bandcamp/dist/lib/controller/browse/view-handlers/FanViewHandler.d.ts b/bandcamp/dist/lib/controller/browse/view-handlers/FanViewHandler.d.ts index 369292c67..7b58710ad 100644 --- a/bandcamp/dist/lib/controller/browse/view-handlers/FanViewHandler.d.ts +++ b/bandcamp/dist/lib/controller/browse/view-handlers/FanViewHandler.d.ts @@ -1,6 +1,6 @@ import BaseViewHandler from './BaseViewHandler'; -import View from './View'; -import { RenderedPage } from './ViewHandler'; +import type View from './View'; +import { type RenderedPage } from './ViewHandler'; export interface FanView extends View { name: 'fan'; username: string; diff --git a/bandcamp/dist/lib/controller/browse/view-handlers/FanViewHandler.d.ts.map b/bandcamp/dist/lib/controller/browse/view-handlers/FanViewHandler.d.ts.map index 633c7399d..9aeb5b997 100644 --- a/bandcamp/dist/lib/controller/browse/view-handlers/FanViewHandler.d.ts.map +++ b/bandcamp/dist/lib/controller/browse/view-handlers/FanViewHandler.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"FanViewHandler.d.ts","sourceRoot":"","sources":["../../../../../src/lib/controller/browse/view-handlers/FanViewHandler.ts"],"names":[],"mappings":"AAGA,OAAO,eAAe,MAAM,mBAAmB,CAAC;AAChD,OAAO,IAAI,MAAM,QAAQ,CAAC;AAC1B,OAAO,EAAgB,YAAY,EAAE,MAAM,eAAe,CAAC;AAO3D,MAAM,WAAW,OAAQ,SAAQ,IAAI;IACnC,IAAI,EAAE,KAAK,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,YAAY,GAAG,UAAU,GAAG,2BAA2B,GAAG,iBAAiB,CAAC;CACpF;AAED,MAAM,CAAC,OAAO,OAAO,cAAe,SAAQ,eAAe,CAAC,OAAO,CAAC;;IAElE,MAAM,IAAI,OAAO,CAAC,YAAY,CAAC;CAkMhC"} \ No newline at end of file +{"version":3,"file":"FanViewHandler.d.ts","sourceRoot":"","sources":["../../../../../src/lib/controller/browse/view-handlers/FanViewHandler.ts"],"names":[],"mappings":"AAGA,OAAO,eAAe,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,IAAI,MAAM,QAAQ,CAAC;AAC/B,OAAO,EAAqB,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AAOrE,MAAM,WAAW,OAAQ,SAAQ,IAAI;IACnC,IAAI,EAAE,KAAK,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,YAAY,GAAG,UAAU,GAAG,2BAA2B,GAAG,iBAAiB,CAAC;CACpF;AAED,MAAM,CAAC,OAAO,OAAO,cAAe,SAAQ,eAAe,CAAC,OAAO,CAAC;;IAElE,MAAM,IAAI,OAAO,CAAC,YAAY,CAAC;CAkMhC"} \ No newline at end of file diff --git a/bandcamp/dist/lib/controller/browse/view-handlers/FanViewHandler.js b/bandcamp/dist/lib/controller/browse/view-handlers/FanViewHandler.js index 4f21ce180..fc09285c0 100644 --- a/bandcamp/dist/lib/controller/browse/view-handlers/FanViewHandler.js +++ b/bandcamp/dist/lib/controller/browse/view-handlers/FanViewHandler.js @@ -35,7 +35,6 @@ class FanViewHandler extends BaseViewHandler_1.default { } } } -exports.default = FanViewHandler; _FanViewHandler_instances = new WeakSet(), _FanViewHandler_browseList = async function _FanViewHandler_browseList() { const view = this.currentView; const modelParams = { @@ -202,4 +201,5 @@ _FanViewHandler_instances = new WeakSet(), _FanViewHandler_browseList = async fu link: viewProfileLink }); }; +exports.default = FanViewHandler; //# sourceMappingURL=FanViewHandler.js.map \ No newline at end of file diff --git a/bandcamp/dist/lib/controller/browse/view-handlers/FanViewHandler.js.map b/bandcamp/dist/lib/controller/browse/view-handlers/FanViewHandler.js.map index c4ba0c05f..8be295312 100644 --- a/bandcamp/dist/lib/controller/browse/view-handlers/FanViewHandler.js.map +++ b/bandcamp/dist/lib/controller/browse/view-handlers/FanViewHandler.js.map @@ -1 +1 @@ -{"version":3,"file":"FanViewHandler.js","sourceRoot":"","sources":["../../../../../src/lib/controller/browse/view-handlers/FanViewHandler.ts"],"names":[],"mappings":"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","sourcesContent":["import { Fan } from 'bandcamp-fetch';\nimport bandcamp from '../../../BandcampContext';\nimport { ModelType } from '../../../model';\nimport BaseViewHandler from './BaseViewHandler';\nimport View from './View';\nimport { RenderedList, RenderedPage } from './ViewHandler';\nimport { RendererType } from './renderers';\nimport { RenderedListItem } from './renderers/BaseRenderer';\nimport UIHelper, { UILink } from '../../../util/UIHelper';\nimport { FanModelGetFanItemsParams } from '../../../model/FanModel';\nimport ViewHelper from './ViewHelper';\n\nexport interface FanView extends View {\n name: 'fan';\n username: string;\n view?: 'collection' | 'wishlist' | 'followingArtistsAndLabels' | 'followingGenres';\n}\n\nexport default class FanViewHandler extends BaseViewHandler {\n\n browse(): Promise {\n if (!this.currentView.username) {\n throw Error('Username missing');\n }\n switch (this.currentView.view) {\n case 'collection':\n case 'wishlist':\n case 'followingArtistsAndLabels':\n case 'followingGenres':\n return this.#browseList();\n default:\n return this.#browseSummary();\n }\n }\n\n async #browseList(): Promise {\n const view = this.currentView;\n const modelParams: FanModelGetFanItemsParams = {\n username: view.username,\n limit: bandcamp.getConfigValue('itemsPerPage', 47)\n };\n\n if (view.pageRef) {\n modelParams.pageToken = view.pageRef.pageToken;\n modelParams.pageOffset = view.pageRef.pageOffset;\n }\n\n let fanItems;\n const model = this.getModel(ModelType.Fan);\n switch (view.view) {\n case 'collection':\n fanItems = await model.getCollection(modelParams);\n break;\n case 'wishlist':\n fanItems = await model.getWishlist(modelParams);\n break;\n case 'followingArtistsAndLabels':\n fanItems = await model.getFollowingArtistsAndLabels(modelParams);\n break;\n case 'followingGenres':\n fanItems = await model.getFollowingGenres(modelParams);\n break;\n default:\n throw Error(`Unknown view type: ${view.view}`);\n }\n\n const albumRenderer = this.getRenderer(RendererType.Album);\n const trackRenderer = this.getRenderer(RendererType.Track);\n const bandRenderer = this.getRenderer(RendererType.Band);\n const tagRenderer = this.getRenderer(RendererType.Tag);\n\n const listItems: RenderedListItem[] = [];\n fanItems.items.forEach((item) => {\n let rendered;\n switch (item.type) {\n case 'album':\n rendered = albumRenderer.renderToListItem(item);\n break;\n case 'artistOrLabel':\n rendered = bandRenderer.renderToListItem(item);\n break;\n case 'tag':\n rendered = tagRenderer.renderGenreListItem(item);\n break;\n case 'track':\n rendered = trackRenderer.renderToListItem(item, true, true);\n break;\n default:\n rendered = null;\n }\n if (rendered) {\n listItems.push(rendered);\n }\n });\n\n const nextPageRef = this.constructPageRef(fanItems.nextPageToken, fanItems.nextPageOffset);\n if (nextPageRef) {\n const nextUri = this.constructNextUri(nextPageRef);\n listItems.push(this.constructNextPageItem(nextUri));\n }\n\n const fanItemsList: RenderedList = {\n availableListViews: [ 'list', 'grid' ],\n items: listItems\n };\n const fanInfo = await model.getInfo(view.username);\n const fanItemsListTitle = this.#getTitle(fanInfo);\n if (fanItemsListTitle) {\n fanItemsList.title = fanItemsListTitle;\n }\n\n return {\n navigation: {\n prev: { uri: this.constructPrevUri() },\n lists: [ fanItemsList ]\n }\n };\n }\n\n async #browseSummary(): Promise {\n const username = this.currentView.username;\n const baseUri = this.uri;\n const baseImgPath = 'music_service/mpd/';\n const fanInfo = await this.getModel(ModelType.Fan).getInfo(username);\n const fanView: FanView = {\n name: 'fan',\n username\n };\n const summaryItems: RenderedListItem[] = [\n {\n 'service': 'bandcamp',\n 'type': 'item-no-menu',\n 'title': bandcamp.getI18n('BANDCAMP_COLLECTION', fanInfo.collectionItemCount),\n 'albumart': `/albumart?sourceicon=${baseImgPath}musiclibraryicon.png`,\n 'uri': `${baseUri}/${ViewHelper.constructUriSegmentFromView({...fanView, view: 'collection'})}`\n },\n {\n 'service': 'bandcamp',\n 'type': 'item-no-menu',\n 'title': bandcamp.getI18n('BANDCAMP_WISHLIST', fanInfo.wishlistItemCount),\n 'albumart': `/albumart?sourceicon=${baseImgPath}favouritesicon.png`,\n 'uri': `${baseUri}/${ViewHelper.constructUriSegmentFromView({...fanView, view: 'wishlist'})}`\n },\n {\n 'service': 'bandcamp',\n 'type': 'item-no-menu',\n 'title': bandcamp.getI18n('BANDCAMP_FOLLOWING_ARTISTS_AND_LABELS', fanInfo.followingArtistsAndLabelsCount),\n 'albumart': `/albumart?sourceicon=${baseImgPath}artisticon.png`,\n 'uri': `${baseUri}/${ViewHelper.constructUriSegmentFromView({...fanView, view: 'followingArtistsAndLabels'})}`\n },\n {\n 'service': 'bandcamp',\n 'type': 'item-no-menu',\n 'title': bandcamp.getI18n('BANDCAMP_FOLLOWING_GENRES', fanInfo.followingGenresCount),\n 'albumart': `/albumart?sourceicon=${baseImgPath}genreicon.png`,\n 'uri': `${baseUri}/${ViewHelper.constructUriSegmentFromView({...fanView, view: 'followingGenres'})}`\n }\n ];\n const summaryItemsList: RenderedList = {\n availableListViews: [ 'list', 'grid' ],\n items: summaryItems\n };\n const listTitle = this.#getTitle(fanInfo);\n if (listTitle) {\n summaryItemsList.title = listTitle;\n }\n\n return {\n navigation: {\n prev: { uri: this.constructPrevUri() },\n lists: [ summaryItemsList ]\n }\n };\n }\n\n #getTitle(fanInfo: Fan) {\n if (!fanInfo.url) {\n return null;\n }\n const viewProfileLink: UILink = {\n url: fanInfo.url,\n text: bandcamp.getI18n('BANDCAMP_VIEW_LINK_MY_PROFILE'),\n icon: { type: 'fa', class: 'fa fa-user' },\n target: '_blank'\n };\n let titleKey;\n switch (this.currentView.view) {\n case 'collection':\n titleKey = 'BANDCAMP_MY_COLLECTION';\n break;\n case 'wishlist':\n titleKey = 'BANDCAMP_MY_WISHLIST';\n break;\n case 'followingArtistsAndLabels':\n titleKey = 'BANDCAMP_MY_FOLLOWING_ARTISTS_AND_LABELS';\n break;\n case 'followingGenres':\n titleKey = 'BANDCAMP_MY_FOLLOWING_GENRES';\n break;\n default:\n titleKey = 'BANDCAMP_MY_BANDCAMP';\n }\n const mainTitle = bandcamp.getI18n(titleKey);\n const secondaryTitle = fanInfo.location ?\n bandcamp.getI18n('BANDCAMP_MY_BANDCAMP_NAME_LOCATION', fanInfo.name, fanInfo.location) :\n fanInfo.name;\n\n return UIHelper.constructDoubleLineTitleWithImageAndLink({\n imgSrc: fanInfo.imageUrl,\n title: mainTitle,\n secondaryTitle,\n link: viewProfileLink\n });\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"FanViewHandler.js","sourceRoot":"","sources":["../../../../../src/lib/controller/browse/view-handlers/FanViewHandler.ts"],"names":[],"mappings":"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","sourcesContent":["import { type Fan } from 'bandcamp-fetch';\nimport bandcamp from '../../../BandcampContext';\nimport { ModelType } from '../../../model';\nimport BaseViewHandler from './BaseViewHandler';\nimport type View from './View';\nimport { type RenderedList, type RenderedPage } from './ViewHandler';\nimport { RendererType } from './renderers';\nimport { type RenderedListItem } from './renderers/BaseRenderer';\nimport UIHelper, { type UILink } from '../../../util/UIHelper';\nimport { type FanModelGetFanItemsParams } from '../../../model/FanModel';\nimport ViewHelper from './ViewHelper';\n\nexport interface FanView extends View {\n name: 'fan';\n username: string;\n view?: 'collection' | 'wishlist' | 'followingArtistsAndLabels' | 'followingGenres';\n}\n\nexport default class FanViewHandler extends BaseViewHandler {\n\n browse(): Promise {\n if (!this.currentView.username) {\n throw Error('Username missing');\n }\n switch (this.currentView.view) {\n case 'collection':\n case 'wishlist':\n case 'followingArtistsAndLabels':\n case 'followingGenres':\n return this.#browseList();\n default:\n return this.#browseSummary();\n }\n }\n\n async #browseList(): Promise {\n const view = this.currentView;\n const modelParams: FanModelGetFanItemsParams = {\n username: view.username,\n limit: bandcamp.getConfigValue('itemsPerPage', 47)\n };\n\n if (view.pageRef) {\n modelParams.pageToken = view.pageRef.pageToken;\n modelParams.pageOffset = view.pageRef.pageOffset;\n }\n\n let fanItems;\n const model = this.getModel(ModelType.Fan);\n switch (view.view) {\n case 'collection':\n fanItems = await model.getCollection(modelParams);\n break;\n case 'wishlist':\n fanItems = await model.getWishlist(modelParams);\n break;\n case 'followingArtistsAndLabels':\n fanItems = await model.getFollowingArtistsAndLabels(modelParams);\n break;\n case 'followingGenres':\n fanItems = await model.getFollowingGenres(modelParams);\n break;\n default:\n throw Error(`Unknown view type: ${view.view}`);\n }\n\n const albumRenderer = this.getRenderer(RendererType.Album);\n const trackRenderer = this.getRenderer(RendererType.Track);\n const bandRenderer = this.getRenderer(RendererType.Band);\n const tagRenderer = this.getRenderer(RendererType.Tag);\n\n const listItems: RenderedListItem[] = [];\n fanItems.items.forEach((item) => {\n let rendered;\n switch (item.type) {\n case 'album':\n rendered = albumRenderer.renderToListItem(item);\n break;\n case 'artistOrLabel':\n rendered = bandRenderer.renderToListItem(item);\n break;\n case 'tag':\n rendered = tagRenderer.renderGenreListItem(item);\n break;\n case 'track':\n rendered = trackRenderer.renderToListItem(item, true, true);\n break;\n default:\n rendered = null;\n }\n if (rendered) {\n listItems.push(rendered);\n }\n });\n\n const nextPageRef = this.constructPageRef(fanItems.nextPageToken, fanItems.nextPageOffset);\n if (nextPageRef) {\n const nextUri = this.constructNextUri(nextPageRef);\n listItems.push(this.constructNextPageItem(nextUri));\n }\n\n const fanItemsList: RenderedList = {\n availableListViews: [ 'list', 'grid' ],\n items: listItems\n };\n const fanInfo = await model.getInfo(view.username);\n const fanItemsListTitle = this.#getTitle(fanInfo);\n if (fanItemsListTitle) {\n fanItemsList.title = fanItemsListTitle;\n }\n\n return {\n navigation: {\n prev: { uri: this.constructPrevUri() },\n lists: [ fanItemsList ]\n }\n };\n }\n\n async #browseSummary(): Promise {\n const username = this.currentView.username;\n const baseUri = this.uri;\n const baseImgPath = 'music_service/mpd/';\n const fanInfo = await this.getModel(ModelType.Fan).getInfo(username);\n const fanView: FanView = {\n name: 'fan',\n username\n };\n const summaryItems: RenderedListItem[] = [\n {\n 'service': 'bandcamp',\n 'type': 'item-no-menu',\n 'title': bandcamp.getI18n('BANDCAMP_COLLECTION', fanInfo.collectionItemCount),\n 'albumart': `/albumart?sourceicon=${baseImgPath}musiclibraryicon.png`,\n 'uri': `${baseUri}/${ViewHelper.constructUriSegmentFromView({...fanView, view: 'collection'})}`\n },\n {\n 'service': 'bandcamp',\n 'type': 'item-no-menu',\n 'title': bandcamp.getI18n('BANDCAMP_WISHLIST', fanInfo.wishlistItemCount),\n 'albumart': `/albumart?sourceicon=${baseImgPath}favouritesicon.png`,\n 'uri': `${baseUri}/${ViewHelper.constructUriSegmentFromView({...fanView, view: 'wishlist'})}`\n },\n {\n 'service': 'bandcamp',\n 'type': 'item-no-menu',\n 'title': bandcamp.getI18n('BANDCAMP_FOLLOWING_ARTISTS_AND_LABELS', fanInfo.followingArtistsAndLabelsCount),\n 'albumart': `/albumart?sourceicon=${baseImgPath}artisticon.png`,\n 'uri': `${baseUri}/${ViewHelper.constructUriSegmentFromView({...fanView, view: 'followingArtistsAndLabels'})}`\n },\n {\n 'service': 'bandcamp',\n 'type': 'item-no-menu',\n 'title': bandcamp.getI18n('BANDCAMP_FOLLOWING_GENRES', fanInfo.followingGenresCount),\n 'albumart': `/albumart?sourceicon=${baseImgPath}genreicon.png`,\n 'uri': `${baseUri}/${ViewHelper.constructUriSegmentFromView({...fanView, view: 'followingGenres'})}`\n }\n ];\n const summaryItemsList: RenderedList = {\n availableListViews: [ 'list', 'grid' ],\n items: summaryItems\n };\n const listTitle = this.#getTitle(fanInfo);\n if (listTitle) {\n summaryItemsList.title = listTitle;\n }\n\n return {\n navigation: {\n prev: { uri: this.constructPrevUri() },\n lists: [ summaryItemsList ]\n }\n };\n }\n\n #getTitle(fanInfo: Fan) {\n if (!fanInfo.url) {\n return null;\n }\n const viewProfileLink: UILink = {\n url: fanInfo.url,\n text: bandcamp.getI18n('BANDCAMP_VIEW_LINK_MY_PROFILE'),\n icon: { type: 'fa', class: 'fa fa-user' },\n target: '_blank'\n };\n let titleKey;\n switch (this.currentView.view) {\n case 'collection':\n titleKey = 'BANDCAMP_MY_COLLECTION';\n break;\n case 'wishlist':\n titleKey = 'BANDCAMP_MY_WISHLIST';\n break;\n case 'followingArtistsAndLabels':\n titleKey = 'BANDCAMP_MY_FOLLOWING_ARTISTS_AND_LABELS';\n break;\n case 'followingGenres':\n titleKey = 'BANDCAMP_MY_FOLLOWING_GENRES';\n break;\n default:\n titleKey = 'BANDCAMP_MY_BANDCAMP';\n }\n const mainTitle = bandcamp.getI18n(titleKey);\n const secondaryTitle = fanInfo.location ?\n bandcamp.getI18n('BANDCAMP_MY_BANDCAMP_NAME_LOCATION', fanInfo.name, fanInfo.location) :\n fanInfo.name;\n\n return UIHelper.constructDoubleLineTitleWithImageAndLink({\n imgSrc: fanInfo.imageUrl,\n title: mainTitle,\n secondaryTitle,\n link: viewProfileLink\n });\n }\n}\n"]} \ No newline at end of file diff --git a/bandcamp/dist/lib/controller/browse/view-handlers/RootViewHandler.d.ts b/bandcamp/dist/lib/controller/browse/view-handlers/RootViewHandler.d.ts index c0a7d7892..7946bc169 100644 --- a/bandcamp/dist/lib/controller/browse/view-handlers/RootViewHandler.d.ts +++ b/bandcamp/dist/lib/controller/browse/view-handlers/RootViewHandler.d.ts @@ -1,6 +1,6 @@ import BaseViewHandler from './BaseViewHandler'; -import View from './View'; -import { RenderedPage } from './ViewHandler'; +import type View from './View'; +import { type RenderedPage } from './ViewHandler'; export interface RootView extends View { name: 'root'; } diff --git a/bandcamp/dist/lib/controller/browse/view-handlers/RootViewHandler.d.ts.map b/bandcamp/dist/lib/controller/browse/view-handlers/RootViewHandler.d.ts.map index 0d120b5ea..325d1bff1 100644 --- a/bandcamp/dist/lib/controller/browse/view-handlers/RootViewHandler.d.ts.map +++ b/bandcamp/dist/lib/controller/browse/view-handlers/RootViewHandler.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"RootViewHandler.d.ts","sourceRoot":"","sources":["../../../../../src/lib/controller/browse/view-handlers/RootViewHandler.ts"],"names":[],"mappings":"AAEA,OAAO,eAAe,MAAM,mBAAmB,CAAC;AAChD,OAAO,IAAI,MAAM,QAAQ,CAAC;AAC1B,OAAO,EAAgB,YAAY,EAAE,MAAM,eAAe,CAAC;AAG3D,MAAM,WAAW,QAAS,SAAQ,IAAI;IACpC,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,CAAC,OAAO,OAAO,eAAgB,SAAQ,eAAe,CAAC,QAAQ,CAAC;;IAE9D,MAAM,IAAI,OAAO,CAAC,YAAY,CAAC;CAqEtC"} \ No newline at end of file +{"version":3,"file":"RootViewHandler.d.ts","sourceRoot":"","sources":["../../../../../src/lib/controller/browse/view-handlers/RootViewHandler.ts"],"names":[],"mappings":"AAEA,OAAO,eAAe,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,IAAI,MAAM,QAAQ,CAAC;AAC/B,OAAO,EAAqB,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AAGrE,MAAM,WAAW,QAAS,SAAQ,IAAI;IACpC,IAAI,EAAE,MAAM,CAAC;CACd;AAED,MAAM,CAAC,OAAO,OAAO,eAAgB,SAAQ,eAAe,CAAC,QAAQ,CAAC;;IAE9D,MAAM,IAAI,OAAO,CAAC,YAAY,CAAC;CAqEtC"} \ No newline at end of file diff --git a/bandcamp/dist/lib/controller/browse/view-handlers/RootViewHandler.js b/bandcamp/dist/lib/controller/browse/view-handlers/RootViewHandler.js index 331be2fe7..ea7f998b7 100644 --- a/bandcamp/dist/lib/controller/browse/view-handlers/RootViewHandler.js +++ b/bandcamp/dist/lib/controller/browse/view-handlers/RootViewHandler.js @@ -56,7 +56,6 @@ class RootViewHandler extends BaseViewHandler_1.default { }; } } -exports.default = RootViewHandler; _RootViewHandler_instances = new WeakSet(), _RootViewHandler_getFanSummary = function _RootViewHandler_getFanSummary(username) { return __classPrivateFieldGet(this, _RootViewHandler_instances, "m", _RootViewHandler_getSectionLists).call(this, `${this.uri}/fan@username=${username}`); }, _RootViewHandler_getArticles = function _RootViewHandler_getArticles() { @@ -70,4 +69,5 @@ _RootViewHandler_instances = new WeakSet(), _RootViewHandler_getFanSummary = fun const page = await handler.browse(); return page.navigation?.lists || []; }; +exports.default = RootViewHandler; //# sourceMappingURL=RootViewHandler.js.map \ No newline at end of file diff --git a/bandcamp/dist/lib/controller/browse/view-handlers/RootViewHandler.js.map b/bandcamp/dist/lib/controller/browse/view-handlers/RootViewHandler.js.map index 6d9dee325..ee177cbb9 100644 --- a/bandcamp/dist/lib/controller/browse/view-handlers/RootViewHandler.js.map +++ b/bandcamp/dist/lib/controller/browse/view-handlers/RootViewHandler.js.map @@ -1 +1 @@ -{"version":3,"file":"RootViewHandler.js","sourceRoot":"","sources":["../../../../../src/lib/controller/browse/view-handlers/RootViewHandler.ts"],"names":[],"mappings":"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","sourcesContent":["import bandcamp from '../../../BandcampContext';\nimport { ModelType } from '../../../model';\nimport BaseViewHandler from './BaseViewHandler';\nimport View from './View';\nimport { RenderedList, RenderedPage } from './ViewHandler';\nimport ViewHandlerFactory from './ViewHandlerFactory';\n\nexport interface RootView extends View {\n name: 'root';\n}\n\nexport default class RootViewHandler extends BaseViewHandler {\n\n async browse(): Promise {\n const fetches: Promise[] = [];\n\n const myBandcampType = bandcamp.getConfigValue('myBandcampType', 'cookie');\n let myUsername: string | null = null;\n if (myBandcampType === 'cookie') {\n const myCookie = bandcamp.getConfigValue('myCookie', '');\n if (myCookie) {\n const fanModel = this.getModel(ModelType.Fan);\n try {\n const myFanInfo = await fanModel.getInfo();\n myUsername = myFanInfo.username;\n }\n catch (error) {\n bandcamp.getLogger().error(`[bandcamp] Error getting fan info by cookie${error instanceof Error ? `: ${error.message}` : '.'}`);\n bandcamp.toast('error', bandcamp.getI18n('BANDCAMP_ERR_MY_FAN_INFO'));\n }\n }\n }\n else if (myBandcampType === 'username') {\n myUsername = bandcamp.getConfigValue('myUsername', '');\n }\n\n if (myUsername) {\n fetches.push(this.#getFanSummary(myUsername));\n }\n\n fetches.push(\n this.#getArticles(),\n this.#getShows(),\n this.#getDiscoverResults()\n );\n\n const sectionLists = await Promise.all(fetches);\n\n const flattenedLists = sectionLists.reduce((result, list) => {\n result.push(...list);\n return result;\n }, []);\n\n return {\n navigation: {\n prev: { uri: '/' },\n lists: flattenedLists\n }\n };\n }\n\n #getFanSummary(username: string) {\n return this.#getSectionLists(`${this.uri}/fan@username=${username}`);\n }\n\n #getArticles() {\n return this.#getSectionLists(`${this.uri}/article@inSection=1`);\n }\n\n #getShows() {\n return this.#getSectionLists(`${this.uri}/show@inSection=1`);\n }\n\n #getDiscoverResults() {\n return this.#getSectionLists(`${this.uri}/discover@inSection=1`);\n }\n\n async #getSectionLists(uri: string) {\n const handler = ViewHandlerFactory.getHandler(uri);\n const page = await handler.browse();\n return page.navigation?.lists || [];\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"RootViewHandler.js","sourceRoot":"","sources":["../../../../../src/lib/controller/browse/view-handlers/RootViewHandler.ts"],"names":[],"mappings":"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","sourcesContent":["import bandcamp from '../../../BandcampContext';\nimport { ModelType } from '../../../model';\nimport BaseViewHandler from './BaseViewHandler';\nimport type View from './View';\nimport { type RenderedList, type RenderedPage } from './ViewHandler';\nimport ViewHandlerFactory from './ViewHandlerFactory';\n\nexport interface RootView extends View {\n name: 'root';\n}\n\nexport default class RootViewHandler extends BaseViewHandler {\n\n async browse(): Promise {\n const fetches: Promise[] = [];\n\n const myBandcampType = bandcamp.getConfigValue('myBandcampType', 'cookie');\n let myUsername: string | null = null;\n if (myBandcampType === 'cookie') {\n const myCookie = bandcamp.getConfigValue('myCookie', '');\n if (myCookie) {\n const fanModel = this.getModel(ModelType.Fan);\n try {\n const myFanInfo = await fanModel.getInfo();\n myUsername = myFanInfo.username;\n }\n catch (error) {\n bandcamp.getLogger().error(`[bandcamp] Error getting fan info by cookie${error instanceof Error ? `: ${error.message}` : '.'}`);\n bandcamp.toast('error', bandcamp.getI18n('BANDCAMP_ERR_MY_FAN_INFO'));\n }\n }\n }\n else if (myBandcampType === 'username') {\n myUsername = bandcamp.getConfigValue('myUsername', '');\n }\n\n if (myUsername) {\n fetches.push(this.#getFanSummary(myUsername));\n }\n\n fetches.push(\n this.#getArticles(),\n this.#getShows(),\n this.#getDiscoverResults()\n );\n\n const sectionLists = await Promise.all(fetches);\n\n const flattenedLists = sectionLists.reduce((result, list) => {\n result.push(...list);\n return result;\n }, []);\n\n return {\n navigation: {\n prev: { uri: '/' },\n lists: flattenedLists\n }\n };\n }\n\n #getFanSummary(username: string) {\n return this.#getSectionLists(`${this.uri}/fan@username=${username}`);\n }\n\n #getArticles() {\n return this.#getSectionLists(`${this.uri}/article@inSection=1`);\n }\n\n #getShows() {\n return this.#getSectionLists(`${this.uri}/show@inSection=1`);\n }\n\n #getDiscoverResults() {\n return this.#getSectionLists(`${this.uri}/discover@inSection=1`);\n }\n\n async #getSectionLists(uri: string) {\n const handler = ViewHandlerFactory.getHandler(uri);\n const page = await handler.browse();\n return page.navigation?.lists || [];\n }\n}\n"]} \ No newline at end of file diff --git a/bandcamp/dist/lib/controller/browse/view-handlers/SearchViewHandler.d.ts b/bandcamp/dist/lib/controller/browse/view-handlers/SearchViewHandler.d.ts index 11770422d..70894a043 100644 --- a/bandcamp/dist/lib/controller/browse/view-handlers/SearchViewHandler.d.ts +++ b/bandcamp/dist/lib/controller/browse/view-handlers/SearchViewHandler.d.ts @@ -1,7 +1,7 @@ import { SearchItemType } from '../../../model/SearchModel'; import BaseViewHandler from './BaseViewHandler'; -import View from './View'; -import { RenderedPage } from './ViewHandler'; +import type View from './View'; +import { type RenderedPage } from './ViewHandler'; export interface SearchView extends View { name: 'search'; query: string; diff --git a/bandcamp/dist/lib/controller/browse/view-handlers/SearchViewHandler.d.ts.map b/bandcamp/dist/lib/controller/browse/view-handlers/SearchViewHandler.d.ts.map index 0079fc775..69305f668 100644 --- a/bandcamp/dist/lib/controller/browse/view-handlers/SearchViewHandler.d.ts.map +++ b/bandcamp/dist/lib/controller/browse/view-handlers/SearchViewHandler.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"SearchViewHandler.d.ts","sourceRoot":"","sources":["../../../../../src/lib/controller/browse/view-handlers/SearchViewHandler.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAAqC,MAAM,4BAA4B,CAAC;AAE/F,OAAO,eAAe,MAAM,mBAAmB,CAAC;AAChD,OAAO,IAAI,MAAM,QAAQ,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAI7C,MAAM,WAAW,UAAW,SAAQ,IAAI;IACtC,IAAI,EAAE,QAAQ,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,GAAG,CAAC;IACrB,QAAQ,CAAC,EAAE,cAAc,CAAA;CAC1B;AAED,MAAM,CAAC,OAAO,OAAO,iBAAkB,SAAQ,eAAe,CAAC,UAAU,CAAC;IAElE,MAAM,IAAI,OAAO,CAAC,YAAY,CAAC;CAsEtC"} \ No newline at end of file +{"version":3,"file":"SearchViewHandler.d.ts","sourceRoot":"","sources":["../../../../../src/lib/controller/browse/view-handlers/SearchViewHandler.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,cAAc,EAA0C,MAAM,4BAA4B,CAAC;AAEpG,OAAO,eAAe,MAAM,mBAAmB,CAAC;AAChD,OAAO,KAAK,IAAI,MAAM,QAAQ,CAAC;AAC/B,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AAIlD,MAAM,WAAW,UAAW,SAAQ,IAAI;IACtC,IAAI,EAAE,QAAQ,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;IACd,cAAc,CAAC,EAAE,GAAG,CAAC;IACrB,QAAQ,CAAC,EAAE,cAAc,CAAA;CAC1B;AAED,MAAM,CAAC,OAAO,OAAO,iBAAkB,SAAQ,eAAe,CAAC,UAAU,CAAC;IAElE,MAAM,IAAI,OAAO,CAAC,YAAY,CAAC;CAsEtC"} \ No newline at end of file diff --git a/bandcamp/dist/lib/controller/browse/view-handlers/SearchViewHandler.js.map b/bandcamp/dist/lib/controller/browse/view-handlers/SearchViewHandler.js.map index 0412bd5d6..0afed1b0b 100644 --- a/bandcamp/dist/lib/controller/browse/view-handlers/SearchViewHandler.js.map +++ b/bandcamp/dist/lib/controller/browse/view-handlers/SearchViewHandler.js.map @@ -1 +1 @@ -{"version":3,"file":"SearchViewHandler.js","sourceRoot":"","sources":["../../../../../src/lib/controller/browse/view-handlers/SearchViewHandler.ts"],"names":[],"mappings":"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","sourcesContent":["import bandcamp from '../../../BandcampContext';\nimport { ModelType } from '../../../model';\nimport { SearchItemType, SearchModelGetSearchResultsParams } from '../../../model/SearchModel';\nimport UIHelper from '../../../util/UIHelper';\nimport BaseViewHandler from './BaseViewHandler';\nimport View from './View';\nimport { RenderedPage } from './ViewHandler';\nimport { RendererType } from './renderers';\nimport { RenderedListItem } from './renderers/BaseRenderer';\n\nexport interface SearchView extends View {\n name: 'search';\n query: string;\n combinedSearch?: '1';\n itemType?: SearchItemType\n}\n\nexport default class SearchViewHandler extends BaseViewHandler {\n\n async browse(): Promise {\n const view = this.currentView;\n\n if (!view.query) {\n throw Error('Search query missing');\n }\n\n const modelParams: SearchModelGetSearchResultsParams = {\n query: view.query,\n itemType: SearchItemType.All,\n limit: view.combinedSearch ? bandcamp.getConfigValue('combinedSearchResults', 17) : bandcamp.getConfigValue('itemsPerPage', 47)\n };\n\n if (view.pageRef) {\n modelParams.pageToken = view.pageRef.pageToken;\n modelParams.pageOffset = view.pageRef.pageOffset;\n }\n\n if (view.itemType) {\n modelParams.itemType = view.itemType;\n }\n\n const searchResults = await this.getModel(ModelType.Search).getSearchResults(modelParams);\n const renderer = this.getRenderer(RendererType.SearchResult);\n const listItems = searchResults.items.reduce((result, item) => {\n const rendered = renderer.renderToListItem(item);\n if (rendered) {\n result.push(rendered);\n }\n return result;\n }, []);\n\n const nextPageRef = this.constructPageRef(searchResults.nextPageToken, searchResults.nextPageOffset);\n if (nextPageRef) {\n const nextUri = this.constructNextUri(nextPageRef);\n listItems.push(this.constructNextPageItem(nextUri));\n }\n\n let titleKey;\n switch (view.itemType) {\n case SearchItemType.ArtistsAndLabels:\n titleKey = 'BANDCAMP_SEARCH_ARTISTS_AND_LABELS_TITLE';\n break;\n case SearchItemType.Albums:\n titleKey = 'BANDCAMP_SEARCH_ALBUMS_TITLE';\n break;\n case SearchItemType.Tracks:\n titleKey = 'BANDCAMP_SEARCH_TRACKS_TITLE';\n break;\n default:\n titleKey = 'BANDCAMP_SEARCH_TITLE';\n }\n if (!view.combinedSearch) {\n titleKey += '_FULL';\n }\n const pageTitle = UIHelper.addBandcampIconToListTitle(bandcamp.getI18n(titleKey, view.query));\n\n return {\n navigation: {\n prev: { uri: this.constructPrevUri() },\n lists: [\n {\n availableListViews: [ 'list', 'grid' ],\n items: listItems,\n title: pageTitle\n }\n ]\n }\n };\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"SearchViewHandler.js","sourceRoot":"","sources":["../../../../../src/lib/controller/browse/view-handlers/SearchViewHandler.ts"],"names":[],"mappings":"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","sourcesContent":["import bandcamp from '../../../BandcampContext';\nimport { ModelType } from '../../../model';\nimport { SearchItemType, type SearchModelGetSearchResultsParams } from '../../../model/SearchModel';\nimport UIHelper from '../../../util/UIHelper';\nimport BaseViewHandler from './BaseViewHandler';\nimport type View from './View';\nimport { type RenderedPage } from './ViewHandler';\nimport { RendererType } from './renderers';\nimport { type RenderedListItem } from './renderers/BaseRenderer';\n\nexport interface SearchView extends View {\n name: 'search';\n query: string;\n combinedSearch?: '1';\n itemType?: SearchItemType\n}\n\nexport default class SearchViewHandler extends BaseViewHandler {\n\n async browse(): Promise {\n const view = this.currentView;\n\n if (!view.query) {\n throw Error('Search query missing');\n }\n\n const modelParams: SearchModelGetSearchResultsParams = {\n query: view.query,\n itemType: SearchItemType.All,\n limit: view.combinedSearch ? bandcamp.getConfigValue('combinedSearchResults', 17) : bandcamp.getConfigValue('itemsPerPage', 47)\n };\n\n if (view.pageRef) {\n modelParams.pageToken = view.pageRef.pageToken;\n modelParams.pageOffset = view.pageRef.pageOffset;\n }\n\n if (view.itemType) {\n modelParams.itemType = view.itemType;\n }\n\n const searchResults = await this.getModel(ModelType.Search).getSearchResults(modelParams);\n const renderer = this.getRenderer(RendererType.SearchResult);\n const listItems = searchResults.items.reduce((result, item) => {\n const rendered = renderer.renderToListItem(item);\n if (rendered) {\n result.push(rendered);\n }\n return result;\n }, []);\n\n const nextPageRef = this.constructPageRef(searchResults.nextPageToken, searchResults.nextPageOffset);\n if (nextPageRef) {\n const nextUri = this.constructNextUri(nextPageRef);\n listItems.push(this.constructNextPageItem(nextUri));\n }\n\n let titleKey;\n switch (view.itemType) {\n case SearchItemType.ArtistsAndLabels:\n titleKey = 'BANDCAMP_SEARCH_ARTISTS_AND_LABELS_TITLE';\n break;\n case SearchItemType.Albums:\n titleKey = 'BANDCAMP_SEARCH_ALBUMS_TITLE';\n break;\n case SearchItemType.Tracks:\n titleKey = 'BANDCAMP_SEARCH_TRACKS_TITLE';\n break;\n default:\n titleKey = 'BANDCAMP_SEARCH_TITLE';\n }\n if (!view.combinedSearch) {\n titleKey += '_FULL';\n }\n const pageTitle = UIHelper.addBandcampIconToListTitle(bandcamp.getI18n(titleKey, view.query));\n\n return {\n navigation: {\n prev: { uri: this.constructPrevUri() },\n lists: [\n {\n availableListViews: [ 'list', 'grid' ],\n items: listItems,\n title: pageTitle\n }\n ]\n }\n };\n }\n}\n"]} \ No newline at end of file diff --git a/bandcamp/dist/lib/controller/browse/view-handlers/ShowViewHandler.d.ts b/bandcamp/dist/lib/controller/browse/view-handlers/ShowViewHandler.d.ts index 158fb1ed4..441dd8cb0 100644 --- a/bandcamp/dist/lib/controller/browse/view-handlers/ShowViewHandler.d.ts +++ b/bandcamp/dist/lib/controller/browse/view-handlers/ShowViewHandler.d.ts @@ -1,7 +1,7 @@ -import TrackEntity from '../../../entities/TrackEntity'; +import type TrackEntity from '../../../entities/TrackEntity'; import ExplodableViewHandler from './ExplodableViewHandler'; -import View from './View'; -import { RenderedPage } from './ViewHandler'; +import type View from './View'; +import { type RenderedPage } from './ViewHandler'; export interface ShowView extends View { name: 'show'; showUrl: string; diff --git a/bandcamp/dist/lib/controller/browse/view-handlers/ShowViewHandler.d.ts.map b/bandcamp/dist/lib/controller/browse/view-handlers/ShowViewHandler.d.ts.map index 50e546141..ca28f4263 100644 --- a/bandcamp/dist/lib/controller/browse/view-handlers/ShowViewHandler.d.ts.map +++ b/bandcamp/dist/lib/controller/browse/view-handlers/ShowViewHandler.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"ShowViewHandler.d.ts","sourceRoot":"","sources":["../../../../../src/lib/controller/browse/view-handlers/ShowViewHandler.ts"],"names":[],"mappings":"AACA,OAAO,WAAW,MAAM,+BAA+B,CAAC;AAIxD,OAAO,qBAAqB,MAAM,yBAAyB,CAAC;AAC5D,OAAO,IAAI,MAAM,QAAQ,CAAC;AAC1B,OAAO,EAAgB,YAAY,EAAE,MAAM,eAAe,CAAC;AAK3D,MAAM,WAAW,QAAS,SAAQ,IAAI;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;CAC5B;AAED,UAAU,gBAAiB,SAAQ,WAAW;IAC5C,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,CAAC,OAAO,OAAO,eAAgB,SAAQ,qBAAqB,CAAC,QAAQ,CAAC;;IAEpE,MAAM,IAAI,OAAO,CAAC,YAAY,CAAC;IA+N/B,kBAAkB,IAAI,OAAO,CAAC,gBAAgB,GAAG,gBAAgB,EAAE,CAAC;IAwB1E;;;;;OAKG;IACH,WAAW,CAAC,KAAK,EAAE,gBAAgB;CAOpC"} \ No newline at end of file +{"version":3,"file":"ShowViewHandler.d.ts","sourceRoot":"","sources":["../../../../../src/lib/controller/browse/view-handlers/ShowViewHandler.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,WAAW,MAAM,+BAA+B,CAAC;AAI7D,OAAO,qBAAqB,MAAM,yBAAyB,CAAC;AAC5D,OAAO,KAAK,IAAI,MAAM,QAAQ,CAAC;AAC/B,OAAO,EAAqB,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AAKrE,MAAM,WAAW,QAAS,SAAQ,IAAI;IACpC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,IAAI,CAAC,EAAE,QAAQ,GAAG,QAAQ,CAAC;CAC5B;AAED,UAAU,gBAAiB,SAAQ,WAAW;IAC5C,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,CAAC,OAAO,OAAO,eAAgB,SAAQ,qBAAqB,CAAC,QAAQ,CAAC;;IAEpE,MAAM,IAAI,OAAO,CAAC,YAAY,CAAC;IA+N/B,kBAAkB,IAAI,OAAO,CAAC,gBAAgB,GAAG,gBAAgB,EAAE,CAAC;IAwB1E;;;;;OAKG;IACH,WAAW,CAAC,KAAK,EAAE,gBAAgB;CAOpC"} \ No newline at end of file diff --git a/bandcamp/dist/lib/controller/browse/view-handlers/ShowViewHandler.js b/bandcamp/dist/lib/controller/browse/view-handlers/ShowViewHandler.js index e8da2484c..b284eb9d1 100644 --- a/bandcamp/dist/lib/controller/browse/view-handlers/ShowViewHandler.js +++ b/bandcamp/dist/lib/controller/browse/view-handlers/ShowViewHandler.js @@ -63,7 +63,6 @@ class ShowViewHandler extends ExplodableViewHandler_1.default { return `bandcamp/${ViewHelper_1.default.constructUriSegmentFromView(showView)}`; } } -exports.default = ShowViewHandler; _ShowViewHandler_instances = new WeakSet(), _ShowViewHandler_browseAllShows = async function _ShowViewHandler_browseAllShows() { const view = this.currentView; const modelParams = { @@ -257,4 +256,5 @@ _ShowViewHandler_instances = new WeakSet(), _ShowViewHandler_browseAllShows = as } return allLists; }; +exports.default = ShowViewHandler; //# sourceMappingURL=ShowViewHandler.js.map \ No newline at end of file diff --git a/bandcamp/dist/lib/controller/browse/view-handlers/ShowViewHandler.js.map b/bandcamp/dist/lib/controller/browse/view-handlers/ShowViewHandler.js.map index ead0447f3..a318842ce 100644 --- a/bandcamp/dist/lib/controller/browse/view-handlers/ShowViewHandler.js.map +++ b/bandcamp/dist/lib/controller/browse/view-handlers/ShowViewHandler.js.map @@ -1 +1 @@ -{"version":3,"file":"ShowViewHandler.js","sourceRoot":"","sources":["../../../../../src/lib/controller/browse/view-handlers/ShowViewHandler.ts"],"names":[],"mappings":"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","sourcesContent":["import bandcamp from '../../../BandcampContext';\nimport TrackEntity from '../../../entities/TrackEntity';\nimport { ModelType } from '../../../model';\nimport { ShowModelGetShowsParams } from '../../../model/ShowModel';\nimport UIHelper, { UILink } from '../../../util/UIHelper';\nimport ExplodableViewHandler from './ExplodableViewHandler';\nimport View from './View';\nimport { RenderedList, RenderedPage } from './ViewHandler';\nimport ViewHelper from './ViewHelper';\nimport { RendererType } from './renderers';\nimport { RenderedListItem } from './renderers/BaseRenderer';\n\nexport interface ShowView extends View {\n name: 'show';\n showUrl: string;\n view?: 'albums' | 'tracks';\n}\n\ninterface ShowExplodeTrack extends TrackEntity {\n showUrl: string;\n}\n\nexport default class ShowViewHandler extends ExplodableViewHandler {\n\n async browse(): Promise {\n const showUrl = this.currentView.showUrl;\n if (showUrl) {\n return this.#browseShow(showUrl);\n }\n\n return this.#browseAllShows();\n }\n\n async #browseAllShows(): Promise {\n const view = this.currentView;\n\n const modelParams: ShowModelGetShowsParams = {\n limit: view.inSection ? bandcamp.getConfigValue('itemsPerSection', 5) : bandcamp.getConfigValue('itemsPerPage', 47)\n };\n\n if (view.pageRef) {\n modelParams.pageToken = view.pageRef.pageToken;\n modelParams.pageOffset = view.pageRef.pageOffset;\n }\n\n const shows = await this.getModel(ModelType.Show).getShows(modelParams);\n const showRenderer = this.getRenderer(RendererType.Show);\n const listItems = shows.items.reduce((result, show) => {\n const rendered = showRenderer.renderToListItem(show);\n if (rendered) {\n result.push(rendered);\n }\n return result;\n }, []);\n\n const nextPageRef = this.constructPageRef(shows.nextPageToken, shows.nextPageOffset);\n if (nextPageRef) {\n const nextUri = this.constructNextUri(nextPageRef);\n listItems.push(this.constructNextPageItem(nextUri));\n }\n\n return {\n navigation: {\n prev: { uri: this.constructPrevUri() },\n lists: [ {\n title: UIHelper.addBandcampIconToListTitle(bandcamp.getI18n(view.inSection ? 'BANDCAMP_SHOWS_SHORT' : 'BANDCAMP_SHOWS')),\n availableListViews: [ 'list', 'grid' ],\n items: listItems\n } ]\n }\n };\n }\n\n async #browseShow(showUrl: string): Promise {\n const view = this.currentView;\n const trackModel = this.getModel(ModelType.Track);\n const allLists: RenderedList[] = [];\n\n const show = await this.getModel(ModelType.Show).getShow(showUrl);\n const showRenderer = this.getRenderer(RendererType.Show);\n const showListItem = showRenderer.renderToListItem(show, true);\n if (showListItem) {\n const viewShowExternalLink: UILink = {\n url: showUrl,\n text: bandcamp.getI18n('BANDCAMP_VIEW_LINK_SHOW'),\n icon: { type: 'bandcamp' },\n target: '_blank'\n };\n const playFullStreamLinkList: RenderedList = {\n title: UIHelper.constructListTitleWithLink('', viewShowExternalLink, true),\n availableListViews: [ 'list' ],\n items: [ showListItem ]\n };\n allLists.push(playFullStreamLinkList);\n }\n\n if (view.view === 'albums') {\n const albumRenderer = this.getRenderer(RendererType.Album);\n const trackRenderer = this.getRenderer(RendererType.Track);\n const switchViewLinkData = {\n uri: this.#constructUriWithParams({ view: 'tracks', noExplode: 1 }),\n text: bandcamp.getI18n('BANDCAMP_SHOW_FEATURED_TRACKS')\n };\n const switchViewLink: UILink = {\n url: '#',\n text: switchViewLinkData.text,\n onclick: `angular.element('#browse-page').scope().browse.fetchLibrary({uri: '${switchViewLinkData.uri}'}, true)`,\n icon: {\n type: 'fa',\n class: 'fa fa-arrow-circle-right',\n float: 'right',\n color: '#54c688'\n }\n };\n const featuredAlbumsList: RenderedList = {\n title: UIHelper.constructListTitleWithLink(bandcamp.getI18n('BANDCAMP_TRACK_SOURCES'), switchViewLink, false),\n availableListViews: [ 'list', 'grid' ],\n items: []\n };\n\n const _fetchAlbumOrTrackPromise = async (track: TrackEntity) => {\n if (track.album) {\n return track.album;\n }\n else if (track.url) {\n try {\n return await trackModel.getTrack(track.url);\n }\n catch (error: any) {\n return null;\n }\n }\n return null;\n };\n\n const fetchAlbumOrTrackPromises = show.tracks?.map((track) => _fetchAlbumOrTrackPromise(track)) || [];\n\n const fetchedAlbumsOrTracks = (await Promise.all(fetchAlbumOrTrackPromises));\n const albumsAdded: string[] = [];\n\n fetchedAlbumsOrTracks.forEach((item) => {\n if (!item?.url) {\n return true;\n }\n if (item.type === 'track') {\n const rendered = trackRenderer.renderToListItem(item, true, true);\n if (rendered) {\n featuredAlbumsList.items.push(rendered);\n }\n }\n else if (item.type === 'album' && !albumsAdded.includes(item.url)) {\n const rendered = albumRenderer.renderToListItem(item);\n if (rendered) {\n featuredAlbumsList.items.push(rendered);\n albumsAdded.push(item.url);\n }\n }\n });\n\n allLists.push(featuredAlbumsList);\n this.#checkAndAddSwitchViewListItem(switchViewLinkData, allLists);\n }\n else {\n const trackRenderer = this.getRenderer(RendererType.Track);\n const switchViewLinkData = {\n uri: this.#constructUriWithParams({ view: 'albums', noExplode: 1 }),\n text: bandcamp.getI18n('BANDCAMP_SHOW_TRACK_SOURCES')\n };\n const switchViewLink: UILink = {\n url: '#',\n text: switchViewLinkData.text,\n onclick: `angular.element('#browse-page').scope().browse.fetchLibrary({uri: '${switchViewLinkData.uri}'}, true)`,\n icon: {\n type: 'fa',\n class: 'fa fa-arrow-circle-right',\n float: 'right',\n color: '#54c688'\n }\n };\n const featuredTracksList: RenderedList = {\n title: UIHelper.constructListTitleWithLink(bandcamp.getI18n('BANDCAMP_FEATURED_TRACKS'), switchViewLink, false),\n availableListViews: [ 'list' ],\n items: []\n };\n const fetchTrackPromises = show.tracks?.map(async (track) => {\n try {\n if (track.url) {\n return await trackModel.getTrack(track.url);\n }\n return null;\n }\n catch (error: any) {\n return null;\n }\n });\n const tracks = fetchTrackPromises ? await Promise.all(fetchTrackPromises) : [];\n\n tracks.forEach((track) => {\n if (track) {\n const rendered = trackRenderer.renderToListItem(track);\n if (rendered) {\n featuredTracksList.items.push(rendered);\n }\n }\n });\n allLists.push(featuredTracksList);\n this.#checkAndAddSwitchViewListItem(switchViewLinkData, allLists);\n }\n\n return {\n navigation: {\n prev: { uri: this.constructPrevUri() },\n info: showRenderer.renderToHeader(show),\n lists: allLists\n }\n };\n }\n\n #constructUriWithParams(params: object) {\n const targetView = {\n ...this.currentView,\n ...params\n };\n return ViewHelper.constructUriFromViews([\n ...this.previousViews,\n targetView\n ]);\n }\n\n #checkAndAddSwitchViewListItem(linkData: { uri: string; text: string }, allLists: RenderedList[]) {\n if (!UIHelper.supportsEnhancedTitles()) {\n // Compensate for loss of switch view link\n const switchViewListItem: RenderedListItem = {\n service: 'bandcamp',\n type: 'item-no-menu',\n uri: linkData.uri,\n title: linkData.text,\n icon: 'fa fa-arrow-circle-right'\n };\n allLists.push({\n availableListViews: [ 'list' ],\n items: [ switchViewListItem ]\n });\n }\n return allLists;\n }\n\n async getTracksOnExplode(): Promise {\n const showUrl = this.currentView.showUrl;\n if (!showUrl) {\n throw Error('Show URL missing');\n }\n\n const show = await this.getModel(ModelType.Show).getShow(showUrl);\n return {\n type: 'track',\n name: show.name,\n streamUrl: show.streamUrl,\n thumbnail: show.thumbnail,\n artist: {\n type: 'artist',\n name: UIHelper.reformatDate(show.date)\n },\n album: {\n type: 'album',\n name: bandcamp.getI18n('BANDCAMP_HEADER_SHOW')\n },\n showUrl: show.url\n };\n }\n\n /**\n * Override\n *\n * Track uri:\n * bandcamp/show@showUrl={showUrl}\n */\n getTrackUri(track: ShowExplodeTrack) {\n const showView: ShowView = {\n name: 'show',\n showUrl: track.showUrl\n };\n return `bandcamp/${ViewHelper.constructUriSegmentFromView(showView)}`;\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"ShowViewHandler.js","sourceRoot":"","sources":["../../../../../src/lib/controller/browse/view-handlers/ShowViewHandler.ts"],"names":[],"mappings":"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","sourcesContent":["import bandcamp from '../../../BandcampContext';\nimport type TrackEntity from '../../../entities/TrackEntity';\nimport { ModelType } from '../../../model';\nimport { type ShowModelGetShowsParams } from '../../../model/ShowModel';\nimport UIHelper, { type UILink } from '../../../util/UIHelper';\nimport ExplodableViewHandler from './ExplodableViewHandler';\nimport type View from './View';\nimport { type RenderedList, type RenderedPage } from './ViewHandler';\nimport ViewHelper from './ViewHelper';\nimport { RendererType } from './renderers';\nimport { type RenderedListItem } from './renderers/BaseRenderer';\n\nexport interface ShowView extends View {\n name: 'show';\n showUrl: string;\n view?: 'albums' | 'tracks';\n}\n\ninterface ShowExplodeTrack extends TrackEntity {\n showUrl: string;\n}\n\nexport default class ShowViewHandler extends ExplodableViewHandler {\n\n async browse(): Promise {\n const showUrl = this.currentView.showUrl;\n if (showUrl) {\n return this.#browseShow(showUrl);\n }\n\n return this.#browseAllShows();\n }\n\n async #browseAllShows(): Promise {\n const view = this.currentView;\n\n const modelParams: ShowModelGetShowsParams = {\n limit: view.inSection ? bandcamp.getConfigValue('itemsPerSection', 5) : bandcamp.getConfigValue('itemsPerPage', 47)\n };\n\n if (view.pageRef) {\n modelParams.pageToken = view.pageRef.pageToken;\n modelParams.pageOffset = view.pageRef.pageOffset;\n }\n\n const shows = await this.getModel(ModelType.Show).getShows(modelParams);\n const showRenderer = this.getRenderer(RendererType.Show);\n const listItems = shows.items.reduce((result, show) => {\n const rendered = showRenderer.renderToListItem(show);\n if (rendered) {\n result.push(rendered);\n }\n return result;\n }, []);\n\n const nextPageRef = this.constructPageRef(shows.nextPageToken, shows.nextPageOffset);\n if (nextPageRef) {\n const nextUri = this.constructNextUri(nextPageRef);\n listItems.push(this.constructNextPageItem(nextUri));\n }\n\n return {\n navigation: {\n prev: { uri: this.constructPrevUri() },\n lists: [ {\n title: UIHelper.addBandcampIconToListTitle(bandcamp.getI18n(view.inSection ? 'BANDCAMP_SHOWS_SHORT' : 'BANDCAMP_SHOWS')),\n availableListViews: [ 'list', 'grid' ],\n items: listItems\n } ]\n }\n };\n }\n\n async #browseShow(showUrl: string): Promise {\n const view = this.currentView;\n const trackModel = this.getModel(ModelType.Track);\n const allLists: RenderedList[] = [];\n\n const show = await this.getModel(ModelType.Show).getShow(showUrl);\n const showRenderer = this.getRenderer(RendererType.Show);\n const showListItem = showRenderer.renderToListItem(show, true);\n if (showListItem) {\n const viewShowExternalLink: UILink = {\n url: showUrl,\n text: bandcamp.getI18n('BANDCAMP_VIEW_LINK_SHOW'),\n icon: { type: 'bandcamp' },\n target: '_blank'\n };\n const playFullStreamLinkList: RenderedList = {\n title: UIHelper.constructListTitleWithLink('', viewShowExternalLink, true),\n availableListViews: [ 'list' ],\n items: [ showListItem ]\n };\n allLists.push(playFullStreamLinkList);\n }\n\n if (view.view === 'albums') {\n const albumRenderer = this.getRenderer(RendererType.Album);\n const trackRenderer = this.getRenderer(RendererType.Track);\n const switchViewLinkData = {\n uri: this.#constructUriWithParams({ view: 'tracks', noExplode: 1 }),\n text: bandcamp.getI18n('BANDCAMP_SHOW_FEATURED_TRACKS')\n };\n const switchViewLink: UILink = {\n url: '#',\n text: switchViewLinkData.text,\n onclick: `angular.element('#browse-page').scope().browse.fetchLibrary({uri: '${switchViewLinkData.uri}'}, true)`,\n icon: {\n type: 'fa',\n class: 'fa fa-arrow-circle-right',\n float: 'right',\n color: '#54c688'\n }\n };\n const featuredAlbumsList: RenderedList = {\n title: UIHelper.constructListTitleWithLink(bandcamp.getI18n('BANDCAMP_TRACK_SOURCES'), switchViewLink, false),\n availableListViews: [ 'list', 'grid' ],\n items: []\n };\n\n const _fetchAlbumOrTrackPromise = async (track: TrackEntity) => {\n if (track.album) {\n return track.album;\n }\n else if (track.url) {\n try {\n return await trackModel.getTrack(track.url);\n }\n catch (error: any) {\n return null;\n }\n }\n return null;\n };\n\n const fetchAlbumOrTrackPromises = show.tracks?.map((track) => _fetchAlbumOrTrackPromise(track)) || [];\n\n const fetchedAlbumsOrTracks = (await Promise.all(fetchAlbumOrTrackPromises));\n const albumsAdded: string[] = [];\n\n fetchedAlbumsOrTracks.forEach((item) => {\n if (!item?.url) {\n return true;\n }\n if (item.type === 'track') {\n const rendered = trackRenderer.renderToListItem(item, true, true);\n if (rendered) {\n featuredAlbumsList.items.push(rendered);\n }\n }\n else if (item.type === 'album' && !albumsAdded.includes(item.url)) {\n const rendered = albumRenderer.renderToListItem(item);\n if (rendered) {\n featuredAlbumsList.items.push(rendered);\n albumsAdded.push(item.url);\n }\n }\n });\n\n allLists.push(featuredAlbumsList);\n this.#checkAndAddSwitchViewListItem(switchViewLinkData, allLists);\n }\n else {\n const trackRenderer = this.getRenderer(RendererType.Track);\n const switchViewLinkData = {\n uri: this.#constructUriWithParams({ view: 'albums', noExplode: 1 }),\n text: bandcamp.getI18n('BANDCAMP_SHOW_TRACK_SOURCES')\n };\n const switchViewLink: UILink = {\n url: '#',\n text: switchViewLinkData.text,\n onclick: `angular.element('#browse-page').scope().browse.fetchLibrary({uri: '${switchViewLinkData.uri}'}, true)`,\n icon: {\n type: 'fa',\n class: 'fa fa-arrow-circle-right',\n float: 'right',\n color: '#54c688'\n }\n };\n const featuredTracksList: RenderedList = {\n title: UIHelper.constructListTitleWithLink(bandcamp.getI18n('BANDCAMP_FEATURED_TRACKS'), switchViewLink, false),\n availableListViews: [ 'list' ],\n items: []\n };\n const fetchTrackPromises = show.tracks?.map(async (track) => {\n try {\n if (track.url) {\n return await trackModel.getTrack(track.url);\n }\n return null;\n }\n catch (error: any) {\n return null;\n }\n });\n const tracks = fetchTrackPromises ? await Promise.all(fetchTrackPromises) : [];\n\n tracks.forEach((track) => {\n if (track) {\n const rendered = trackRenderer.renderToListItem(track);\n if (rendered) {\n featuredTracksList.items.push(rendered);\n }\n }\n });\n allLists.push(featuredTracksList);\n this.#checkAndAddSwitchViewListItem(switchViewLinkData, allLists);\n }\n\n return {\n navigation: {\n prev: { uri: this.constructPrevUri() },\n info: showRenderer.renderToHeader(show),\n lists: allLists\n }\n };\n }\n\n #constructUriWithParams(params: object) {\n const targetView = {\n ...this.currentView,\n ...params\n };\n return ViewHelper.constructUriFromViews([\n ...this.previousViews,\n targetView\n ]);\n }\n\n #checkAndAddSwitchViewListItem(linkData: { uri: string; text: string }, allLists: RenderedList[]) {\n if (!UIHelper.supportsEnhancedTitles()) {\n // Compensate for loss of switch view link\n const switchViewListItem: RenderedListItem = {\n service: 'bandcamp',\n type: 'item-no-menu',\n uri: linkData.uri,\n title: linkData.text,\n icon: 'fa fa-arrow-circle-right'\n };\n allLists.push({\n availableListViews: [ 'list' ],\n items: [ switchViewListItem ]\n });\n }\n return allLists;\n }\n\n async getTracksOnExplode(): Promise {\n const showUrl = this.currentView.showUrl;\n if (!showUrl) {\n throw Error('Show URL missing');\n }\n\n const show = await this.getModel(ModelType.Show).getShow(showUrl);\n return {\n type: 'track',\n name: show.name,\n streamUrl: show.streamUrl,\n thumbnail: show.thumbnail,\n artist: {\n type: 'artist',\n name: UIHelper.reformatDate(show.date)\n },\n album: {\n type: 'album',\n name: bandcamp.getI18n('BANDCAMP_HEADER_SHOW')\n },\n showUrl: show.url\n };\n }\n\n /**\n * Override\n *\n * Track uri:\n * bandcamp/show@showUrl={showUrl}\n */\n getTrackUri(track: ShowExplodeTrack) {\n const showView: ShowView = {\n name: 'show',\n showUrl: track.showUrl\n };\n return `bandcamp/${ViewHelper.constructUriSegmentFromView(showView)}`;\n }\n}\n"]} \ No newline at end of file diff --git a/bandcamp/dist/lib/controller/browse/view-handlers/TagViewHandler.d.ts b/bandcamp/dist/lib/controller/browse/view-handlers/TagViewHandler.d.ts index 6bffc9390..80d5fcc0b 100644 --- a/bandcamp/dist/lib/controller/browse/view-handlers/TagViewHandler.d.ts +++ b/bandcamp/dist/lib/controller/browse/view-handlers/TagViewHandler.d.ts @@ -1,23 +1,13 @@ -import View from './View'; -import { RenderedPage } from './ViewHandler'; -import TrackEntity from '../../../entities/TrackEntity'; -import ExplodableViewHandler from './ExplodableViewHandler'; +import type View from './View'; +import { type RenderedPage } from './ViewHandler'; +import BaseViewHandler from './BaseViewHandler'; export interface TagView extends View { name: 'tag'; tagUrl: string; select?: string; } -export default class TagViewHandler extends ExplodableViewHandler { +export default class TagViewHandler extends BaseViewHandler { #private; browse(): Promise; - getTracksOnExplode(): Promise; - /** - * Override - * - * Track uri - one of: - * - bandcamp/album@albumUrl={...}@track={...}@artistUrl={...} - * - bandcamp/track@trackUrl={...}@artistUrl={...}@albumurl={...} - */ - getTrackUri(track: TrackEntity): string | null; } //# sourceMappingURL=TagViewHandler.d.ts.map \ No newline at end of file diff --git a/bandcamp/dist/lib/controller/browse/view-handlers/TagViewHandler.d.ts.map b/bandcamp/dist/lib/controller/browse/view-handlers/TagViewHandler.d.ts.map index 0366b6d13..aa6c68e53 100644 --- a/bandcamp/dist/lib/controller/browse/view-handlers/TagViewHandler.d.ts.map +++ b/bandcamp/dist/lib/controller/browse/view-handlers/TagViewHandler.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"TagViewHandler.d.ts","sourceRoot":"","sources":["../../../../../src/lib/controller/browse/view-handlers/TagViewHandler.ts"],"names":[],"mappings":"AAKA,OAAO,IAAI,MAAM,QAAQ,CAAC;AAC1B,OAAO,EAAgB,YAAY,EAAE,MAAM,eAAe,CAAC;AAK3D,OAAO,WAAW,MAAM,+BAA+B,CAAC;AACxD,OAAO,qBAAqB,MAAM,yBAAyB,CAAC;AAW5D,MAAM,WAAW,OAAQ,SAAQ,IAAI;IACnC,IAAI,EAAE,KAAK,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,CAAC,OAAO,OAAO,cAAe,SAAQ,qBAAqB,CAAC,OAAO,CAAC;;IAElE,MAAM,IAAI,OAAO,CAAC,YAAY,CAAC;IA6R/B,kBAAkB;IAsDxB;;;;;;OAMG;IACH,WAAW,CAAC,KAAK,EAAE,WAAW;CAoC/B"} \ No newline at end of file +{"version":3,"file":"TagViewHandler.d.ts","sourceRoot":"","sources":["../../../../../src/lib/controller/browse/view-handlers/TagViewHandler.ts"],"names":[],"mappings":"AAIA,OAAO,KAAK,IAAI,MAAM,QAAQ,CAAC;AAC/B,OAAO,EAAqB,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AAQrE,OAAO,eAAe,MAAM,mBAAmB,CAAC;AAShD,MAAM,WAAW,OAAQ,SAAQ,IAAI;IACnC,IAAI,EAAE,KAAK,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,CAAC,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,CAAC,OAAO,OAAO,cAAe,SAAQ,eAAe,CAAC,OAAO,CAAC;;IAE5D,MAAM,IAAI,OAAO,CAAC,YAAY,CAAC;CAsItC"} \ No newline at end of file diff --git a/bandcamp/dist/lib/controller/browse/view-handlers/TagViewHandler.js b/bandcamp/dist/lib/controller/browse/view-handlers/TagViewHandler.js index d6fc10b97..cabd2ab27 100644 --- a/bandcamp/dist/lib/controller/browse/view-handlers/TagViewHandler.js +++ b/bandcamp/dist/lib/controller/browse/view-handlers/TagViewHandler.js @@ -1,27 +1,4 @@ "use strict"; -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __importStar = (this && this.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; -}; var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); @@ -30,131 +7,130 @@ var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function ( var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; -var _TagViewHandler_instances, _TagViewHandler_browseTags, _TagViewHandler_getTagsList, _TagViewHandler_browseReleases, _TagViewHandler_getSelectTagList, _TagViewHandler_getFilterOptionsList, _TagViewHandler_getReleasesList, _TagViewHandler_browseFilterOptions, _TagViewHandler_constructTagUrl, _TagViewHandler_constructFilterOptionUrl, _TagViewHandler_constructUriWithParams, _TagViewHandler_getReleasesFiltersFromUriAndDefault; +var _TagViewHandler_instances, _TagViewHandler_browseTags, _TagViewHandler_getTagsList; Object.defineProperty(exports, "__esModule", { value: true }); const BandcampContext_1 = __importDefault(require("../../../BandcampContext")); const model_1 = require("../../../model"); -const UIHelper_1 = __importStar(require("../../../util/UIHelper")); -const ViewHelper_1 = __importDefault(require("./ViewHelper")); +const UIHelper_1 = __importDefault(require("../../../util/UIHelper")); const renderers_1 = require("./renderers"); -const ExplodableViewHandler_1 = __importDefault(require("./ExplodableViewHandler")); +const BaseViewHandler_1 = __importDefault(require("./BaseViewHandler")); const FILTER_ICONS = { sort: 'fa fa-sort', location: 'fa fa-map-marker', format: 'fa fa-archive' }; const FILTER_NAMES = ['format', 'location', 'sort']; -class TagViewHandler extends ExplodableViewHandler_1.default { +class TagViewHandler extends BaseViewHandler_1.default { constructor() { super(...arguments); _TagViewHandler_instances.add(this); - } - async browse() { - const view = this.currentView; - if (view.select) { - return view.select === 'tag' ? __classPrivateFieldGet(this, _TagViewHandler_instances, "m", _TagViewHandler_browseTags).call(this) : __classPrivateFieldGet(this, _TagViewHandler_instances, "m", _TagViewHandler_browseFilterOptions).call(this); - } - else if (view.tagUrl) { - return __classPrivateFieldGet(this, _TagViewHandler_instances, "m", _TagViewHandler_browseReleases).call(this); - } - return __classPrivateFieldGet(this, _TagViewHandler_instances, "m", _TagViewHandler_browseTags).call(this); - } - async getTracksOnExplode() { - const view = this.currentView; - const tagUrl = view.tagUrl; - if (!tagUrl) { + /* Async getTracksOnExplode() { + throw Error('not supported'); + /*const view = this.currentView; + const tagUrl = view.tagUrl; + + if (!tagUrl) { throw Error('Tag URL missing'); - } - const modelParams = { + } + + const modelParams: TagModelGetReleasesParams = { tagUrl, - limit: BandcampContext_1.default.getConfigValue('itemsPerPage', 47), - filters: await __classPrivateFieldGet(this, _TagViewHandler_instances, "m", _TagViewHandler_getReleasesFiltersFromUriAndDefault).call(this) - }; - if (view.pageRef) { + limit: bandcamp.getConfigValue('itemsPerPage', 47), + filters: await this.#getReleasesFiltersFromUriAndDefault() + }; + + if (view.pageRef) { modelParams.pageToken = view.pageRef.pageToken; modelParams.pageOffset = view.pageRef.pageOffset; - } - const releases = await this.getModel(model_1.ModelType.Tag).getReleases(modelParams); - const tracks = releases.items.reduce((result, release) => { + } + + const releases = await this.getModel(ModelType.Tag).getReleases(modelParams); + const tracks = releases.items.reduce((result, release) => { if (release.type === 'album' && release.featuredTrack?.streamUrl) { - const track = { - type: 'track', - name: release.featuredTrack.name, - thumbnail: release.thumbnail, - artist: release.artist, - album: { - type: 'album', - name: release.name, - url: release.url - }, - position: release.featuredTrack.position, - streamUrl: release.featuredTrack.streamUrl - }; - result.push(track); + const track: TrackEntity = { + type: 'track', + name: release.featuredTrack.name, + thumbnail: release.thumbnail, + artist: release.artist, + album: { + type: 'album', + name: release.name, + url: release.url + }, + position: release.featuredTrack.position, + streamUrl: release.featuredTrack.streamUrl + }; + result.push(track); } else if (release.type === 'track') { - const track = { - type: 'track', - name: release.name, - url: release.url, - thumbnail: release.thumbnail, - artist: release.artist, - streamUrl: release.streamUrl - }; - result.push(track); + const track: TrackEntity = { + type: 'track', + name: release.name, + url: release.url, + thumbnail: release.thumbnail, + artist: release.artist, + streamUrl: release.streamUrl + }; + result.push(track); } return result; - }, []); - return tracks; - } - /** - * Override - * - * Track uri - one of: - * - bandcamp/album@albumUrl={...}@track={...}@artistUrl={...} - * - bandcamp/track@trackUrl={...}@artistUrl={...}@albumurl={...} - */ - getTrackUri(track) { - const artistUrl = track.artist?.url || null; - const albumUrl = track.album?.url || artistUrl; - const trackUrl = track.url || null; - if (track.album && albumUrl) { - const albumView = { - name: 'album', - albumUrl + }, []); + + return tracks; + }*/ + /** + * Override + * + * Track uri - one of: + * - bandcamp/album@albumUrl={...}@track={...}@artistUrl={...} + * - bandcamp/track@trackUrl={...}@artistUrl={...}@albumurl={...} + */ + /*GetTrackUri(track: TrackEntity) { + const artistUrl = track.artist?.url || null; + const albumUrl = track.album?.url || artistUrl; + const trackUrl = track.url || null; + + if (track.album && albumUrl) { + const albumView: AlbumView = { + name: 'album', + albumUrl }; if (track.position) { - albumView.track = track.position.toString(); + albumView.track = track.position.toString(); } if (artistUrl) { - albumView.artistUrl = artistUrl; + albumView.artistUrl = artistUrl; } - return `bandcamp/${ViewHelper_1.default.constructUriSegmentFromView(albumView)}`; - } - if (trackUrl) { - const trackView = { - name: 'track', - trackUrl + + return `bandcamp/${ViewHelper.constructUriSegmentFromView(albumView)}`; + } + + if (trackUrl) { + const trackView: TrackView = { + name: 'track', + trackUrl }; if (artistUrl) { - trackView.artistUrl = artistUrl; + trackView.artistUrl = artistUrl; } if (albumUrl) { - trackView.albumUrl = albumUrl; + trackView.albumUrl = albumUrl; } - return `bandcamp/${ViewHelper_1.default.constructUriSegmentFromView(trackView)}`; - } - return null; + return `bandcamp/${ViewHelper.constructUriSegmentFromView(trackView)}`; + } + + return null; + }*/ + } + async browse() { + return __classPrivateFieldGet(this, _TagViewHandler_instances, "m", _TagViewHandler_browseTags).call(this); } } -exports.default = TagViewHandler; _TagViewHandler_instances = new WeakSet(), _TagViewHandler_browseTags = async function _TagViewHandler_browseTags() { - const view = this.currentView; - const tagUrl = view.tagUrl || null; const tags = await this.getModel(model_1.ModelType.Tag).getTags(); const lists = [ - __classPrivateFieldGet(this, _TagViewHandler_instances, "m", _TagViewHandler_getTagsList).call(this, tags, 'tags', BandcampContext_1.default.getI18n('BANDCAMP_TAGS'), 'fa fa-tag', tagUrl), - __classPrivateFieldGet(this, _TagViewHandler_instances, "m", _TagViewHandler_getTagsList).call(this, tags, 'locations', BandcampContext_1.default.getI18n('BANDCAMP_LOCATIONS'), 'fa fa-map-marker', tagUrl) + __classPrivateFieldGet(this, _TagViewHandler_instances, "m", _TagViewHandler_getTagsList).call(this, tags, 'tags', BandcampContext_1.default.getI18n('BANDCAMP_TAGS'), 'fa fa-tag'), + __classPrivateFieldGet(this, _TagViewHandler_instances, "m", _TagViewHandler_getTagsList).call(this, tags, 'locations', BandcampContext_1.default.getI18n('BANDCAMP_LOCATIONS'), 'fa fa-map-marker') ]; return { navigation: { @@ -162,13 +138,10 @@ _TagViewHandler_instances = new WeakSet(), _TagViewHandler_browseTags = async fu lists } }; -}, _TagViewHandler_getTagsList = function _TagViewHandler_getTagsList(tags, key, title, icon, currentTagUrl) { +}, _TagViewHandler_getTagsList = function _TagViewHandler_getTagsList(tags, key, title, icon) { const tagRenderer = this.getRenderer(renderers_1.RendererType.Tag); const listItems = tags[key].reduce((result, tag) => { - const rendered = tagRenderer.renderToListItem(tag, { - selected: tag.url === currentTagUrl, - uri: __classPrivateFieldGet(this, _TagViewHandler_instances, "m", _TagViewHandler_constructTagUrl).call(this, tag.url) - }); + const rendered = tagRenderer.renderToListItem(tag); if (rendered) { result.push(rendered); } @@ -179,202 +152,6 @@ _TagViewHandler_instances = new WeakSet(), _TagViewHandler_browseTags = async fu availableListViews: ['list'], items: listItems }; -}, _TagViewHandler_browseReleases = async function _TagViewHandler_browseReleases() { - const view = this.currentView; - const model = this.getModel(model_1.ModelType.Tag); - const tagUrl = view.tagUrl; - const modelParams = { - tagUrl, - limit: BandcampContext_1.default.getConfigValue('itemsPerPage', 47), - filters: await __classPrivateFieldGet(this, _TagViewHandler_instances, "m", _TagViewHandler_getReleasesFiltersFromUriAndDefault).call(this) - }; - if (view.pageRef) { - modelParams.pageToken = view.pageRef.pageToken; - modelParams.pageOffset = view.pageRef.pageOffset; - } - const filterOptions = await model.getReleasesAvailableFilters(tagUrl); - const releases = await model.getReleases(modelParams); - const baseUri = __classPrivateFieldGet(this, _TagViewHandler_instances, "m", _TagViewHandler_constructUriWithParams).call(this, releases.filters); - const allLists = [ - __classPrivateFieldGet(this, _TagViewHandler_instances, "m", _TagViewHandler_getSelectTagList).call(this, baseUri), - __classPrivateFieldGet(this, _TagViewHandler_instances, "m", _TagViewHandler_getFilterOptionsList).call(this, releases.filters, filterOptions, baseUri), - __classPrivateFieldGet(this, _TagViewHandler_instances, "m", _TagViewHandler_getReleasesList).call(this, releases) - ]; - const tagInfo = await model.getTag(tagUrl); - const tagRenderer = this.getRenderer(renderers_1.RendererType.Tag); - const header = tagRenderer.renderToHeader(tagInfo); - if (header && allLists[2].items.length > 0) { - header.albumart = allLists[2].items[0].albumart; - } - return { - navigation: { - prev: { uri: this.constructPrevUri() }, - info: header, - lists: allLists - } - }; -}, _TagViewHandler_getSelectTagList = function _TagViewHandler_getSelectTagList(baseUri) { - return { - availableListViews: ['list'], - items: [{ - service: 'bandcamp', - type: 'item-no-menu', - title: BandcampContext_1.default.getI18n('BANDCAMP_SELECT_TAG'), - icon: 'fa fa-tag', - uri: `${baseUri}@select=tag` - }] - }; -}, _TagViewHandler_getFilterOptionsList = function _TagViewHandler_getFilterOptionsList(current, all, baseUri) { - const listItems = []; - FILTER_NAMES.forEach((o) => { - const filterValue = current[o]; - if (filterValue != undefined) { - const filter = all.find((f) => f.name === o) || null; - if (filter) { - const opt = filter.options.find((o) => o.value == filterValue); - const title = opt ? opt.name : filterValue; - listItems.push({ - service: 'bandcamp', - type: 'item-no-menu', - title, - icon: FILTER_ICONS[o], - uri: `${baseUri}@select=${o}` - }); - } - } - }); - return { - title: BandcampContext_1.default.getI18n('BANDCAMP_RELEASES'), - availableListViews: ['list'], - items: listItems - }; -}, _TagViewHandler_getReleasesList = function _TagViewHandler_getReleasesList(releases) { - const albumRenderer = this.getRenderer(renderers_1.RendererType.Album); - const trackRenderer = this.getRenderer(renderers_1.RendererType.Track); - const listItems = releases.items.reduce((result, item) => { - let rendered; - if (item.type === 'album') { - rendered = albumRenderer.renderToListItem(item); - } - else if (item.type === 'track') { - rendered = trackRenderer.renderToListItem(item, true, true); - } - if (rendered) { - result.push(rendered); - } - return result; - }, []); - const nextPageRef = this.constructPageRef(releases.nextPageToken, releases.nextPageOffset); - if (nextPageRef) { - const nextUri = this.constructNextUri(nextPageRef); - listItems.push(this.constructNextPageItem(nextUri)); - } - return { - availableListViews: ['list', 'grid'], - items: listItems - }; -}, _TagViewHandler_browseFilterOptions = async function _TagViewHandler_browseFilterOptions() { - const view = this.currentView; - const filterName = view.select; - if (!filterName) { - throw Error('Target filter not specified'); - } - const tagUrl = view.tagUrl; - const filterOptions = await this.getModel(model_1.ModelType.Tag).getReleasesAvailableFilters(tagUrl); - const filter = filterOptions.find((f) => f.name === filterName) || null; - let listItems; - if (filter && view.select) { - listItems = filter.options.reduce((result, opt) => { - const isSelected = opt.value.toString() === view[filterName]; - let title = opt.name; - if (isSelected) { - title = UIHelper_1.default.styleText(title, UIHelper_1.UI_STYLES.LIST_ITEM_SELECTED); - } - result.push({ - service: 'bandcamp', - type: 'item-no-menu', - title, - icon: isSelected ? 'fa fa-check' : 'fa', - uri: __classPrivateFieldGet(this, _TagViewHandler_instances, "m", _TagViewHandler_constructFilterOptionUrl).call(this, filterName, opt.value) - }); - return result; - }, []); - } - else { - listItems = []; - } - let title = BandcampContext_1.default.getI18n(`BANDCAMP_SELECT_${filterName.toUpperCase()}`); - title = UIHelper_1.default.addIconToListTitle(FILTER_ICONS[filterName], title); - const lists = [{ - title, - availableListViews: ['list'], - items: listItems - }]; - return { - navigation: { - prev: { uri: this.constructPrevUri() }, - lists - } - }; -}, _TagViewHandler_constructTagUrl = function _TagViewHandler_constructTagUrl(tagUrl) { - const targetView = { - ...this.currentView - }; - if (this.currentView.tagUrl !== tagUrl) { - delete targetView.pageRef; - delete targetView.prevPageRefs; - targetView.tagUrl = tagUrl; - } - delete targetView.select; - return ViewHelper_1.default.constructUriFromViews([ - ...this.previousViews, - targetView - ]); -}, _TagViewHandler_constructFilterOptionUrl = function _TagViewHandler_constructFilterOptionUrl(optionName, optionValue) { - const targetView = { - ...this.currentView - }; - if (this.currentView[optionName] !== optionValue.toString()) { - delete targetView.pageRef; - delete targetView.prevPageRefs; - targetView[optionName] = optionValue; - } - delete targetView.select; - return ViewHelper_1.default.constructUriFromViews([ - ...this.previousViews, - targetView - ]); -}, _TagViewHandler_constructUriWithParams = function _TagViewHandler_constructUriWithParams(params) { - const targetView = { - ...this.currentView, - ...params - }; - return ViewHelper_1.default.constructUriFromViews([ - ...this.previousViews, - targetView - ]); -}, _TagViewHandler_getReleasesFiltersFromUriAndDefault = async function _TagViewHandler_getReleasesFiltersFromUriAndDefault() { - const view = this.currentView; - const tagUrl = view.tagUrl; - const model = this.getModel(model_1.ModelType.Tag); - const filterOptions = await model.getReleasesAvailableFilters(tagUrl); - const allowedFilterOptions = filterOptions.filter((filter) => FILTER_NAMES.includes(filter.name)); - const defaultFilters = allowedFilterOptions.reduce((result, f) => { - const selected = f.options.find((o) => o.selected); - if (selected) { - result[f.name] = selected.value; - } - return result; - }, {}); - const filtersFromView = Object.keys(view).reduce((result, key) => { - if (FILTER_NAMES.includes(key)) { - result[key] = view[key]; - } - return result; - }, {}); - return { - ...defaultFilters, - ...filtersFromView - }; }; +exports.default = TagViewHandler; //# sourceMappingURL=TagViewHandler.js.map \ No newline at end of file diff --git a/bandcamp/dist/lib/controller/browse/view-handlers/TagViewHandler.js.map b/bandcamp/dist/lib/controller/browse/view-handlers/TagViewHandler.js.map index 5f9d42d52..30b105a55 100644 --- a/bandcamp/dist/lib/controller/browse/view-handlers/TagViewHandler.js.map +++ b/bandcamp/dist/lib/controller/browse/view-handlers/TagViewHandler.js.map @@ -1 +1 @@ -{"version":3,"file":"TagViewHandler.js","sourceRoot":"","sources":["../../../../../src/lib/controller/browse/view-handlers/TagViewHandler.ts"],"names":[],"mappings":"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","sourcesContent":["import { ReleasesByTag } from 'bandcamp-fetch';\nimport bandcamp from '../../../BandcampContext';\nimport TagEntity from '../../../entities/TagEntity';\nimport { ModelType } from '../../../model';\nimport UIHelper, { UI_STYLES } from '../../../util/UIHelper';\nimport View from './View';\nimport { RenderedList, RenderedPage } from './ViewHandler';\nimport ViewHelper from './ViewHelper';\nimport { RendererType } from './renderers';\nimport { RenderedListItem } from './renderers/BaseRenderer';\nimport { ReleasesLoopFetchResult, TagModelGetReleasesParams } from '../../../model/TagModel';\nimport TrackEntity from '../../../entities/TrackEntity';\nimport ExplodableViewHandler from './ExplodableViewHandler';\nimport { AlbumView } from './AlbumViewHandler';\nimport { TrackView } from './TrackViewHandler';\n\nconst FILTER_ICONS: Record = {\n sort: 'fa fa-sort',\n location: 'fa fa-map-marker',\n format: 'fa fa-archive'\n};\nconst FILTER_NAMES = [ 'format', 'location', 'sort' ];\n\nexport interface TagView extends View {\n name: 'tag';\n tagUrl: string;\n select?: string;\n}\n\nexport default class TagViewHandler extends ExplodableViewHandler {\n\n async browse(): Promise {\n const view = this.currentView;\n if (view.select) {\n return view.select === 'tag' ? this.#browseTags() : this.#browseFilterOptions();\n }\n else if (view.tagUrl) {\n return this.#browseReleases();\n }\n\n return this.#browseTags();\n\n }\n\n async #browseTags(): Promise {\n const view = this.currentView;\n const tagUrl = view.tagUrl || null;\n\n const tags = await this.getModel(ModelType.Tag).getTags();\n const lists = [\n this.#getTagsList(tags, 'tags', bandcamp.getI18n('BANDCAMP_TAGS'), 'fa fa-tag', tagUrl),\n this.#getTagsList(tags, 'locations', bandcamp.getI18n('BANDCAMP_LOCATIONS'), 'fa fa-map-marker', tagUrl)\n ];\n\n return {\n navigation: {\n prev: { uri: this.constructPrevUri() },\n lists\n }\n };\n }\n\n #getTagsList(tags: Record, key: string, title: string, icon: string, currentTagUrl: string | null): RenderedList {\n const tagRenderer = this.getRenderer(RendererType.Tag);\n const listItems = tags[key].reduce((result, tag) => {\n const rendered = tagRenderer.renderToListItem(tag, {\n selected: tag.url === currentTagUrl,\n uri: this.#constructTagUrl(tag.url)\n });\n if (rendered) {\n result.push(rendered);\n }\n return result;\n }, []);\n\n return {\n title: UIHelper.addIconToListTitle(icon, title),\n availableListViews: [ 'list' ],\n items: listItems\n };\n }\n\n async #browseReleases(): Promise {\n const view = this.currentView;\n const model = this.getModel(ModelType.Tag);\n const tagUrl = view.tagUrl;\n\n const modelParams: TagModelGetReleasesParams = {\n tagUrl,\n limit: bandcamp.getConfigValue('itemsPerPage', 47),\n filters: await this.#getReleasesFiltersFromUriAndDefault()\n };\n\n if (view.pageRef) {\n modelParams.pageToken = view.pageRef.pageToken;\n modelParams.pageOffset = view.pageRef.pageOffset;\n }\n\n const filterOptions = await model.getReleasesAvailableFilters(tagUrl);\n const releases = await model.getReleases(modelParams);\n const baseUri = this.#constructUriWithParams(releases.filters);\n const allLists = [\n this.#getSelectTagList(baseUri),\n this.#getFilterOptionsList(releases.filters, filterOptions, baseUri),\n this.#getReleasesList(releases)\n ];\n\n const tagInfo = await model.getTag(tagUrl);\n const tagRenderer = this.getRenderer(RendererType.Tag);\n const header = tagRenderer.renderToHeader(tagInfo);\n\n if (header && allLists[2].items.length > 0) {\n header.albumart = allLists[2].items[0].albumart;\n }\n\n return {\n navigation: {\n prev: { uri: this.constructPrevUri() },\n info: header,\n lists: allLists\n }\n };\n }\n\n #getSelectTagList(baseUri: string): RenderedList {\n return {\n availableListViews: [ 'list' ],\n items: [ {\n service: 'bandcamp',\n type: 'item-no-menu',\n title: bandcamp.getI18n('BANDCAMP_SELECT_TAG'),\n icon: 'fa fa-tag',\n uri: `${baseUri}@select=tag`\n } ]\n };\n }\n\n #getFilterOptionsList(current: Record, all: ReleasesByTag.Filter[], baseUri: string): RenderedList {\n const listItems: RenderedListItem[] = [];\n FILTER_NAMES.forEach((o) => {\n const filterValue = current[o];\n if (filterValue != undefined) {\n const filter = all.find((f) => f.name === o) || null;\n if (filter) {\n const opt = filter.options.find((o) => o.value == filterValue);\n const title = opt ? opt.name : filterValue;\n listItems.push({\n service: 'bandcamp',\n type: 'item-no-menu',\n title,\n icon: FILTER_ICONS[o],\n uri: `${baseUri}@select=${o}`\n });\n }\n }\n });\n\n return {\n title: bandcamp.getI18n('BANDCAMP_RELEASES'),\n availableListViews: [ 'list' ],\n items: listItems\n };\n }\n\n #getReleasesList(releases: ReleasesLoopFetchResult): RenderedList {\n const albumRenderer = this.getRenderer(RendererType.Album);\n const trackRenderer = this.getRenderer(RendererType.Track);\n const listItems = releases.items.reduce((result, item) => {\n let rendered;\n if (item.type === 'album') {\n rendered = albumRenderer.renderToListItem(item);\n }\n else if (item.type === 'track') {\n rendered = trackRenderer.renderToListItem(item, true, true);\n }\n if (rendered) {\n result.push(rendered);\n }\n return result;\n }, []);\n\n const nextPageRef = this.constructPageRef(releases.nextPageToken, releases.nextPageOffset);\n if (nextPageRef) {\n const nextUri = this.constructNextUri(nextPageRef);\n listItems.push(this.constructNextPageItem(nextUri));\n }\n return {\n availableListViews: [ 'list', 'grid' ],\n items: listItems\n };\n }\n\n async #browseFilterOptions(): Promise {\n const view = this.currentView;\n const filterName = view.select;\n\n if (!filterName) {\n throw Error('Target filter not specified');\n }\n\n const tagUrl = view.tagUrl;\n const filterOptions = await this.getModel(ModelType.Tag).getReleasesAvailableFilters(tagUrl);\n const filter = filterOptions.find((f) => f.name === filterName) || null;\n let listItems: RenderedListItem[];\n if (filter && view.select) {\n listItems = filter.options.reduce((result, opt) => {\n const isSelected = opt.value.toString() === view[filterName];\n let title = opt.name;\n if (isSelected) {\n title = UIHelper.styleText(title, UI_STYLES.LIST_ITEM_SELECTED);\n }\n result.push({\n service: 'bandcamp',\n type: 'item-no-menu',\n title,\n icon: isSelected ? 'fa fa-check' : 'fa',\n uri: this.#constructFilterOptionUrl(filterName, opt.value)\n });\n\n return result;\n }, []);\n }\n else {\n listItems = [];\n }\n\n let title = bandcamp.getI18n(`BANDCAMP_SELECT_${filterName.toUpperCase()}`);\n title = UIHelper.addIconToListTitle(FILTER_ICONS[filterName], title);\n\n const lists: RenderedList[] = [ {\n title,\n availableListViews: [ 'list' ],\n items: listItems\n } ];\n\n return {\n navigation: {\n prev: { uri: this.constructPrevUri() },\n lists\n }\n };\n }\n\n #constructTagUrl(tagUrl: string) {\n const targetView = {\n ...this.currentView\n };\n\n if (this.currentView.tagUrl !== tagUrl) {\n delete targetView.pageRef;\n delete targetView.prevPageRefs;\n targetView.tagUrl = tagUrl;\n }\n delete targetView.select;\n\n return ViewHelper.constructUriFromViews([\n ...this.previousViews,\n targetView\n ]);\n }\n\n #constructFilterOptionUrl(optionName: string, optionValue: string | number) {\n const targetView = {\n ...this.currentView\n };\n\n if (this.currentView[optionName] !== optionValue.toString()) {\n delete targetView.pageRef;\n delete targetView.prevPageRefs;\n targetView[optionName] = optionValue;\n }\n delete targetView.select;\n\n return ViewHelper.constructUriFromViews([\n ...this.previousViews,\n targetView\n ]);\n }\n\n #constructUriWithParams(params: object) {\n const targetView = {\n ...this.currentView,\n ...params\n };\n\n return ViewHelper.constructUriFromViews([\n ...this.previousViews,\n targetView\n ]);\n }\n\n async #getReleasesFiltersFromUriAndDefault() {\n const view = this.currentView;\n const tagUrl = view.tagUrl;\n const model = this.getModel(ModelType.Tag);\n const filterOptions = await model.getReleasesAvailableFilters(tagUrl);\n const allowedFilterOptions = filterOptions.filter((filter) => FILTER_NAMES.includes(filter.name));\n const defaultFilters = allowedFilterOptions.reduce>((result, f) => {\n const selected = f.options.find((o) => o.selected);\n if (selected) {\n result[f.name] = selected.value;\n }\n return result;\n }, {});\n const filtersFromView = Object.keys(view).reduce>((result, key) => {\n if (FILTER_NAMES.includes(key)) {\n result[key] = view[key];\n }\n return result;\n }, {});\n return {\n ...defaultFilters,\n ...filtersFromView\n };\n }\n\n async getTracksOnExplode() {\n const view = this.currentView;\n const tagUrl = view.tagUrl;\n\n if (!tagUrl) {\n throw Error('Tag URL missing');\n }\n\n const modelParams: TagModelGetReleasesParams = {\n tagUrl,\n limit: bandcamp.getConfigValue('itemsPerPage', 47),\n filters: await this.#getReleasesFiltersFromUriAndDefault()\n };\n\n if (view.pageRef) {\n modelParams.pageToken = view.pageRef.pageToken;\n modelParams.pageOffset = view.pageRef.pageOffset;\n }\n\n const releases = await this.getModel(ModelType.Tag).getReleases(modelParams);\n const tracks = releases.items.reduce((result, release) => {\n if (release.type === 'album' && release.featuredTrack?.streamUrl) {\n const track: TrackEntity = {\n type: 'track',\n name: release.featuredTrack.name,\n thumbnail: release.thumbnail,\n artist: release.artist,\n album: {\n type: 'album',\n name: release.name,\n url: release.url\n },\n position: release.featuredTrack.position,\n streamUrl: release.featuredTrack.streamUrl\n };\n result.push(track);\n }\n else if (release.type === 'track') {\n const track: TrackEntity = {\n type: 'track',\n name: release.name,\n url: release.url,\n thumbnail: release.thumbnail,\n artist: release.artist,\n streamUrl: release.streamUrl\n };\n result.push(track);\n }\n return result;\n }, []);\n\n return tracks;\n }\n\n /**\n * Override\n *\n * Track uri - one of:\n * - bandcamp/album@albumUrl={...}@track={...}@artistUrl={...}\n * - bandcamp/track@trackUrl={...}@artistUrl={...}@albumurl={...}\n */\n getTrackUri(track: TrackEntity) {\n const artistUrl = track.artist?.url || null;\n const albumUrl = track.album?.url || artistUrl;\n const trackUrl = track.url || null;\n\n if (track.album && albumUrl) {\n const albumView: AlbumView = {\n name: 'album',\n albumUrl\n };\n if (track.position) {\n albumView.track = track.position.toString();\n }\n if (artistUrl) {\n albumView.artistUrl = artistUrl;\n }\n\n return `bandcamp/${ViewHelper.constructUriSegmentFromView(albumView)}`;\n }\n\n if (trackUrl) {\n const trackView: TrackView = {\n name: 'track',\n trackUrl\n };\n if (artistUrl) {\n trackView.artistUrl = artistUrl;\n }\n if (albumUrl) {\n trackView.albumUrl = albumUrl;\n }\n return `bandcamp/${ViewHelper.constructUriSegmentFromView(trackView)}`;\n }\n\n return null;\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"TagViewHandler.js","sourceRoot":"","sources":["../../../../../src/lib/controller/browse/view-handlers/TagViewHandler.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,+EAAgD;AAEhD,0CAA2C;AAC3C,sEAA6D;AAI7D,2CAA2C;AAM3C,wEAAgD;AAEhD,MAAM,YAAY,GAA2B;IAC3C,IAAI,EAAE,YAAY;IAClB,QAAQ,EAAE,kBAAkB;IAC5B,MAAM,EAAE,eAAe;CACxB,CAAC;AACF,MAAM,YAAY,GAAG,CAAE,QAAQ,EAAE,UAAU,EAAE,MAAM,CAAE,CAAC;AAQtD,MAAqB,cAAe,SAAQ,yBAAwB;IAApE;;;QAsCE;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;WAqDG;QAEH;;;;;;WAMG;QACH;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;WAmCG;IACL,CAAC;IAtIC,KAAK,CAAC,MAAM;QACV,OAAO,uBAAA,IAAI,6DAAY,MAAhB,IAAI,CAAc,CAAC;IAC5B,CAAC;CAoIF;wEAlIC,KAAK;IACH,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,iBAAS,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC;IAC1D,MAAM,KAAK,GAAG;QACZ,uBAAA,IAAI,8DAAa,MAAjB,IAAI,EAAc,IAAI,EAAE,MAAM,EAAE,yBAAQ,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,WAAW,CAAC;QAC/E,uBAAA,IAAI,8DAAa,MAAjB,IAAI,EAAc,IAAI,EAAE,WAAW,EAAE,yBAAQ,CAAC,OAAO,CAAC,oBAAoB,CAAC,EAAE,kBAAkB,CAAC;KACjG,CAAC;IAEF,OAAO;QACL,UAAU,EAAE;YACV,IAAI,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,gBAAgB,EAAE,EAAE;YACtC,KAAK;SACN;KACF,CAAC;AACJ,CAAC,qEAEY,IAAiC,EAAE,GAAW,EAAE,KAAa,EAAE,IAAY;IACtF,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC,wBAAY,CAAC,GAAG,CAAC,CAAC;IACvD,MAAM,SAAS,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,MAAM,CAAqB,CAAC,MAAM,EAAE,GAAG,EAAE,EAAE;QACrE,MAAM,QAAQ,GAAG,WAAW,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;QACnD,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QACxB,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC,EAAE,EAAE,CAAC,CAAC;IAEP,OAAO;QACL,KAAK,EAAE,kBAAQ,CAAC,kBAAkB,CAAC,IAAI,EAAE,KAAK,CAAC;QAC/C,kBAAkB,EAAE,CAAE,MAAM,CAAE;QAC9B,KAAK,EAAE,SAAS;KACjB,CAAC;AACJ,CAAC;kBApCkB,cAAc","sourcesContent":["import bandcamp from '../../../BandcampContext';\nimport type TagEntity from '../../../entities/TagEntity';\nimport { ModelType } from '../../../model';\nimport UIHelper, { UI_STYLES } from '../../../util/UIHelper';\nimport type View from './View';\nimport { type RenderedList, type RenderedPage } from './ViewHandler';\nimport ViewHelper from './ViewHelper';\nimport { RendererType } from './renderers';\nimport { type RenderedListItem } from './renderers/BaseRenderer';\nimport TrackEntity from '../../../entities/TrackEntity';\nimport ExplodableViewHandler from './ExplodableViewHandler';\nimport { AlbumView } from './AlbumViewHandler';\nimport { TrackView } from './TrackViewHandler';\nimport BaseViewHandler from './BaseViewHandler';\n\nconst FILTER_ICONS: Record = {\n sort: 'fa fa-sort',\n location: 'fa fa-map-marker',\n format: 'fa fa-archive'\n};\nconst FILTER_NAMES = [ 'format', 'location', 'sort' ];\n\nexport interface TagView extends View {\n name: 'tag';\n tagUrl: string;\n select?: string;\n}\n\nexport default class TagViewHandler extends BaseViewHandler {\n\n async browse(): Promise {\n return this.#browseTags();\n }\n\n async #browseTags(): Promise {\n const tags = await this.getModel(ModelType.Tag).getTags();\n const lists = [\n this.#getTagsList(tags, 'tags', bandcamp.getI18n('BANDCAMP_TAGS'), 'fa fa-tag'),\n this.#getTagsList(tags, 'locations', bandcamp.getI18n('BANDCAMP_LOCATIONS'), 'fa fa-map-marker')\n ];\n\n return {\n navigation: {\n prev: { uri: this.constructPrevUri() },\n lists\n }\n };\n }\n\n #getTagsList(tags: Record, key: string, title: string, icon: string): RenderedList {\n const tagRenderer = this.getRenderer(RendererType.Tag);\n const listItems = tags[key].reduce((result, tag) => {\n const rendered = tagRenderer.renderToListItem(tag);\n if (rendered) {\n result.push(rendered);\n }\n return result;\n }, []);\n\n return {\n title: UIHelper.addIconToListTitle(icon, title),\n availableListViews: [ 'list' ],\n items: listItems\n };\n }\n\n /* Async getTracksOnExplode() {\n throw Error('not supported');\n /*const view = this.currentView;\n const tagUrl = view.tagUrl;\n\n if (!tagUrl) {\n throw Error('Tag URL missing');\n }\n\n const modelParams: TagModelGetReleasesParams = {\n tagUrl,\n limit: bandcamp.getConfigValue('itemsPerPage', 47),\n filters: await this.#getReleasesFiltersFromUriAndDefault()\n };\n\n if (view.pageRef) {\n modelParams.pageToken = view.pageRef.pageToken;\n modelParams.pageOffset = view.pageRef.pageOffset;\n }\n\n const releases = await this.getModel(ModelType.Tag).getReleases(modelParams);\n const tracks = releases.items.reduce((result, release) => {\n if (release.type === 'album' && release.featuredTrack?.streamUrl) {\n const track: TrackEntity = {\n type: 'track',\n name: release.featuredTrack.name,\n thumbnail: release.thumbnail,\n artist: release.artist,\n album: {\n type: 'album',\n name: release.name,\n url: release.url\n },\n position: release.featuredTrack.position,\n streamUrl: release.featuredTrack.streamUrl\n };\n result.push(track);\n }\n else if (release.type === 'track') {\n const track: TrackEntity = {\n type: 'track',\n name: release.name,\n url: release.url,\n thumbnail: release.thumbnail,\n artist: release.artist,\n streamUrl: release.streamUrl\n };\n result.push(track);\n }\n return result;\n }, []);\n\n return tracks;\n }*/\n\n /**\n * Override\n *\n * Track uri - one of:\n * - bandcamp/album@albumUrl={...}@track={...}@artistUrl={...}\n * - bandcamp/track@trackUrl={...}@artistUrl={...}@albumurl={...}\n */\n /*GetTrackUri(track: TrackEntity) {\n const artistUrl = track.artist?.url || null;\n const albumUrl = track.album?.url || artistUrl;\n const trackUrl = track.url || null;\n\n if (track.album && albumUrl) {\n const albumView: AlbumView = {\n name: 'album',\n albumUrl\n };\n if (track.position) {\n albumView.track = track.position.toString();\n }\n if (artistUrl) {\n albumView.artistUrl = artistUrl;\n }\n\n return `bandcamp/${ViewHelper.constructUriSegmentFromView(albumView)}`;\n }\n\n if (trackUrl) {\n const trackView: TrackView = {\n name: 'track',\n trackUrl\n };\n if (artistUrl) {\n trackView.artistUrl = artistUrl;\n }\n if (albumUrl) {\n trackView.albumUrl = albumUrl;\n }\n return `bandcamp/${ViewHelper.constructUriSegmentFromView(trackView)}`;\n }\n\n return null;\n }*/\n}\n"]} \ No newline at end of file diff --git a/bandcamp/dist/lib/controller/browse/view-handlers/TrackViewHandler.d.ts b/bandcamp/dist/lib/controller/browse/view-handlers/TrackViewHandler.d.ts index 09a5cc416..6c46e6945 100644 --- a/bandcamp/dist/lib/controller/browse/view-handlers/TrackViewHandler.d.ts +++ b/bandcamp/dist/lib/controller/browse/view-handlers/TrackViewHandler.d.ts @@ -1,6 +1,6 @@ import ExplodableViewHandler from './ExplodableViewHandler'; -import View from './View'; -import { RenderedPage } from './ViewHandler'; +import type View from './View'; +import { type RenderedPage } from './ViewHandler'; export interface TrackView extends View { name: 'track'; trackUrl: string; diff --git a/bandcamp/dist/lib/controller/browse/view-handlers/TrackViewHandler.d.ts.map b/bandcamp/dist/lib/controller/browse/view-handlers/TrackViewHandler.d.ts.map index 3dfe2caf5..035c719c9 100644 --- a/bandcamp/dist/lib/controller/browse/view-handlers/TrackViewHandler.d.ts.map +++ b/bandcamp/dist/lib/controller/browse/view-handlers/TrackViewHandler.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"TrackViewHandler.d.ts","sourceRoot":"","sources":["../../../../../src/lib/controller/browse/view-handlers/TrackViewHandler.ts"],"names":[],"mappings":"AAIA,OAAO,qBAAqB,MAAM,yBAAyB,CAAC;AAC5D,OAAO,IAAI,MAAM,QAAQ,CAAC;AAC1B,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AAM7C,MAAM,WAAW,SAAU,SAAQ,IAAI;IACrC,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IAEjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,CAAC,OAAO,OAAO,gBAAiB,SAAQ,qBAAqB,CAAC,SAAS,CAAC;;IAEtE,MAAM,IAAI,OAAO,CAAC,YAAY,CAAC;IAkDrC,kBAAkB;CAQnB"} \ No newline at end of file +{"version":3,"file":"TrackViewHandler.d.ts","sourceRoot":"","sources":["../../../../../src/lib/controller/browse/view-handlers/TrackViewHandler.ts"],"names":[],"mappings":"AAIA,OAAO,qBAAqB,MAAM,yBAAyB,CAAC;AAC5D,OAAO,KAAK,IAAI,MAAM,QAAQ,CAAC;AAC/B,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,eAAe,CAAC;AAMlD,MAAM,WAAW,SAAU,SAAQ,IAAI;IACrC,IAAI,EAAE,OAAO,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IAEjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,CAAC,OAAO,OAAO,gBAAiB,SAAQ,qBAAqB,CAAC,SAAS,CAAC;;IAEtE,MAAM,IAAI,OAAO,CAAC,YAAY,CAAC;IAkDrC,kBAAkB;CAQnB"} \ No newline at end of file diff --git a/bandcamp/dist/lib/controller/browse/view-handlers/TrackViewHandler.js b/bandcamp/dist/lib/controller/browse/view-handlers/TrackViewHandler.js index 633d57572..6431e3c5d 100644 --- a/bandcamp/dist/lib/controller/browse/view-handlers/TrackViewHandler.js +++ b/bandcamp/dist/lib/controller/browse/view-handlers/TrackViewHandler.js @@ -36,7 +36,6 @@ class TrackViewHandler extends ExplodableViewHandler_1.default { return this.getModel(model_1.ModelType.Track).getTrack(trackUrl); } } -exports.default = TrackViewHandler; _TrackViewHandler_instances = new WeakSet(), _TrackViewHandler_browseTrack = async function _TrackViewHandler_browseTrack(trackUrl) { const trackInfo = await this.getModel(model_1.ModelType.Track).getTrack(trackUrl); if (trackInfo.album?.url) { @@ -74,4 +73,5 @@ _TrackViewHandler_instances = new WeakSet(), _TrackViewHandler_browseTrack = asy } }; }; +exports.default = TrackViewHandler; //# sourceMappingURL=TrackViewHandler.js.map \ No newline at end of file diff --git a/bandcamp/dist/lib/controller/browse/view-handlers/TrackViewHandler.js.map b/bandcamp/dist/lib/controller/browse/view-handlers/TrackViewHandler.js.map index b3d7e638a..a803a1b09 100644 --- a/bandcamp/dist/lib/controller/browse/view-handlers/TrackViewHandler.js.map +++ b/bandcamp/dist/lib/controller/browse/view-handlers/TrackViewHandler.js.map @@ -1 +1 @@ -{"version":3,"file":"TrackViewHandler.js","sourceRoot":"","sources":["../../../../../src/lib/controller/browse/view-handlers/TrackViewHandler.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,+EAAgD;AAChD,0CAA2C;AAC3C,sEAA0D;AAE1D,oFAA4D;AAG5D,8EAAsD;AACtD,8DAAsC;AACtC,2CAA2C;AAW3C,MAAqB,gBAAiB,SAAQ,+BAAgC;IAA9E;;;IA4DA,CAAC;IA1DC,KAAK,CAAC,MAAM;QACV,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC;QAE3C,IAAI,CAAC,QAAQ,EAAE;YACb,MAAM,KAAK,CAAC,mBAAmB,CAAC,CAAC;SAClC;QAED,OAAO,uBAAA,IAAI,kEAAa,MAAjB,IAAI,EAAc,QAAQ,CAAC,CAAC;IACrC,CAAC;IA0CD,kBAAkB;QAChB,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC;QAC3C,IAAI,CAAC,QAAQ,EAAE;YACb,MAAM,KAAK,CAAC,mBAAmB,CAAC,CAAC;SAClC;QAED,OAAO,IAAI,CAAC,QAAQ,CAAC,iBAAS,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC3D,CAAC;CACF;AA5DD,mCA4DC;6EAhDC,KAAK,wCAAc,QAAgB;IACjC,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,iBAAS,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC1E,IAAI,SAAS,CAAC,KAAK,EAAE,GAAG,EAAE;QACxB,MAAM,SAAS,GAAc;YAC3B,IAAI,EAAE,OAAO;YACb,QAAQ,EAAE,SAAS,CAAC,KAAK,CAAC,GAAG;SAC9B,CAAC;QACF,MAAM,YAAY,GAAG,oBAAU,CAAC,qBAAqB,CAAC;YACpD,GAAG,IAAI,CAAC,aAAa;YACrB,SAAS;SACV,CAAC,CAAC;QACH,MAAM,gBAAgB,GAAG,4BAAkB,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;QACrE,OAAO,gBAAgB,CAAC,MAAM,EAAE,CAAC;KAClC;IAED,MAAM,aAAa,GAAG,IAAI,CAAC,WAAW,CAAC,wBAAY,CAAC,KAAK,CAAC,CAAC;IAC3D,MAAM,QAAQ,GAAG,aAAa,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;IAC3D,MAAM,SAAS,GAAuB,QAAQ,CAAC,CAAC,CAAC,CAAE,QAAQ,CAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACnE,MAAM,qBAAqB,GAAW;QACpC,GAAG,EAAE,QAAQ;QACb,IAAI,EAAE,yBAAQ,CAAC,OAAO,CAAC,0BAA0B,CAAC;QAClD,IAAI,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE;QAC1B,MAAM,EAAE,QAAQ;KACjB,CAAC;IAEF,OAAO;QACL,UAAU,EAAE;YACV,IAAI,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,gBAAgB,EAAE,EAAE;YACtC,IAAI,EAAE,aAAa,CAAC,cAAc,CAAC,SAAS,CAAC;YAC7C,KAAK,EAAE;gBACL;oBACE,KAAK,EAAE,kBAAQ,CAAC,0BAA0B,CAAC,EAAE,EAAE,qBAAqB,EAAE,IAAI,CAAC;oBAC3E,kBAAkB,EAAE,CAAE,MAAM,CAAE;oBAC9B,KAAK,EAAE,SAAS;iBACjB;aACF;SACF;KACF,CAAC;AACJ,CAAC","sourcesContent":["import bandcamp from '../../../BandcampContext';\nimport { ModelType } from '../../../model';\nimport UIHelper, { UILink } from '../../../util/UIHelper';\nimport { AlbumView } from './AlbumViewHandler';\nimport ExplodableViewHandler from './ExplodableViewHandler';\nimport View from './View';\nimport { RenderedPage } from './ViewHandler';\nimport ViewHandlerFactory from './ViewHandlerFactory';\nimport ViewHelper from './ViewHelper';\nimport { RendererType } from './renderers';\nimport { RenderedListItem } from './renderers/BaseRenderer';\n\nexport interface TrackView extends View {\n name: 'track';\n trackUrl: string;\n // For explode track URIs (used by `goto()`)\n artistUrl?: string;\n albumUrl?: string;\n}\n\nexport default class TrackViewHandler extends ExplodableViewHandler {\n\n async browse(): Promise {\n const trackUrl = this.currentView.trackUrl;\n\n if (!trackUrl) {\n throw Error('Track URL missing');\n }\n\n return this.#browseTrack(trackUrl);\n }\n\n async #browseTrack(trackUrl: string): Promise {\n const trackInfo = await this.getModel(ModelType.Track).getTrack(trackUrl);\n if (trackInfo.album?.url) {\n const albumView: AlbumView = {\n name: 'album',\n albumUrl: trackInfo.album.url\n };\n const albumViewUri = ViewHelper.constructUriFromViews([\n ...this.previousViews,\n albumView\n ]);\n const albumViewHandler = ViewHandlerFactory.getHandler(albumViewUri);\n return albumViewHandler.browse();\n }\n\n const trackRenderer = this.getRenderer(RendererType.Track);\n const rendered = trackRenderer.renderToListItem(trackInfo);\n const listItems: RenderedListItem[] = rendered ? [ rendered ] : [];\n const viewTrackExternalLink: UILink = {\n url: trackUrl,\n text: bandcamp.getI18n('BANDCAMP_VIEW_LINK_TRACK'),\n icon: { type: 'bandcamp' },\n target: '_blank'\n };\n\n return {\n navigation: {\n prev: { uri: this.constructPrevUri() },\n info: trackRenderer.renderToHeader(trackInfo),\n lists: [\n {\n title: UIHelper.constructListTitleWithLink('', viewTrackExternalLink, true),\n availableListViews: [ 'list' ],\n items: listItems\n }\n ]\n }\n };\n }\n\n getTracksOnExplode() {\n const trackUrl = this.currentView.trackUrl;\n if (!trackUrl) {\n throw Error('Track URL missing');\n }\n\n return this.getModel(ModelType.Track).getTrack(trackUrl);\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"TrackViewHandler.js","sourceRoot":"","sources":["../../../../../src/lib/controller/browse/view-handlers/TrackViewHandler.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,+EAAgD;AAChD,0CAA2C;AAC3C,sEAA+D;AAE/D,oFAA4D;AAG5D,8EAAsD;AACtD,8DAAsC;AACtC,2CAA2C;AAW3C,MAAqB,gBAAiB,SAAQ,+BAAgC;IAA9E;;;IA4DA,CAAC;IA1DC,KAAK,CAAC,MAAM;QACV,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC;QAE3C,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,KAAK,CAAC,mBAAmB,CAAC,CAAC;QACnC,CAAC;QAED,OAAO,uBAAA,IAAI,kEAAa,MAAjB,IAAI,EAAc,QAAQ,CAAC,CAAC;IACrC,CAAC;IA0CD,kBAAkB;QAChB,MAAM,QAAQ,GAAG,IAAI,CAAC,WAAW,CAAC,QAAQ,CAAC;QAC3C,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,KAAK,CAAC,mBAAmB,CAAC,CAAC;QACnC,CAAC;QAED,OAAO,IAAI,CAAC,QAAQ,CAAC,iBAAS,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC3D,CAAC;CACF;6EAhDC,KAAK,wCAAc,QAAgB;IACjC,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,iBAAS,CAAC,KAAK,CAAC,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC1E,IAAI,SAAS,CAAC,KAAK,EAAE,GAAG,EAAE,CAAC;QACzB,MAAM,SAAS,GAAc;YAC3B,IAAI,EAAE,OAAO;YACb,QAAQ,EAAE,SAAS,CAAC,KAAK,CAAC,GAAG;SAC9B,CAAC;QACF,MAAM,YAAY,GAAG,oBAAU,CAAC,qBAAqB,CAAC;YACpD,GAAG,IAAI,CAAC,aAAa;YACrB,SAAS;SACV,CAAC,CAAC;QACH,MAAM,gBAAgB,GAAG,4BAAkB,CAAC,UAAU,CAAC,YAAY,CAAC,CAAC;QACrE,OAAO,gBAAgB,CAAC,MAAM,EAAE,CAAC;IACnC,CAAC;IAED,MAAM,aAAa,GAAG,IAAI,CAAC,WAAW,CAAC,wBAAY,CAAC,KAAK,CAAC,CAAC;IAC3D,MAAM,QAAQ,GAAG,aAAa,CAAC,gBAAgB,CAAC,SAAS,CAAC,CAAC;IAC3D,MAAM,SAAS,GAAuB,QAAQ,CAAC,CAAC,CAAC,CAAE,QAAQ,CAAE,CAAC,CAAC,CAAC,EAAE,CAAC;IACnE,MAAM,qBAAqB,GAAW;QACpC,GAAG,EAAE,QAAQ;QACb,IAAI,EAAE,yBAAQ,CAAC,OAAO,CAAC,0BAA0B,CAAC;QAClD,IAAI,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE;QAC1B,MAAM,EAAE,QAAQ;KACjB,CAAC;IAEF,OAAO;QACL,UAAU,EAAE;YACV,IAAI,EAAE,EAAE,GAAG,EAAE,IAAI,CAAC,gBAAgB,EAAE,EAAE;YACtC,IAAI,EAAE,aAAa,CAAC,cAAc,CAAC,SAAS,CAAC;YAC7C,KAAK,EAAE;gBACL;oBACE,KAAK,EAAE,kBAAQ,CAAC,0BAA0B,CAAC,EAAE,EAAE,qBAAqB,EAAE,IAAI,CAAC;oBAC3E,kBAAkB,EAAE,CAAE,MAAM,CAAE;oBAC9B,KAAK,EAAE,SAAS;iBACjB;aACF;SACF;KACF,CAAC;AACJ,CAAC;kBAlDkB,gBAAgB","sourcesContent":["import bandcamp from '../../../BandcampContext';\nimport { ModelType } from '../../../model';\nimport UIHelper, { type UILink } from '../../../util/UIHelper';\nimport { type AlbumView } from './AlbumViewHandler';\nimport ExplodableViewHandler from './ExplodableViewHandler';\nimport type View from './View';\nimport { type RenderedPage } from './ViewHandler';\nimport ViewHandlerFactory from './ViewHandlerFactory';\nimport ViewHelper from './ViewHelper';\nimport { RendererType } from './renderers';\nimport { type RenderedListItem } from './renderers/BaseRenderer';\n\nexport interface TrackView extends View {\n name: 'track';\n trackUrl: string;\n // For explode track URIs (used by `goto()`)\n artistUrl?: string;\n albumUrl?: string;\n}\n\nexport default class TrackViewHandler extends ExplodableViewHandler {\n\n async browse(): Promise {\n const trackUrl = this.currentView.trackUrl;\n\n if (!trackUrl) {\n throw Error('Track URL missing');\n }\n\n return this.#browseTrack(trackUrl);\n }\n\n async #browseTrack(trackUrl: string): Promise {\n const trackInfo = await this.getModel(ModelType.Track).getTrack(trackUrl);\n if (trackInfo.album?.url) {\n const albumView: AlbumView = {\n name: 'album',\n albumUrl: trackInfo.album.url\n };\n const albumViewUri = ViewHelper.constructUriFromViews([\n ...this.previousViews,\n albumView\n ]);\n const albumViewHandler = ViewHandlerFactory.getHandler(albumViewUri);\n return albumViewHandler.browse();\n }\n\n const trackRenderer = this.getRenderer(RendererType.Track);\n const rendered = trackRenderer.renderToListItem(trackInfo);\n const listItems: RenderedListItem[] = rendered ? [ rendered ] : [];\n const viewTrackExternalLink: UILink = {\n url: trackUrl,\n text: bandcamp.getI18n('BANDCAMP_VIEW_LINK_TRACK'),\n icon: { type: 'bandcamp' },\n target: '_blank'\n };\n\n return {\n navigation: {\n prev: { uri: this.constructPrevUri() },\n info: trackRenderer.renderToHeader(trackInfo),\n lists: [\n {\n title: UIHelper.constructListTitleWithLink('', viewTrackExternalLink, true),\n availableListViews: [ 'list' ],\n items: listItems\n }\n ]\n }\n };\n }\n\n getTracksOnExplode() {\n const trackUrl = this.currentView.trackUrl;\n if (!trackUrl) {\n throw Error('Track URL missing');\n }\n\n return this.getModel(ModelType.Track).getTrack(trackUrl);\n }\n}\n"]} \ No newline at end of file diff --git a/bandcamp/dist/lib/controller/browse/view-handlers/ViewHandler.d.ts b/bandcamp/dist/lib/controller/browse/view-handlers/ViewHandler.d.ts index 13fb6bb95..117979398 100644 --- a/bandcamp/dist/lib/controller/browse/view-handlers/ViewHandler.d.ts +++ b/bandcamp/dist/lib/controller/browse/view-handlers/ViewHandler.d.ts @@ -1,4 +1,4 @@ -import { RenderedHeader, RenderedListItem } from './renderers/BaseRenderer'; +import { type RenderedHeader, type RenderedListItem } from './renderers/BaseRenderer'; export interface RenderedPage { navigation?: RenderedPageContents; } diff --git a/bandcamp/dist/lib/controller/browse/view-handlers/ViewHandler.d.ts.map b/bandcamp/dist/lib/controller/browse/view-handlers/ViewHandler.d.ts.map index bc00789e0..63807693a 100644 --- a/bandcamp/dist/lib/controller/browse/view-handlers/ViewHandler.d.ts.map +++ b/bandcamp/dist/lib/controller/browse/view-handlers/ViewHandler.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"ViewHandler.d.ts","sourceRoot":"","sources":["../../../../../src/lib/controller/browse/view-handlers/ViewHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAE5E,MAAM,WAAW,YAAY;IAC3B,UAAU,CAAC,EAAE,oBAAoB,CAAC;CACnC;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,CAAC,EAAE;QACL,GAAG,CAAC,EAAE,MAAM,CAAA;KACb,CAAC;IACF,IAAI,CAAC,EAAE,cAAc,GAAG,IAAI,CAAC;IAC7B,KAAK,CAAC,EAAE,YAAY,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kBAAkB,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;IACxC,KAAK,EAAE,gBAAgB,EAAE,CAAC;CAC3B;AAED,MAAM,CAAC,OAAO,CAAC,QAAQ,OAAO,WAAW;IACvC,QAAQ,CAAC,MAAM,IAAI,OAAO,CAAC,YAAY,CAAC;IACxC,QAAQ,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC;CACjC"} \ No newline at end of file +{"version":3,"file":"ViewHandler.d.ts","sourceRoot":"","sources":["../../../../../src/lib/controller/browse/view-handlers/ViewHandler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,cAAc,EAAE,KAAK,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAEtF,MAAM,WAAW,YAAY;IAC3B,UAAU,CAAC,EAAE,oBAAoB,CAAC;CACnC;AAED,MAAM,WAAW,oBAAoB;IACnC,IAAI,CAAC,EAAE;QACL,GAAG,CAAC,EAAE,MAAM,CAAA;KACb,CAAC;IACF,IAAI,CAAC,EAAE,cAAc,GAAG,IAAI,CAAC;IAC7B,KAAK,CAAC,EAAE,YAAY,EAAE,CAAC;CACxB;AAED,MAAM,WAAW,YAAY;IAC3B,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,kBAAkB,EAAE,CAAC,MAAM,GAAG,MAAM,CAAC,EAAE,CAAC;IACxC,KAAK,EAAE,gBAAgB,EAAE,CAAC;CAC3B;AAED,MAAM,CAAC,OAAO,CAAC,QAAQ,OAAO,WAAW;IACvC,QAAQ,CAAC,MAAM,IAAI,OAAO,CAAC,YAAY,CAAC;IACxC,QAAQ,CAAC,OAAO,IAAI,OAAO,CAAC,GAAG,CAAC;CACjC"} \ No newline at end of file diff --git a/bandcamp/dist/lib/controller/browse/view-handlers/ViewHandler.js.map b/bandcamp/dist/lib/controller/browse/view-handlers/ViewHandler.js.map index ea7b2cf25..3cbac0975 100644 --- a/bandcamp/dist/lib/controller/browse/view-handlers/ViewHandler.js.map +++ b/bandcamp/dist/lib/controller/browse/view-handlers/ViewHandler.js.map @@ -1 +1 @@ -{"version":3,"file":"ViewHandler.js","sourceRoot":"","sources":["../../../../../src/lib/controller/browse/view-handlers/ViewHandler.ts"],"names":[],"mappings":";;AAoBA,MAA8B,WAAW;CAGxC;AAHD,8BAGC","sourcesContent":["import { RenderedHeader, RenderedListItem } from './renderers/BaseRenderer';\n\nexport interface RenderedPage {\n navigation?: RenderedPageContents;\n}\n\nexport interface RenderedPageContents {\n prev?: {\n uri?: string\n };\n info?: RenderedHeader | null;\n lists?: RenderedList[];\n}\n\nexport interface RenderedList {\n title?: string;\n availableListViews: ('list' | 'grid')[];\n items: RenderedListItem[];\n}\n\nexport default abstract class ViewHandler {\n abstract browse(): Promise;\n abstract explode(): Promise;\n}\n"]} \ No newline at end of file +{"version":3,"file":"ViewHandler.js","sourceRoot":"","sources":["../../../../../src/lib/controller/browse/view-handlers/ViewHandler.ts"],"names":[],"mappings":";;AAoBA,MAA8B,WAAW;CAGxC;AAHD,8BAGC","sourcesContent":["import { type RenderedHeader, type RenderedListItem } from './renderers/BaseRenderer';\n\nexport interface RenderedPage {\n navigation?: RenderedPageContents;\n}\n\nexport interface RenderedPageContents {\n prev?: {\n uri?: string\n };\n info?: RenderedHeader | null;\n lists?: RenderedList[];\n}\n\nexport interface RenderedList {\n title?: string;\n availableListViews: ('list' | 'grid')[];\n items: RenderedListItem[];\n}\n\nexport default abstract class ViewHandler {\n abstract browse(): Promise;\n abstract explode(): Promise;\n}\n"]} \ No newline at end of file diff --git a/bandcamp/dist/lib/controller/browse/view-handlers/ViewHandlerFactory.d.ts b/bandcamp/dist/lib/controller/browse/view-handlers/ViewHandlerFactory.d.ts index 43e2056bd..b7e0b912f 100644 --- a/bandcamp/dist/lib/controller/browse/view-handlers/ViewHandlerFactory.d.ts +++ b/bandcamp/dist/lib/controller/browse/view-handlers/ViewHandlerFactory.d.ts @@ -1,5 +1,5 @@ -import BaseViewHandler from './BaseViewHandler'; -import View from './View'; +import type BaseViewHandler from './BaseViewHandler'; +import type View from './View'; export default class ViewHandlerFactory { static getHandler(uri: string): BaseViewHandler; } diff --git a/bandcamp/dist/lib/controller/browse/view-handlers/ViewHandlerFactory.d.ts.map b/bandcamp/dist/lib/controller/browse/view-handlers/ViewHandlerFactory.d.ts.map index cdcf15fb7..1d9dc77a7 100644 --- a/bandcamp/dist/lib/controller/browse/view-handlers/ViewHandlerFactory.d.ts.map +++ b/bandcamp/dist/lib/controller/browse/view-handlers/ViewHandlerFactory.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"ViewHandlerFactory.d.ts","sourceRoot":"","sources":["../../../../../src/lib/controller/browse/view-handlers/ViewHandlerFactory.ts"],"names":[],"mappings":"AAGA,OAAO,eAAe,MAAM,mBAAmB,CAAC;AAQhD,OAAO,IAAI,MAAM,QAAQ,CAAC;AAmB1B,MAAM,CAAC,OAAO,OAAO,kBAAkB;IAErC,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,IAAI,EAAE,GAAG,EAAE,MAAM,GAAG,eAAe,CAAC,CAAC,CAAC;CAuCnE"} \ No newline at end of file +{"version":3,"file":"ViewHandlerFactory.d.ts","sourceRoot":"","sources":["../../../../../src/lib/controller/browse/view-handlers/ViewHandlerFactory.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,eAAe,MAAM,mBAAmB,CAAC;AAQrD,OAAO,KAAK,IAAI,MAAM,QAAQ,CAAC;AAmB/B,MAAM,CAAC,OAAO,OAAO,kBAAkB;IAErC,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,IAAI,EAAE,GAAG,EAAE,MAAM,GAAG,eAAe,CAAC,CAAC,CAAC;CAuCnE"} \ No newline at end of file diff --git a/bandcamp/dist/lib/controller/browse/view-handlers/ViewHandlerFactory.js.map b/bandcamp/dist/lib/controller/browse/view-handlers/ViewHandlerFactory.js.map index b7c23b0ba..528015004 100644 --- a/bandcamp/dist/lib/controller/browse/view-handlers/ViewHandlerFactory.js.map +++ b/bandcamp/dist/lib/controller/browse/view-handlers/ViewHandlerFactory.js.map @@ -1 +1 @@ -{"version":3,"file":"ViewHandlerFactory.js","sourceRoot":"","sources":["../../../../../src/lib/controller/browse/view-handlers/ViewHandlerFactory.ts"],"names":[],"mappings":";;;;;AAAA,0EAAkD;AAClD,8EAAsD;AACtD,wEAAgD;AAEhD,gFAAwD;AACxD,sEAA8C;AAC9C,wEAAgD;AAChD,4EAAoD;AACpD,wEAAgD;AAChD,sEAA8C;AAC9C,0EAAkD;AAElD,8DAAsC;AAKtC,MAAM,kBAAkB,GAA2C;IACjE,MAAM,EAAE,yBAAe;IACvB,UAAU,EAAE,6BAAmB;IAC/B,MAAM,EAAE,yBAAe;IACvB,OAAO,EAAE,0BAAgB;IACzB,OAAO,EAAE,0BAAgB;IACzB,QAAQ,EAAE,2BAAiB;IAC3B,MAAM,EAAE,yBAAe;IACvB,SAAS,EAAE,4BAAkB;IAC7B,KAAK,EAAE,wBAAc;IACrB,KAAK,EAAE,wBAAc;CACtB,CAAC;AAEF,MAAqB,kBAAkB;IAErC,MAAM,CAAC,UAAU,CAAiB,GAAW;QAC3C,MAAM,KAAK,GAAG,oBAAU,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;QAC9C,MAAM,WAAW,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC;QAChC,MAAM,aAAa,GAAG,KAAK,CAAC;QAE5B,IAAI,CAAC,WAAW,EAAE;YAChB,MAAM,KAAK,CAAC,iCAAiC,CAAC,CAAC;SAChD;QAED;;;;WAIG;QACH,IAAI,WAAW,CAAC,IAAI,KAAK,QAAQ,IAAI,WAAW,CAAC,IAAI,KAAK,OAAO,EAAE;YACjE,WAAW,CAAC,IAAI,GAAG,MAAM,CAAC;YAE1B,IAAI,WAAW,CAAC,SAAS,EAAE;gBACzB,WAAW,CAAC,OAAO,GAAG,WAAW,CAAC,SAAS,CAAC;gBAC5C,OAAO,WAAW,CAAC,SAAS,CAAC;aAC9B;YAED,IAAI,WAAW,CAAC,QAAQ,EAAE;gBACxB,WAAW,CAAC,OAAO,GAAG,WAAW,CAAC,QAAQ,CAAC;gBAC3C,OAAO,WAAW,CAAC,QAAQ,CAAC;aAC7B;SACF;QACD;;WAEG;aACE,IAAI,WAAW,CAAC,IAAI,KAAK,UAAU,EAAE;YACxC,WAAW,CAAC,IAAI,GAAG,SAAS,CAAC;SAC9B;aACI,IAAI,WAAW,CAAC,IAAI,KAAK,OAAO,EAAE;YACrC,WAAW,CAAC,IAAI,GAAG,MAAM,CAAC;SAC3B;QAED,OAAO,IAAI,kBAAkB,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC;IACnF,CAAC;CACF;AAzCD,qCAyCC","sourcesContent":["import AlbumViewHandler from './AlbumViewHandler';\nimport ArticleViewHandler from './ArticleViewHandler';\nimport BandViewHandler from './BandViewHandler';\nimport BaseViewHandler from './BaseViewHandler';\nimport DiscoverViewHandler from './DiscoverViewHandler';\nimport FanViewHandler from './FanViewHandler';\nimport RootViewHandler from './RootViewHandler';\nimport SearchViewHandler from './SearchViewHandler';\nimport ShowViewHandler from './ShowViewHandler';\nimport TagViewHandler from './TagViewHandler';\nimport TrackViewHandler from './TrackViewHandler';\nimport View from './View';\nimport ViewHelper from './ViewHelper';\n\ntype HandlerClass> =\n new (uri: string, currentView: V, previousViews: View[]) => T;\n\nconst VIEW_NAME_TO_CLASS: Record> = {\n 'root': RootViewHandler,\n 'discover': DiscoverViewHandler,\n 'band': BandViewHandler,\n 'album': AlbumViewHandler,\n 'track': TrackViewHandler,\n 'search': SearchViewHandler,\n 'show': ShowViewHandler,\n 'article': ArticleViewHandler,\n 'tag': TagViewHandler,\n 'fan': FanViewHandler\n};\n\nexport default class ViewHandlerFactory {\n\n static getHandler(uri: string): BaseViewHandler {\n const views = ViewHelper.getViewsFromUri(uri);\n const currentView = views.pop();\n const previousViews = views;\n\n if (!currentView) {\n throw Error('Invalid URI: no parseable view.');\n }\n\n /**\n * 'artist' and 'label' views are obsolete (replaced by single 'band' view),\n * but may still exist in Volumio playlists or favourites. We still want to be able\n * to play them, so we translate these URIs into their 'band' equivalent.\n */\n if (currentView.name === 'artist' || currentView.name === 'label') {\n currentView.name = 'band';\n\n if (currentView.artistUrl) {\n currentView.bandUrl = currentView.artistUrl;\n delete currentView.artistUrl;\n }\n\n if (currentView.labelUrl) {\n currentView.bandUrl = currentView.labelUrl;\n delete currentView.labelUrl;\n }\n }\n /**\n * 'articles' and 'shows' are also absolute (replaced by singular form)\n */\n else if (currentView.name === 'articles') {\n currentView.name = 'article';\n }\n else if (currentView.name === 'shows') {\n currentView.name = 'show';\n }\n\n return new VIEW_NAME_TO_CLASS[currentView.name](uri, currentView, previousViews);\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"ViewHandlerFactory.js","sourceRoot":"","sources":["../../../../../src/lib/controller/browse/view-handlers/ViewHandlerFactory.ts"],"names":[],"mappings":";;;;;AAAA,0EAAkD;AAClD,8EAAsD;AACtD,wEAAgD;AAEhD,gFAAwD;AACxD,sEAA8C;AAC9C,wEAAgD;AAChD,4EAAoD;AACpD,wEAAgD;AAChD,sEAA8C;AAC9C,0EAAkD;AAElD,8DAAsC;AAKtC,MAAM,kBAAkB,GAA2C;IACjE,MAAM,EAAE,yBAAe;IACvB,UAAU,EAAE,6BAAmB;IAC/B,MAAM,EAAE,yBAAe;IACvB,OAAO,EAAE,0BAAgB;IACzB,OAAO,EAAE,0BAAgB;IACzB,QAAQ,EAAE,2BAAiB;IAC3B,MAAM,EAAE,yBAAe;IACvB,SAAS,EAAE,4BAAkB;IAC7B,KAAK,EAAE,wBAAc;IACrB,KAAK,EAAE,wBAAc;CACtB,CAAC;AAEF,MAAqB,kBAAkB;IAErC,MAAM,CAAC,UAAU,CAAiB,GAAW;QAC3C,MAAM,KAAK,GAAG,oBAAU,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;QAC9C,MAAM,WAAW,GAAG,KAAK,CAAC,GAAG,EAAE,CAAC;QAChC,MAAM,aAAa,GAAG,KAAK,CAAC;QAE5B,IAAI,CAAC,WAAW,EAAE,CAAC;YACjB,MAAM,KAAK,CAAC,iCAAiC,CAAC,CAAC;QACjD,CAAC;QAED;;;;WAIG;QACH,IAAI,WAAW,CAAC,IAAI,KAAK,QAAQ,IAAI,WAAW,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YAClE,WAAW,CAAC,IAAI,GAAG,MAAM,CAAC;YAE1B,IAAI,WAAW,CAAC,SAAS,EAAE,CAAC;gBAC1B,WAAW,CAAC,OAAO,GAAG,WAAW,CAAC,SAAS,CAAC;gBAC5C,OAAO,WAAW,CAAC,SAAS,CAAC;YAC/B,CAAC;YAED,IAAI,WAAW,CAAC,QAAQ,EAAE,CAAC;gBACzB,WAAW,CAAC,OAAO,GAAG,WAAW,CAAC,QAAQ,CAAC;gBAC3C,OAAO,WAAW,CAAC,QAAQ,CAAC;YAC9B,CAAC;QACH,CAAC;QACD;;WAEG;aACE,IAAI,WAAW,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YACzC,WAAW,CAAC,IAAI,GAAG,SAAS,CAAC;QAC/B,CAAC;aACI,IAAI,WAAW,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;YACtC,WAAW,CAAC,IAAI,GAAG,MAAM,CAAC;QAC5B,CAAC;QAED,OAAO,IAAI,kBAAkB,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC;IACnF,CAAC;CACF;AAzCD,qCAyCC","sourcesContent":["import AlbumViewHandler from './AlbumViewHandler';\nimport ArticleViewHandler from './ArticleViewHandler';\nimport BandViewHandler from './BandViewHandler';\nimport type BaseViewHandler from './BaseViewHandler';\nimport DiscoverViewHandler from './DiscoverViewHandler';\nimport FanViewHandler from './FanViewHandler';\nimport RootViewHandler from './RootViewHandler';\nimport SearchViewHandler from './SearchViewHandler';\nimport ShowViewHandler from './ShowViewHandler';\nimport TagViewHandler from './TagViewHandler';\nimport TrackViewHandler from './TrackViewHandler';\nimport type View from './View';\nimport ViewHelper from './ViewHelper';\n\ntype HandlerClass> =\n new (uri: string, currentView: V, previousViews: View[]) => T;\n\nconst VIEW_NAME_TO_CLASS: Record> = {\n 'root': RootViewHandler,\n 'discover': DiscoverViewHandler,\n 'band': BandViewHandler,\n 'album': AlbumViewHandler,\n 'track': TrackViewHandler,\n 'search': SearchViewHandler,\n 'show': ShowViewHandler,\n 'article': ArticleViewHandler,\n 'tag': TagViewHandler,\n 'fan': FanViewHandler\n};\n\nexport default class ViewHandlerFactory {\n\n static getHandler(uri: string): BaseViewHandler {\n const views = ViewHelper.getViewsFromUri(uri);\n const currentView = views.pop();\n const previousViews = views;\n\n if (!currentView) {\n throw Error('Invalid URI: no parseable view.');\n }\n\n /**\n * 'artist' and 'label' views are obsolete (replaced by single 'band' view),\n * but may still exist in Volumio playlists or favourites. We still want to be able\n * to play them, so we translate these URIs into their 'band' equivalent.\n */\n if (currentView.name === 'artist' || currentView.name === 'label') {\n currentView.name = 'band';\n\n if (currentView.artistUrl) {\n currentView.bandUrl = currentView.artistUrl;\n delete currentView.artistUrl;\n }\n\n if (currentView.labelUrl) {\n currentView.bandUrl = currentView.labelUrl;\n delete currentView.labelUrl;\n }\n }\n /**\n * 'articles' and 'shows' are also absolute (replaced by singular form)\n */\n else if (currentView.name === 'articles') {\n currentView.name = 'article';\n }\n else if (currentView.name === 'shows') {\n currentView.name = 'show';\n }\n\n return new VIEW_NAME_TO_CLASS[currentView.name](uri, currentView, previousViews);\n }\n}\n"]} \ No newline at end of file diff --git a/bandcamp/dist/lib/controller/browse/view-handlers/ViewHelper.d.ts b/bandcamp/dist/lib/controller/browse/view-handlers/ViewHelper.d.ts index d6807824d..45879a644 100644 --- a/bandcamp/dist/lib/controller/browse/view-handlers/ViewHelper.d.ts +++ b/bandcamp/dist/lib/controller/browse/view-handlers/ViewHelper.d.ts @@ -1,8 +1,8 @@ -import View from './View'; +import type View from './View'; export default class ViewHelper { #private; static getViewsFromUri(uri: string): View[]; - static constructUriSegmentFromView(view: V): string; + static constructUriSegmentFromView(view: View): string; static constructUriFromViews(views: View[]): string; } //# sourceMappingURL=ViewHelper.d.ts.map \ No newline at end of file diff --git a/bandcamp/dist/lib/controller/browse/view-handlers/ViewHelper.d.ts.map b/bandcamp/dist/lib/controller/browse/view-handlers/ViewHelper.d.ts.map index f3076494a..92abcadeb 100644 --- a/bandcamp/dist/lib/controller/browse/view-handlers/ViewHelper.d.ts.map +++ b/bandcamp/dist/lib/controller/browse/view-handlers/ViewHelper.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"ViewHelper.d.ts","sourceRoot":"","sources":["../../../../../src/lib/controller/browse/view-handlers/ViewHelper.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,QAAQ,CAAC;AAE1B,MAAM,CAAC,OAAO,OAAO,UAAU;;IAE7B,MAAM,CAAC,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,EAAE;IAwB3C,MAAM,CAAC,2BAA2B,CAAC,CAAC,SAAS,IAAI,EAAE,IAAI,EAAE,CAAC;IAoD1D,MAAM,CAAC,qBAAqB,CAAC,KAAK,EAAE,IAAI,EAAE;CAI3C"} \ No newline at end of file +{"version":3,"file":"ViewHelper.d.ts","sourceRoot":"","sources":["../../../../../src/lib/controller/browse/view-handlers/ViewHelper.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,QAAQ,CAAC;AAE/B,MAAM,CAAC,OAAO,OAAO,UAAU;;IAE7B,MAAM,CAAC,eAAe,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,EAAE;IAwB3C,MAAM,CAAC,2BAA2B,CAAC,IAAI,EAAE,IAAI;IAoD7C,MAAM,CAAC,qBAAqB,CAAC,KAAK,EAAE,IAAI,EAAE;CAI3C"} \ No newline at end of file diff --git a/bandcamp/dist/lib/controller/browse/view-handlers/ViewHelper.js b/bandcamp/dist/lib/controller/browse/view-handlers/ViewHelper.js index c30372293..a914617aa 100644 --- a/bandcamp/dist/lib/controller/browse/view-handlers/ViewHelper.js +++ b/bandcamp/dist/lib/controller/browse/view-handlers/ViewHelper.js @@ -54,7 +54,6 @@ class ViewHelper { return segments.join('/'); } } -exports.default = ViewHelper; _a = ViewHelper, _ViewHelper_getViewFromUriSegment = function _ViewHelper_getViewFromUriSegment(segment) { const result = { name: '', @@ -78,4 +77,5 @@ _a = ViewHelper, _ViewHelper_getViewFromUriSegment = function _ViewHelper_getVie }); return result; }; +exports.default = ViewHelper; //# sourceMappingURL=ViewHelper.js.map \ No newline at end of file diff --git a/bandcamp/dist/lib/controller/browse/view-handlers/ViewHelper.js.map b/bandcamp/dist/lib/controller/browse/view-handlers/ViewHelper.js.map index 98500980d..b1d8df5f9 100644 --- a/bandcamp/dist/lib/controller/browse/view-handlers/ViewHelper.js.map +++ b/bandcamp/dist/lib/controller/browse/view-handlers/ViewHelper.js.map @@ -1 +1 @@ -{"version":3,"file":"ViewHelper.js","sourceRoot":"","sources":["../../../../../src/lib/controller/browse/view-handlers/ViewHelper.ts"],"names":[],"mappings":"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","sourcesContent":["import View from './View';\n\nexport default class ViewHelper {\n\n static getViewsFromUri(uri: string): View[] {\n const segments = uri.split('/');\n if (segments[0] !== 'bandcamp') {\n return [];\n }\n\n const result: View[] = [];\n\n segments.forEach((segment, index) => {\n let view: View;\n if (index === 0) { // 'bandcamp/...'\n view = {\n name: 'root'\n };\n }\n else {\n view = this.#getViewFromUriSegment(segment);\n }\n result.push(view);\n });\n\n return result;\n }\n\n static constructUriSegmentFromView(view: V) {\n let segment: string;\n if (view.name === 'root') {\n segment = 'bandcamp';\n }\n else {\n segment = view.name;\n }\n\n const skip = [ 'name', 'pageRef', 'prevPageRefs', 'noExplode', 'combinedSearch', 'inSection' ];\n Object.keys(view).filter((key) => !skip.includes(key)).forEach((key) => {\n if (view[key] !== undefined) {\n segment += `@${key}=${encodeURIComponent(view[key])}`;\n }\n });\n\n if (view.prevPageRefs) {\n segment += `@$prevPageRefs=${encodeURIComponent(JSON.stringify(view.prevPageRefs))}`;\n }\n\n if (view.pageRef) {\n segment += `@pageRef=${encodeURIComponent(JSON.stringify(view.pageRef))}`;\n }\n\n return segment;\n }\n\n static #getViewFromUriSegment(segment: string): View {\n const result: View = {\n name: '',\n startIndex: 0\n };\n segment.split('@').forEach((s) => {\n const equalIndex = s.indexOf('=');\n if (equalIndex < 0) {\n result.name = s;\n }\n else {\n const key = s.substring(0, equalIndex);\n const value = s.substring(equalIndex + 1);\n if (key === 'pageRef' || key === 'prevPageRefs') {\n result[key] = JSON.parse(decodeURIComponent(value));\n }\n else {\n result[key] = decodeURIComponent(value);\n }\n }\n });\n\n return result;\n }\n\n static constructUriFromViews(views: View[]) {\n const segments = views.map((view) => this.constructUriSegmentFromView(view));\n return segments.join('/');\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"ViewHelper.js","sourceRoot":"","sources":["../../../../../src/lib/controller/browse/view-handlers/ViewHelper.ts"],"names":[],"mappings":"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","sourcesContent":["import type View from './View';\n\nexport default class ViewHelper {\n\n static getViewsFromUri(uri: string): View[] {\n const segments = uri.split('/');\n if (segments[0] !== 'bandcamp') {\n return [];\n }\n\n const result: View[] = [];\n\n segments.forEach((segment, index) => {\n let view: View;\n if (index === 0) { // 'bandcamp/...'\n view = {\n name: 'root'\n };\n }\n else {\n view = this.#getViewFromUriSegment(segment);\n }\n result.push(view);\n });\n\n return result;\n }\n\n static constructUriSegmentFromView(view: View) {\n let segment: string;\n if (view.name === 'root') {\n segment = 'bandcamp';\n }\n else {\n segment = view.name;\n }\n\n const skip = [ 'name', 'pageRef', 'prevPageRefs', 'noExplode', 'combinedSearch', 'inSection' ];\n Object.keys(view).filter((key) => !skip.includes(key)).forEach((key) => {\n if (view[key] !== undefined) {\n segment += `@${key}=${encodeURIComponent(view[key])}`;\n }\n });\n\n if (view.prevPageRefs) {\n segment += `@$prevPageRefs=${encodeURIComponent(JSON.stringify(view.prevPageRefs))}`;\n }\n\n if (view.pageRef) {\n segment += `@pageRef=${encodeURIComponent(JSON.stringify(view.pageRef))}`;\n }\n\n return segment;\n }\n\n static #getViewFromUriSegment(segment: string): View {\n const result: View = {\n name: '',\n startIndex: 0\n };\n segment.split('@').forEach((s) => {\n const equalIndex = s.indexOf('=');\n if (equalIndex < 0) {\n result.name = s;\n }\n else {\n const key = s.substring(0, equalIndex);\n const value = s.substring(equalIndex + 1);\n if (key === 'pageRef' || key === 'prevPageRefs') {\n result[key] = JSON.parse(decodeURIComponent(value));\n }\n else {\n result[key] = decodeURIComponent(value);\n }\n }\n });\n\n return result;\n }\n\n static constructUriFromViews(views: View[]) {\n const segments = views.map((view) => this.constructUriSegmentFromView(view));\n return segments.join('/');\n }\n}\n"]} \ No newline at end of file diff --git a/bandcamp/dist/lib/controller/browse/view-handlers/renderers/AlbumRenderer.d.ts b/bandcamp/dist/lib/controller/browse/view-handlers/renderers/AlbumRenderer.d.ts index c7b18f5ef..09c1c0a29 100644 --- a/bandcamp/dist/lib/controller/browse/view-handlers/renderers/AlbumRenderer.d.ts +++ b/bandcamp/dist/lib/controller/browse/view-handlers/renderers/AlbumRenderer.d.ts @@ -1,5 +1,5 @@ -import BaseRenderer, { RenderedHeader, RenderedListItem } from './BaseRenderer'; -import AlbumEntity from '../../../../entities/AlbumEntity'; +import BaseRenderer, { type RenderedHeader, type RenderedListItem } from './BaseRenderer'; +import type AlbumEntity from '../../../../entities/AlbumEntity'; export default class AlbumRenderer extends BaseRenderer { renderToListItem(data: AlbumEntity): RenderedListItem | null; renderToHeader(data: AlbumEntity): RenderedHeader | null; diff --git a/bandcamp/dist/lib/controller/browse/view-handlers/renderers/AlbumRenderer.d.ts.map b/bandcamp/dist/lib/controller/browse/view-handlers/renderers/AlbumRenderer.d.ts.map index e6cad7c6a..9a594d9a1 100644 --- a/bandcamp/dist/lib/controller/browse/view-handlers/renderers/AlbumRenderer.d.ts.map +++ b/bandcamp/dist/lib/controller/browse/view-handlers/renderers/AlbumRenderer.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"AlbumRenderer.d.ts","sourceRoot":"","sources":["../../../../../../src/lib/controller/browse/view-handlers/renderers/AlbumRenderer.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,EAAE,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEhF,OAAO,WAAW,MAAM,kCAAkC,CAAC;AAI3D,MAAM,CAAC,OAAO,OAAO,aAAc,SAAQ,YAAY,CAAC,WAAW,CAAC;IAElE,gBAAgB,CAAC,IAAI,EAAE,WAAW,GAAG,gBAAgB,GAAG,IAAI;IAkB5D,cAAc,CAAC,IAAI,EAAE,WAAW,GAAG,cAAc,GAAG,IAAI;CAWzD"} \ No newline at end of file +{"version":3,"file":"AlbumRenderer.d.ts","sourceRoot":"","sources":["../../../../../../src/lib/controller/browse/view-handlers/renderers/AlbumRenderer.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,EAAE,EAAE,KAAK,cAAc,EAAE,KAAK,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAE1F,OAAO,KAAK,WAAW,MAAM,kCAAkC,CAAC;AAIhE,MAAM,CAAC,OAAO,OAAO,aAAc,SAAQ,YAAY,CAAC,WAAW,CAAC;IAElE,gBAAgB,CAAC,IAAI,EAAE,WAAW,GAAG,gBAAgB,GAAG,IAAI;IAkB5D,cAAc,CAAC,IAAI,EAAE,WAAW,GAAG,cAAc,GAAG,IAAI;CAWzD"} \ No newline at end of file diff --git a/bandcamp/dist/lib/controller/browse/view-handlers/renderers/AlbumRenderer.js.map b/bandcamp/dist/lib/controller/browse/view-handlers/renderers/AlbumRenderer.js.map index dc91c46f6..790d35201 100644 --- a/bandcamp/dist/lib/controller/browse/view-handlers/renderers/AlbumRenderer.js.map +++ b/bandcamp/dist/lib/controller/browse/view-handlers/renderers/AlbumRenderer.js.map @@ -1 +1 @@ -{"version":3,"file":"AlbumRenderer.js","sourceRoot":"","sources":["../../../../../../src/lib/controller/browse/view-handlers/renderers/AlbumRenderer.ts"],"names":[],"mappings":";;;;;AAAA,kEAAgF;AAChF,yEAAiD;AAGjD,+DAAuC;AAEvC,MAAqB,aAAc,SAAQ,sBAAyB;IAElE,gBAAgB,CAAC,IAAiB;QAChC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;YACb,OAAO,IAAI,CAAC;SACb;QACD,MAAM,SAAS,GAAc;YAC3B,IAAI,EAAE,OAAO;YACb,QAAQ,EAAE,IAAI,CAAC,GAAG;SACnB,CAAC;QACF,OAAO;YACL,OAAO,EAAE,UAAU;YACnB,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC;YACvC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI;YACzB,QAAQ,EAAE,IAAI,CAAC,SAAS;YACxB,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,oBAAU,CAAC,2BAA2B,CAAC,SAAS,CAAC,EAAE;SACxE,CAAC;IACJ,CAAC;IAED,cAAc,CAAC,IAAiB;QAC9B,OAAO;YACL,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,OAAO,EAAE,UAAU;YACnB,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,IAAI,CAAC,IAAI;YAChB,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI;YACzB,QAAQ,EAAE,IAAI,CAAC,SAAS;YACxB,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,kBAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI;SACxE,CAAC;IACJ,CAAC;CACF;AA/BD,gCA+BC","sourcesContent":["import BaseRenderer, { RenderedHeader, RenderedListItem } from './BaseRenderer';\nimport UIHelper from '../../../../util/UIHelper';\nimport AlbumEntity from '../../../../entities/AlbumEntity';\nimport { AlbumView } from '../AlbumViewHandler';\nimport ViewHelper from '../ViewHelper';\n\nexport default class AlbumRenderer extends BaseRenderer {\n\n renderToListItem(data: AlbumEntity): RenderedListItem | null {\n if (!data.url) {\n return null;\n }\n const albumView: AlbumView = {\n name: 'album',\n albumUrl: data.url\n };\n return {\n service: 'bandcamp',\n type: 'folder',\n title: this.addType('album', data.name),\n artist: data.artist?.name,\n albumart: data.thumbnail,\n uri: `${this.uri}/${ViewHelper.constructUriSegmentFromView(albumView)}`\n };\n }\n\n renderToHeader(data: AlbumEntity): RenderedHeader | null {\n return {\n uri: this.uri,\n service: 'bandcamp',\n type: 'song',\n album: data.name,\n artist: data.artist?.name,\n albumart: data.thumbnail,\n year: data.releaseDate ? UIHelper.reformatDate(data.releaseDate) : null\n };\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"AlbumRenderer.js","sourceRoot":"","sources":["../../../../../../src/lib/controller/browse/view-handlers/renderers/AlbumRenderer.ts"],"names":[],"mappings":";;;;;AAAA,kEAA0F;AAC1F,yEAAiD;AAGjD,+DAAuC;AAEvC,MAAqB,aAAc,SAAQ,sBAAyB;IAElE,gBAAgB,CAAC,IAAiB;QAChC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;YACd,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,SAAS,GAAc;YAC3B,IAAI,EAAE,OAAO;YACb,QAAQ,EAAE,IAAI,CAAC,GAAG;SACnB,CAAC;QACF,OAAO;YACL,OAAO,EAAE,UAAU;YACnB,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC;YACvC,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI;YACzB,QAAQ,EAAE,IAAI,CAAC,SAAS;YACxB,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,oBAAU,CAAC,2BAA2B,CAAC,SAAS,CAAC,EAAE;SACxE,CAAC;IACJ,CAAC;IAED,cAAc,CAAC,IAAiB;QAC9B,OAAO;YACL,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,OAAO,EAAE,UAAU;YACnB,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,IAAI,CAAC,IAAI;YAChB,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI;YACzB,QAAQ,EAAE,IAAI,CAAC,SAAS;YACxB,IAAI,EAAE,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,kBAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC,IAAI;SACxE,CAAC;IACJ,CAAC;CACF;AA/BD,gCA+BC","sourcesContent":["import BaseRenderer, { type RenderedHeader, type RenderedListItem } from './BaseRenderer';\nimport UIHelper from '../../../../util/UIHelper';\nimport type AlbumEntity from '../../../../entities/AlbumEntity';\nimport { type AlbumView } from '../AlbumViewHandler';\nimport ViewHelper from '../ViewHelper';\n\nexport default class AlbumRenderer extends BaseRenderer {\n\n renderToListItem(data: AlbumEntity): RenderedListItem | null {\n if (!data.url) {\n return null;\n }\n const albumView: AlbumView = {\n name: 'album',\n albumUrl: data.url\n };\n return {\n service: 'bandcamp',\n type: 'folder',\n title: this.addType('album', data.name),\n artist: data.artist?.name,\n albumart: data.thumbnail,\n uri: `${this.uri}/${ViewHelper.constructUriSegmentFromView(albumView)}`\n };\n }\n\n renderToHeader(data: AlbumEntity): RenderedHeader | null {\n return {\n uri: this.uri,\n service: 'bandcamp',\n type: 'song',\n album: data.name,\n artist: data.artist?.name,\n albumart: data.thumbnail,\n year: data.releaseDate ? UIHelper.reformatDate(data.releaseDate) : null\n };\n }\n}\n"]} \ No newline at end of file diff --git a/bandcamp/dist/lib/controller/browse/view-handlers/renderers/ArticleRenderer.d.ts b/bandcamp/dist/lib/controller/browse/view-handlers/renderers/ArticleRenderer.d.ts index b6dbedccb..debde38a1 100644 --- a/bandcamp/dist/lib/controller/browse/view-handlers/renderers/ArticleRenderer.d.ts +++ b/bandcamp/dist/lib/controller/browse/view-handlers/renderers/ArticleRenderer.d.ts @@ -1,7 +1,8 @@ -import BaseRenderer, { RenderedHeader, RenderedListItem } from './BaseRenderer'; -import ArticleEntity, { ArticleEntityMediaItem } from '../../../../entities/ArticleEntity'; -import TrackEntity from '../../../../entities/TrackEntity'; -import AlbumEntity from '../../../../entities/AlbumEntity'; +import BaseRenderer, { type RenderedHeader, type RenderedListItem } from './BaseRenderer'; +import { type ArticleEntityMediaItem } from '../../../../entities/ArticleEntity'; +import type ArticleEntity from '../../../../entities/ArticleEntity'; +import type TrackEntity from '../../../../entities/TrackEntity'; +import type AlbumEntity from '../../../../entities/AlbumEntity'; export default class ArticleRenderer extends BaseRenderer { renderToListItem(data: ArticleEntity): RenderedListItem | null; renderToHeader(data: ArticleEntity): RenderedHeader | null; diff --git a/bandcamp/dist/lib/controller/browse/view-handlers/renderers/ArticleRenderer.d.ts.map b/bandcamp/dist/lib/controller/browse/view-handlers/renderers/ArticleRenderer.d.ts.map index 872867b58..8fd65ec02 100644 --- a/bandcamp/dist/lib/controller/browse/view-handlers/renderers/ArticleRenderer.d.ts.map +++ b/bandcamp/dist/lib/controller/browse/view-handlers/renderers/ArticleRenderer.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"ArticleRenderer.d.ts","sourceRoot":"","sources":["../../../../../../src/lib/controller/browse/view-handlers/renderers/ArticleRenderer.ts"],"names":[],"mappings":"AACA,OAAO,YAAY,EAAE,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEhF,OAAO,aAAa,EAAE,EAAE,sBAAsB,EAAE,MAAM,oCAAoC,CAAC;AAC3F,OAAO,WAAW,MAAM,kCAAkC,CAAC;AAC3D,OAAO,WAAW,MAAM,kCAAkC,CAAC;AAI3D,MAAM,CAAC,OAAO,OAAO,eAAgB,SAAQ,YAAY,CAAC,aAAa,CAAC;IAEtE,gBAAgB,CAAC,IAAI,EAAE,aAAa,GAAG,gBAAgB,GAAG,IAAI;IAkB9D,cAAc,CAAC,IAAI,EAAE,aAAa,GAAG,cAAc,GAAG,IAAI;IAa1D,oBAAoB,CAAC,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,sBAAsB,CAAC,WAAW,GAAG,WAAW,CAAC,EAAE,KAAK,EAAE,WAAW,GAAG,gBAAgB;CAkBjJ"} \ No newline at end of file +{"version":3,"file":"ArticleRenderer.d.ts","sourceRoot":"","sources":["../../../../../../src/lib/controller/browse/view-handlers/renderers/ArticleRenderer.ts"],"names":[],"mappings":"AACA,OAAO,YAAY,EAAE,EAAE,KAAK,cAAc,EAAE,KAAK,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAE1F,OAAO,EAAC,KAAK,sBAAsB,EAAC,MAAM,oCAAoC,CAAC;AAC/E,OAAO,KAAK,aAAa,MAAM,oCAAoC,CAAC;AACpE,OAAO,KAAK,WAAW,MAAM,kCAAkC,CAAC;AAChE,OAAO,KAAK,WAAW,MAAM,kCAAkC,CAAC;AAIhE,MAAM,CAAC,OAAO,OAAO,eAAgB,SAAQ,YAAY,CAAC,aAAa,CAAC;IAEtE,gBAAgB,CAAC,IAAI,EAAE,aAAa,GAAG,gBAAgB,GAAG,IAAI;IAkB9D,cAAc,CAAC,IAAI,EAAE,aAAa,GAAG,cAAc,GAAG,IAAI;IAa1D,oBAAoB,CAAC,OAAO,EAAE,aAAa,EAAE,SAAS,EAAE,sBAAsB,CAAC,WAAW,GAAG,WAAW,CAAC,EAAE,KAAK,EAAE,WAAW,GAAG,gBAAgB;CAkBjJ"} \ No newline at end of file diff --git a/bandcamp/dist/lib/controller/browse/view-handlers/renderers/ArticleRenderer.js.map b/bandcamp/dist/lib/controller/browse/view-handlers/renderers/ArticleRenderer.js.map index d4e01d060..265e8cced 100644 --- a/bandcamp/dist/lib/controller/browse/view-handlers/renderers/ArticleRenderer.js.map +++ b/bandcamp/dist/lib/controller/browse/view-handlers/renderers/ArticleRenderer.js.map @@ -1 +1 @@ -{"version":3,"file":"ArticleRenderer.js","sourceRoot":"","sources":["../../../../../../src/lib/controller/browse/view-handlers/renderers/ArticleRenderer.ts"],"names":[],"mappings":";;;;;AAAA,kFAAmD;AACnD,kEAAgF;AAChF,yEAAiD;AAKjD,+DAAuC;AAEvC,MAAqB,eAAgB,SAAQ,sBAA2B;IAEtE,gBAAgB,CAAC,IAAmB;QAClC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;YACb,OAAO,IAAI,CAAC;SACb;QACD,MAAM,WAAW,GAAgB;YAC/B,IAAI,EAAE,SAAS;YACf,UAAU,EAAE,IAAI,CAAC,GAAG;SACrB,CAAC;QACF,OAAO;YACL,OAAO,EAAE,UAAU;YACnB,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,IAAI,MAAM,IAAI,CAAC,IAAI,EAAE;YAC/C,QAAQ,EAAE,IAAI,CAAC,SAAS;YACxB,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,oBAAU,CAAC,2BAA2B,CAAC,WAAW,CAAC,EAAE;SAC1E,CAAC;IACJ,CAAC;IAED,cAAc,CAAC,IAAmB;QAChC,OAAO;YACL,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,OAAO,EAAE,UAAU;YACnB,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,QAAQ,EAAE,IAAI,CAAC,SAAS;YACxB,MAAM,EAAE,GAAG,yBAAQ,CAAC,OAAO,CAAC,gBAAgB,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE;YACxE,IAAI,EAAE,kBAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;YACtC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,yBAAQ,CAAC,OAAO,CAAC,qBAAqB,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;SAC9F,CAAC;IACJ,CAAC;IAED,oBAAoB,CAAC,OAAsB,EAAE,SAA4D,EAAE,KAAkB;QAC3H,MAAM,WAAW,GAAgB;YAC/B,IAAI,EAAE,SAAS;YACf,UAAU,EAAE,OAAO,CAAC,GAAG;YACvB,YAAY,EAAE,SAAS,CAAC,YAAY;YACpC,KAAK,EAAE,KAAK,CAAC,QAAQ,EAAE,QAAQ,EAAE;SAClC,CAAC;QACF,OAAO;YACL,OAAO,EAAE,UAAU;YACnB,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,KAAK,CAAC,IAAI;YACjB,KAAK,EAAE,SAAS,CAAC,IAAI;YACrB,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;YACrD,QAAQ,EAAE,SAAS,CAAC,SAAS;YAC7B,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,oBAAU,CAAC,2BAA2B,CAAC,WAAW,CAAC,EAAE;SAC1E,CAAC;IACJ,CAAC;CACF;AAnDD,kCAmDC","sourcesContent":["import bandcamp from '../../../../BandcampContext';\nimport BaseRenderer, { RenderedHeader, RenderedListItem } from './BaseRenderer';\nimport UIHelper from '../../../../util/UIHelper';\nimport ArticleEntity, { ArticleEntityMediaItem } from '../../../../entities/ArticleEntity';\nimport TrackEntity from '../../../../entities/TrackEntity';\nimport AlbumEntity from '../../../../entities/AlbumEntity';\nimport { ArticleView } from '../ArticleViewHandler';\nimport ViewHelper from '../ViewHelper';\n\nexport default class ArticleRenderer extends BaseRenderer {\n\n renderToListItem(data: ArticleEntity): RenderedListItem | null {\n if (!data.url) {\n return null;\n }\n const articleView: ArticleView = {\n name: 'article',\n articleUrl: data.url\n };\n return {\n service: 'bandcamp',\n type: 'folder',\n title: data.title,\n artist: `${data.category?.name} - ${data.date}`,\n albumart: data.thumbnail,\n uri: `${this.uri}/${ViewHelper.constructUriSegmentFromView(articleView)}`\n };\n }\n\n renderToHeader(data: ArticleEntity): RenderedHeader | null {\n return {\n uri: this.uri,\n service: 'bandcamp',\n type: 'song',\n title: data.title,\n albumart: data.thumbnail,\n artist: `${bandcamp.getI18n('BANDCAMP_DAILY')} - ${data.category?.name}`,\n year: UIHelper.reformatDate(data.date),\n duration: data.author ? bandcamp.getI18n('BANDCAMP_ARTICLE_BY', data.author.name) : undefined\n };\n }\n\n renderMediaItemTrack(article: ArticleEntity, mediaItem: ArticleEntityMediaItem, track: TrackEntity): RenderedListItem {\n const articleView: ArticleView = {\n name: 'article',\n articleUrl: article.url,\n mediaItemRef: mediaItem.mediaItemRef,\n track: track.position?.toString()\n };\n return {\n service: 'bandcamp',\n type: 'song',\n title: track.name,\n album: mediaItem.name,\n artist: mediaItem.artist ? mediaItem.artist.name : '',\n albumart: mediaItem.thumbnail,\n duration: track.duration,\n uri: `${this.uri}/${ViewHelper.constructUriSegmentFromView(articleView)}`\n };\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"ArticleRenderer.js","sourceRoot":"","sources":["../../../../../../src/lib/controller/browse/view-handlers/renderers/ArticleRenderer.ts"],"names":[],"mappings":";;;;;AAAA,kFAAmD;AACnD,kEAA0F;AAC1F,yEAAiD;AAMjD,+DAAuC;AAEvC,MAAqB,eAAgB,SAAQ,sBAA2B;IAEtE,gBAAgB,CAAC,IAAmB;QAClC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;YACd,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,WAAW,GAAgB;YAC/B,IAAI,EAAE,SAAS;YACf,UAAU,EAAE,IAAI,CAAC,GAAG;SACrB,CAAC;QACF,OAAO;YACL,OAAO,EAAE,UAAU;YACnB,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,IAAI,MAAM,IAAI,CAAC,IAAI,EAAE;YAC/C,QAAQ,EAAE,IAAI,CAAC,SAAS;YACxB,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,oBAAU,CAAC,2BAA2B,CAAC,WAAW,CAAC,EAAE;SAC1E,CAAC;IACJ,CAAC;IAED,cAAc,CAAC,IAAmB;QAChC,OAAO;YACL,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,OAAO,EAAE,UAAU;YACnB,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,QAAQ,EAAE,IAAI,CAAC,SAAS;YACxB,MAAM,EAAE,GAAG,yBAAQ,CAAC,OAAO,CAAC,gBAAgB,CAAC,MAAM,IAAI,CAAC,QAAQ,EAAE,IAAI,EAAE;YACxE,IAAI,EAAE,kBAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;YACtC,QAAQ,EAAE,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,yBAAQ,CAAC,OAAO,CAAC,qBAAqB,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,SAAS;SAC9F,CAAC;IACJ,CAAC;IAED,oBAAoB,CAAC,OAAsB,EAAE,SAA4D,EAAE,KAAkB;QAC3H,MAAM,WAAW,GAAgB;YAC/B,IAAI,EAAE,SAAS;YACf,UAAU,EAAE,OAAO,CAAC,GAAG;YACvB,YAAY,EAAE,SAAS,CAAC,YAAY;YACpC,KAAK,EAAE,KAAK,CAAC,QAAQ,EAAE,QAAQ,EAAE;SAClC,CAAC;QACF,OAAO;YACL,OAAO,EAAE,UAAU;YACnB,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,KAAK,CAAC,IAAI;YACjB,KAAK,EAAE,SAAS,CAAC,IAAI;YACrB,MAAM,EAAE,SAAS,CAAC,MAAM,CAAC,CAAC,CAAC,SAAS,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE;YACrD,QAAQ,EAAE,SAAS,CAAC,SAAS;YAC7B,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,oBAAU,CAAC,2BAA2B,CAAC,WAAW,CAAC,EAAE;SAC1E,CAAC;IACJ,CAAC;CACF;AAnDD,kCAmDC","sourcesContent":["import bandcamp from '../../../../BandcampContext';\nimport BaseRenderer, { type RenderedHeader, type RenderedListItem } from './BaseRenderer';\nimport UIHelper from '../../../../util/UIHelper';\nimport {type ArticleEntityMediaItem} from '../../../../entities/ArticleEntity';\nimport type ArticleEntity from '../../../../entities/ArticleEntity';\nimport type TrackEntity from '../../../../entities/TrackEntity';\nimport type AlbumEntity from '../../../../entities/AlbumEntity';\nimport { type ArticleView } from '../ArticleViewHandler';\nimport ViewHelper from '../ViewHelper';\n\nexport default class ArticleRenderer extends BaseRenderer {\n\n renderToListItem(data: ArticleEntity): RenderedListItem | null {\n if (!data.url) {\n return null;\n }\n const articleView: ArticleView = {\n name: 'article',\n articleUrl: data.url\n };\n return {\n service: 'bandcamp',\n type: 'folder',\n title: data.title,\n artist: `${data.category?.name} - ${data.date}`,\n albumart: data.thumbnail,\n uri: `${this.uri}/${ViewHelper.constructUriSegmentFromView(articleView)}`\n };\n }\n\n renderToHeader(data: ArticleEntity): RenderedHeader | null {\n return {\n uri: this.uri,\n service: 'bandcamp',\n type: 'song',\n title: data.title,\n albumart: data.thumbnail,\n artist: `${bandcamp.getI18n('BANDCAMP_DAILY')} - ${data.category?.name}`,\n year: UIHelper.reformatDate(data.date),\n duration: data.author ? bandcamp.getI18n('BANDCAMP_ARTICLE_BY', data.author.name) : undefined\n };\n }\n\n renderMediaItemTrack(article: ArticleEntity, mediaItem: ArticleEntityMediaItem, track: TrackEntity): RenderedListItem {\n const articleView: ArticleView = {\n name: 'article',\n articleUrl: article.url,\n mediaItemRef: mediaItem.mediaItemRef,\n track: track.position?.toString()\n };\n return {\n service: 'bandcamp',\n type: 'song',\n title: track.name,\n album: mediaItem.name,\n artist: mediaItem.artist ? mediaItem.artist.name : '',\n albumart: mediaItem.thumbnail,\n duration: track.duration,\n uri: `${this.uri}/${ViewHelper.constructUriSegmentFromView(articleView)}`\n };\n }\n}\n"]} \ No newline at end of file diff --git a/bandcamp/dist/lib/controller/browse/view-handlers/renderers/BandRenderer.d.ts b/bandcamp/dist/lib/controller/browse/view-handlers/renderers/BandRenderer.d.ts index 2a0a7214d..521b8488a 100644 --- a/bandcamp/dist/lib/controller/browse/view-handlers/renderers/BandRenderer.d.ts +++ b/bandcamp/dist/lib/controller/browse/view-handlers/renderers/BandRenderer.d.ts @@ -1,7 +1,7 @@ -import BaseRenderer, { RenderedHeader, RenderedListItem } from './BaseRenderer'; -import LabelEntity from '../../../../entities/LabelEntity'; -import ArtistEntity from '../../../../entities/ArtistEntity'; -import BandEntity from '../../../../entities/BandEntity'; +import BaseRenderer, { type RenderedHeader, type RenderedListItem } from './BaseRenderer'; +import type LabelEntity from '../../../../entities/LabelEntity'; +import type ArtistEntity from '../../../../entities/ArtistEntity'; +import type BandEntity from '../../../../entities/BandEntity'; export default class BandRenderer extends BaseRenderer { renderToListItem(data: ArtistEntity | LabelEntity | BandEntity): RenderedListItem | null; renderToHeader(data: ArtistEntity | LabelEntity): RenderedHeader | null; diff --git a/bandcamp/dist/lib/controller/browse/view-handlers/renderers/BandRenderer.d.ts.map b/bandcamp/dist/lib/controller/browse/view-handlers/renderers/BandRenderer.d.ts.map index a831691bc..846b78d09 100644 --- a/bandcamp/dist/lib/controller/browse/view-handlers/renderers/BandRenderer.d.ts.map +++ b/bandcamp/dist/lib/controller/browse/view-handlers/renderers/BandRenderer.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"BandRenderer.d.ts","sourceRoot":"","sources":["../../../../../../src/lib/controller/browse/view-handlers/renderers/BandRenderer.ts"],"names":[],"mappings":"AACA,OAAO,YAAY,EAAE,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAChF,OAAO,WAAW,MAAM,kCAAkC,CAAC;AAC3D,OAAO,YAAY,MAAM,mCAAmC,CAAC;AAC7D,OAAO,UAAU,MAAM,iCAAiC,CAAC;AAIzD,MAAM,CAAC,OAAO,OAAO,YAAa,SAAQ,YAAY,CAAC,YAAY,GAAG,WAAW,CAAC;IAEhF,gBAAgB,CAAC,IAAI,EAAE,YAAY,GAAG,WAAW,GAAG,UAAU,GAAG,gBAAgB,GAAG,IAAI;IAqBxF,cAAc,CAAC,IAAI,EAAE,YAAY,GAAG,WAAW,GAAG,cAAc,GAAG,IAAI;CAyBxE"} \ No newline at end of file +{"version":3,"file":"BandRenderer.d.ts","sourceRoot":"","sources":["../../../../../../src/lib/controller/browse/view-handlers/renderers/BandRenderer.ts"],"names":[],"mappings":"AACA,OAAO,YAAY,EAAE,EAAE,KAAK,cAAc,EAAE,KAAK,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAC1F,OAAO,KAAK,WAAW,MAAM,kCAAkC,CAAC;AAChE,OAAO,KAAK,YAAY,MAAM,mCAAmC,CAAC;AAClE,OAAO,KAAK,UAAU,MAAM,iCAAiC,CAAC;AAI9D,MAAM,CAAC,OAAO,OAAO,YAAa,SAAQ,YAAY,CAAC,YAAY,GAAG,WAAW,CAAC;IAEhF,gBAAgB,CAAC,IAAI,EAAE,YAAY,GAAG,WAAW,GAAG,UAAU,GAAG,gBAAgB,GAAG,IAAI;IAqBxF,cAAc,CAAC,IAAI,EAAE,YAAY,GAAG,WAAW,GAAG,cAAc,GAAG,IAAI;CAyBxE"} \ No newline at end of file diff --git a/bandcamp/dist/lib/controller/browse/view-handlers/renderers/BandRenderer.js.map b/bandcamp/dist/lib/controller/browse/view-handlers/renderers/BandRenderer.js.map index 42e0ae5c5..2dc3b5e58 100644 --- a/bandcamp/dist/lib/controller/browse/view-handlers/renderers/BandRenderer.js.map +++ b/bandcamp/dist/lib/controller/browse/view-handlers/renderers/BandRenderer.js.map @@ -1 +1 @@ -{"version":3,"file":"BandRenderer.js","sourceRoot":"","sources":["../../../../../../src/lib/controller/browse/view-handlers/renderers/BandRenderer.ts"],"names":[],"mappings":";;;;;AAAA,kFAAmD;AACnD,kEAAgF;AAKhF,+DAAuC;AAEvC,MAAqB,YAAa,SAAQ,sBAAwC;IAEhF,gBAAgB,CAAC,IAA6C;QAC5D,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;YACb,OAAO,IAAI,CAAC;SACb;QACD,MAAM,QAAQ,GAAa;YACzB,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,IAAI,CAAC,GAAG;SAClB,CAAC;QACF,MAAM,MAAM,GAAqB;YAC/B,OAAO,EAAE,UAAU;YACnB,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,IAAI,CAAC,IAAI;YAChB,QAAQ,EAAE,IAAI,CAAC,SAAS;YACxB,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,oBAAU,CAAC,2BAA2B,CAAC,QAAQ,CAAC,EAAE;SACvE,CAAC;QACF,IAAI,IAAI,CAAC,QAAQ,EAAE;YACjB,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC;SAC/B;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,cAAc,CAAC,IAAgC;QAC7C,MAAM,MAAM,GAAmB;YAC7B,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,OAAO,EAAE,UAAU;YACnB,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,IAAI,CAAC,IAAI;YAChB,QAAQ,EAAE,IAAI,CAAC,SAAS;SACzB,CAAC;QACF,QAAQ,IAAI,CAAC,IAAI,EAAE;YACjB,KAAK,QAAQ;gBACX,MAAM,CAAC,MAAM,GAAG,yBAAQ,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC;gBAC3D,MAAM;YACR,KAAK,OAAO;gBACV,MAAM,CAAC,MAAM,GAAG,yBAAQ,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC;gBAC1D,MAAM;YACR,QAAQ;SACT;QACD,IAAI,IAAI,CAAC,QAAQ,EAAE;YACjB,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC;SAC7B;QACD,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,KAAK,EAAE;YACxC,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;SACnC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AAhDD,+BAgDC","sourcesContent":["import bandcamp from '../../../../BandcampContext';\nimport BaseRenderer, { RenderedHeader, RenderedListItem } from './BaseRenderer';\nimport LabelEntity from '../../../../entities/LabelEntity';\nimport ArtistEntity from '../../../../entities/ArtistEntity';\nimport BandEntity from '../../../../entities/BandEntity';\nimport { BandView } from '../BandViewHandler';\nimport ViewHelper from '../ViewHelper';\n\nexport default class BandRenderer extends BaseRenderer {\n\n renderToListItem(data: ArtistEntity | LabelEntity | BandEntity): RenderedListItem | null {\n if (!data.url) {\n return null;\n }\n const bandView: BandView = {\n name: 'band',\n bandUrl: data.url\n };\n const result: RenderedListItem = {\n service: 'bandcamp',\n type: 'folder',\n title: data.name,\n albumart: data.thumbnail,\n uri: `${this.uri}/${ViewHelper.constructUriSegmentFromView(bandView)}`\n };\n if (data.location) {\n result.artist = data.location;\n }\n return result;\n }\n\n renderToHeader(data: ArtistEntity | LabelEntity): RenderedHeader | null {\n const result: RenderedHeader = {\n uri: this.uri,\n service: 'bandcamp',\n type: 'song',\n title: data.name,\n albumart: data.thumbnail\n };\n switch (data.type) {\n case 'artist':\n result.artist = bandcamp.getI18n('BANDCAMP_HEADER_ARTIST');\n break;\n case 'label':\n result.artist = bandcamp.getI18n('BANDCAMP_HEADER_LABEL');\n break;\n default:\n }\n if (data.location) {\n result.year = data.location;\n }\n if (data.type === 'artist' && data.label) {\n result.duration = data.label.name;\n }\n return result;\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"BandRenderer.js","sourceRoot":"","sources":["../../../../../../src/lib/controller/browse/view-handlers/renderers/BandRenderer.ts"],"names":[],"mappings":";;;;;AAAA,kFAAmD;AACnD,kEAA0F;AAK1F,+DAAuC;AAEvC,MAAqB,YAAa,SAAQ,sBAAwC;IAEhF,gBAAgB,CAAC,IAA6C;QAC5D,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;YACd,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,QAAQ,GAAa;YACzB,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,IAAI,CAAC,GAAG;SAClB,CAAC;QACF,MAAM,MAAM,GAAqB;YAC/B,OAAO,EAAE,UAAU;YACnB,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,IAAI,CAAC,IAAI;YAChB,QAAQ,EAAE,IAAI,CAAC,SAAS;YACxB,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,oBAAU,CAAC,2BAA2B,CAAC,QAAQ,CAAC,EAAE;SACvE,CAAC;QACF,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC;QAChC,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,cAAc,CAAC,IAAgC;QAC7C,MAAM,MAAM,GAAmB;YAC7B,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,OAAO,EAAE,UAAU;YACnB,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,IAAI,CAAC,IAAI;YAChB,QAAQ,EAAE,IAAI,CAAC,SAAS;SACzB,CAAC;QACF,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;YAClB,KAAK,QAAQ;gBACX,MAAM,CAAC,MAAM,GAAG,yBAAQ,CAAC,OAAO,CAAC,wBAAwB,CAAC,CAAC;gBAC3D,MAAM;YACR,KAAK,OAAO;gBACV,MAAM,CAAC,MAAM,GAAG,yBAAQ,CAAC,OAAO,CAAC,uBAAuB,CAAC,CAAC;gBAC1D,MAAM;YACR,QAAQ;QACV,CAAC;QACD,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC;QAC9B,CAAC;QACD,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACzC,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC;QACpC,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AAhDD,+BAgDC","sourcesContent":["import bandcamp from '../../../../BandcampContext';\nimport BaseRenderer, { type RenderedHeader, type RenderedListItem } from './BaseRenderer';\nimport type LabelEntity from '../../../../entities/LabelEntity';\nimport type ArtistEntity from '../../../../entities/ArtistEntity';\nimport type BandEntity from '../../../../entities/BandEntity';\nimport { type BandView } from '../BandViewHandler';\nimport ViewHelper from '../ViewHelper';\n\nexport default class BandRenderer extends BaseRenderer {\n\n renderToListItem(data: ArtistEntity | LabelEntity | BandEntity): RenderedListItem | null {\n if (!data.url) {\n return null;\n }\n const bandView: BandView = {\n name: 'band',\n bandUrl: data.url\n };\n const result: RenderedListItem = {\n service: 'bandcamp',\n type: 'folder',\n title: data.name,\n albumart: data.thumbnail,\n uri: `${this.uri}/${ViewHelper.constructUriSegmentFromView(bandView)}`\n };\n if (data.location) {\n result.artist = data.location;\n }\n return result;\n }\n\n renderToHeader(data: ArtistEntity | LabelEntity): RenderedHeader | null {\n const result: RenderedHeader = {\n uri: this.uri,\n service: 'bandcamp',\n type: 'song',\n title: data.name,\n albumart: data.thumbnail\n };\n switch (data.type) {\n case 'artist':\n result.artist = bandcamp.getI18n('BANDCAMP_HEADER_ARTIST');\n break;\n case 'label':\n result.artist = bandcamp.getI18n('BANDCAMP_HEADER_LABEL');\n break;\n default:\n }\n if (data.location) {\n result.year = data.location;\n }\n if (data.type === 'artist' && data.label) {\n result.duration = data.label.name;\n }\n return result;\n }\n}\n"]} \ No newline at end of file diff --git a/bandcamp/dist/lib/controller/browse/view-handlers/renderers/BaseRenderer.d.ts b/bandcamp/dist/lib/controller/browse/view-handlers/renderers/BaseRenderer.d.ts index 8538435f4..56c50c0a1 100644 --- a/bandcamp/dist/lib/controller/browse/view-handlers/renderers/BaseRenderer.d.ts +++ b/bandcamp/dist/lib/controller/browse/view-handlers/renderers/BaseRenderer.d.ts @@ -1,4 +1,4 @@ -import View from '../View'; +import type View from '../View'; export interface RenderedListItem { service: 'bandcamp'; type: 'folder' | 'song' | 'item-no-menu'; diff --git a/bandcamp/dist/lib/controller/browse/view-handlers/renderers/BaseRenderer.d.ts.map b/bandcamp/dist/lib/controller/browse/view-handlers/renderers/BaseRenderer.d.ts.map index b3d71bdd9..016126388 100644 --- a/bandcamp/dist/lib/controller/browse/view-handlers/renderers/BaseRenderer.d.ts.map +++ b/bandcamp/dist/lib/controller/browse/view-handlers/renderers/BaseRenderer.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"BaseRenderer.d.ts","sourceRoot":"","sources":["../../../../../../src/lib/controller/browse/view-handlers/renderers/BaseRenderer.ts"],"names":[],"mappings":"AAEA,OAAO,IAAI,MAAM,SAAS,CAAC;AAE3B,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,UAAU,CAAC;IACpB,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,cAAc,CAAC;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,UAAU,CAAC;IACpB,IAAI,EAAE,OAAO,GAAG,MAAM,CAAC;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAC9B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAED,MAAM,CAAC,OAAO,CAAC,QAAQ,OAAO,YAAY,CAAC,CAAC;;gBAM9B,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE;IAMjE,QAAQ,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,gBAAgB,GAAG,IAAI;IAG3E,cAAc,CAAC,IAAI,EAAE,CAAC,GAAG,cAAc,GAAG,IAAI;IAI9C,IAAI,GAAG,IAAI,MAAM,CAEhB;IAED,IAAI,WAAW,IAAI,IAAI,CAEtB;IAED,IAAI,aAAa,IAAI,IAAI,EAAE,CAE1B;IAED,SAAS,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;IAK5C,SAAS,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI;IAkBxD,uBAAuB,CAAC,IAAI,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,GAAG,MAAM;CAMtE"} \ No newline at end of file +{"version":3,"file":"BaseRenderer.d.ts","sourceRoot":"","sources":["../../../../../../src/lib/controller/browse/view-handlers/renderers/BaseRenderer.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,IAAI,MAAM,SAAS,CAAC;AAEhC,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,UAAU,CAAC;IACpB,IAAI,EAAE,QAAQ,GAAG,MAAM,GAAG,cAAc,CAAC;IACzC,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,OAAO,CAAC;CACpB;AAED,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,UAAU,CAAC;IACpB,IAAI,EAAE,OAAO,GAAG,MAAM,CAAC;IACvB,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACtB,MAAM,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACvB,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAC;IAC9B,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IACzB,KAAK,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;CACvB;AAED,MAAM,CAAC,OAAO,CAAC,QAAQ,OAAO,YAAY,CAAC,CAAC;;gBAM9B,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE;IAMjE,QAAQ,CAAC,gBAAgB,CAAC,IAAI,EAAE,CAAC,EAAE,GAAG,IAAI,EAAE,GAAG,EAAE,GAAG,gBAAgB,GAAG,IAAI;IAG3E,cAAc,CAAC,IAAI,EAAE,CAAC,GAAG,cAAc,GAAG,IAAI;IAI9C,IAAI,GAAG,IAAI,MAAM,CAEhB;IAED,IAAI,WAAW,IAAI,IAAI,CAEtB;IAED,IAAI,aAAa,IAAI,IAAI,EAAE,CAE1B;IAED,SAAS,CAAC,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;IAK5C,SAAS,CAAC,UAAU,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,GAAG,MAAM,GAAG,IAAI;IAkBxD,uBAAuB,CAAC,IAAI,EAAE;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,EAAE,GAAG,MAAM;CAMtE"} \ No newline at end of file diff --git a/bandcamp/dist/lib/controller/browse/view-handlers/renderers/BaseRenderer.js b/bandcamp/dist/lib/controller/browse/view-handlers/renderers/BaseRenderer.js index aeda3a904..524178fde 100644 --- a/bandcamp/dist/lib/controller/browse/view-handlers/renderers/BaseRenderer.js +++ b/bandcamp/dist/lib/controller/browse/view-handlers/renderers/BaseRenderer.js @@ -15,13 +15,23 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? ( }) : function(o, v) { o["default"] = v; }); -var __importStar = (this && this.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; -}; +var __importStar = (this && this.__importStar) || (function () { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + __setModuleDefault(result, mod); + return result; + }; +})(); var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { if (kind === "m") throw new TypeError("Private method is not writable"); if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); @@ -49,7 +59,6 @@ class BaseRenderer { __classPrivateFieldSet(this, _BaseRenderer_currentView, currentView, "f"); __classPrivateFieldSet(this, _BaseRenderer_previousViews, previousViews, "f"); } - // eslint-disable-next-line @typescript-eslint/no-unused-vars renderToHeader(data) { return null; } @@ -90,6 +99,6 @@ class BaseRenderer { }, []).join(', '); } } -exports.default = BaseRenderer; _BaseRenderer_uri = new WeakMap(), _BaseRenderer_currentView = new WeakMap(), _BaseRenderer_previousViews = new WeakMap(); +exports.default = BaseRenderer; //# sourceMappingURL=BaseRenderer.js.map \ No newline at end of file diff --git a/bandcamp/dist/lib/controller/browse/view-handlers/renderers/BaseRenderer.js.map b/bandcamp/dist/lib/controller/browse/view-handlers/renderers/BaseRenderer.js.map index 4251cac91..eca015edf 100644 --- a/bandcamp/dist/lib/controller/browse/view-handlers/renderers/BaseRenderer.js.map +++ b/bandcamp/dist/lib/controller/browse/view-handlers/renderers/BaseRenderer.js.map @@ -1 +1 @@ -{"version":3,"file":"BaseRenderer.js","sourceRoot":"","sources":["../../../../../../src/lib/controller/browse/view-handlers/renderers/BaseRenderer.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,kFAAmD;AACnD,sEAAgE;AA6BhE,MAA8B,YAAY;IAMxC,YAAY,GAAW,EAAE,WAAiB,EAAE,aAAqB;QAJjE,oCAAa;QACb,4CAAmB;QACnB,8CAAuB;QAGrB,uBAAA,IAAI,qBAAQ,GAAG,MAAA,CAAC;QAChB,uBAAA,IAAI,6BAAgB,WAAW,MAAA,CAAC;QAChC,uBAAA,IAAI,+BAAkB,aAAa,MAAA,CAAC;IACtC,CAAC;IAID,6DAA6D;IAC7D,cAAc,CAAC,IAAO;QACpB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,GAAG;QACL,OAAO,uBAAA,IAAI,yBAAK,CAAC;IACnB,CAAC;IAED,IAAI,WAAW;QACb,OAAO,uBAAA,IAAI,iCAAa,CAAC;IAC3B,CAAC;IAED,IAAI,aAAa;QACf,OAAO,uBAAA,IAAI,mCAAe,CAAC;IAC7B,CAAC;IAES,OAAO,CAAC,IAAY,EAAE,IAAY;QAC1C,OAAO,kBAAQ,CAAC,aAAa,CAAC,IAAI,EAAE,yBAAQ,CAAC,OAAO,CAAC,YAAY,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC,EAAE,oBAAS,CAAC,aAAa,CAAC,CAAC;IACnH,CAAC;IAED,qGAAqG;IAC3F,UAAU,CAAC,IAAmB;QACtC,IAAI,IAAI,EAAE;YACR,6BAA6B;YAC7B,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;YAC5B,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;YACpC,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC;YACzB,iDAAiD;YACjD,IAAI,GAAG,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,GAAG,CAAC,EAAE;gBACX,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;aACzC;YACD,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;YACzC,GAAG,IAAI,GAAG,IAAI,EAAE,CAAC;YACjB,OAAO,GAAG,CAAC;SACZ;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,uBAAuB,CAAC,IAAoC;QAC1D,OAAO,IAAI,CAAC,MAAM,CAAW,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;YACxC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACnB,OAAO,KAAK,CAAC;QACf,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC;CACF;AA5DD,+BA4DC","sourcesContent":["import bandcamp from '../../../../BandcampContext';\nimport UIHelper, { UI_STYLES } from '../../../../util/UIHelper';\nimport View from '../View';\n\nexport interface RenderedListItem {\n service: 'bandcamp';\n type: 'folder' | 'song' | 'item-no-menu';\n title: string;\n albumart?: string | null;\n artist?: string | null;\n album?: string | null;\n duration?: number | null;\n uri: string;\n icon?: string;\n favorite?: boolean;\n}\n\nexport interface RenderedHeader {\n service: 'bandcamp';\n type: 'album' | 'song';\n uri: string;\n albumart?: string | null;\n title?: string | null;\n album?: string | null;\n artist?: string | null;\n year?: number | string | null;\n duration?: string | null;\n genre?: string | null;\n}\n\nexport default abstract class BaseRenderer {\n\n #uri: string;\n #currentView: View;\n #previousViews: View[];\n\n constructor(uri: string, currentView: View, previousViews: View[]) {\n this.#uri = uri;\n this.#currentView = currentView;\n this.#previousViews = previousViews;\n }\n\n abstract renderToListItem(data: T, ...args: any[]): RenderedListItem | null;\n\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n renderToHeader(data: T): RenderedHeader | null {\n return null;\n }\n\n get uri(): string {\n return this.#uri;\n }\n\n get currentView(): View {\n return this.#currentView;\n }\n\n get previousViews(): View[] {\n return this.#previousViews;\n }\n\n protected addType(type: string, text: string) {\n return UIHelper.addTextBefore(text, bandcamp.getI18n(`BANDCAMP_${type.toUpperCase()}`), UI_STYLES.RESOURCE_TYPE);\n }\n\n // https://github.com/volumio/Volumio2-UI/blob/master/src/app/browse-music/browse-music.controller.js\n protected timeFormat(time: number | null): string | null {\n if (time) {\n // Hours, minutes and seconds\n const hrs = ~~(time / 3600);\n const mins = ~~((time % 3600) / 60);\n const secs = ~~time % 60;\n // Output like \"1:01\" or \"4:03:59\" or \"123:03:59\"\n let ret = '';\n if (hrs > 0) {\n ret += `${hrs}:${mins < 10 ? '0' : ''}`;\n }\n ret += `${mins}:${secs < 10 ? '0' : ''}`;\n ret += `${secs}`;\n return ret;\n }\n return null;\n }\n\n getStringFromIdNamePair(data: { id: string, name: string }[]): string {\n return data.reduce((parts, d) => {\n parts.push(d.name);\n return parts;\n }, []).join(', ');\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"BaseRenderer.js","sourceRoot":"","sources":["../../../../../../src/lib/controller/browse/view-handlers/renderers/BaseRenderer.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,kFAAmD;AACnD,sEAAgE;AA6BhE,MAA8B,YAAY;IAMxC,YAAY,GAAW,EAAE,WAAiB,EAAE,aAAqB;QAJjE,oCAAa;QACb,4CAAmB;QACnB,8CAAuB;QAGrB,uBAAA,IAAI,qBAAQ,GAAG,MAAA,CAAC;QAChB,uBAAA,IAAI,6BAAgB,WAAW,MAAA,CAAC;QAChC,uBAAA,IAAI,+BAAkB,aAAa,MAAA,CAAC;IACtC,CAAC;IAKD,cAAc,CAAC,IAAO;QACpB,OAAO,IAAI,CAAC;IACd,CAAC;IAED,IAAI,GAAG;QACL,OAAO,uBAAA,IAAI,yBAAK,CAAC;IACnB,CAAC;IAED,IAAI,WAAW;QACb,OAAO,uBAAA,IAAI,iCAAa,CAAC;IAC3B,CAAC;IAED,IAAI,aAAa;QACf,OAAO,uBAAA,IAAI,mCAAe,CAAC;IAC7B,CAAC;IAES,OAAO,CAAC,IAAY,EAAE,IAAY;QAC1C,OAAO,kBAAQ,CAAC,aAAa,CAAC,IAAI,EAAE,yBAAQ,CAAC,OAAO,CAAC,YAAY,IAAI,CAAC,WAAW,EAAE,EAAE,CAAC,EAAE,oBAAS,CAAC,aAAa,CAAC,CAAC;IACnH,CAAC;IAED,qGAAqG;IAC3F,UAAU,CAAC,IAAmB;QACtC,IAAI,IAAI,EAAE,CAAC;YACT,6BAA6B;YAC7B,MAAM,GAAG,GAAG,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,CAAC;YAC5B,MAAM,IAAI,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,GAAG,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;YACpC,MAAM,IAAI,GAAG,CAAC,CAAC,IAAI,GAAG,EAAE,CAAC;YACzB,iDAAiD;YACjD,IAAI,GAAG,GAAG,EAAE,CAAC;YACb,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC;gBACZ,GAAG,IAAI,GAAG,GAAG,IAAI,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;YAC1C,CAAC;YACD,GAAG,IAAI,GAAG,IAAI,IAAI,IAAI,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;YACzC,GAAG,IAAI,GAAG,IAAI,EAAE,CAAC;YACjB,OAAO,GAAG,CAAC;QACb,CAAC;QACD,OAAO,IAAI,CAAC;IACd,CAAC;IAED,uBAAuB,CAAC,IAAoC;QAC1D,OAAO,IAAI,CAAC,MAAM,CAAW,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE;YACxC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC;YACnB,OAAO,KAAK,CAAC;QACf,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpB,CAAC;CACF;;kBA5D6B,YAAY","sourcesContent":["import bandcamp from '../../../../BandcampContext';\nimport UIHelper, { UI_STYLES } from '../../../../util/UIHelper';\nimport type View from '../View';\n\nexport interface RenderedListItem {\n service: 'bandcamp';\n type: 'folder' | 'song' | 'item-no-menu';\n title: string;\n albumart?: string | null;\n artist?: string | null;\n album?: string | null;\n duration?: number | null;\n uri: string;\n icon?: string;\n favorite?: boolean;\n}\n\nexport interface RenderedHeader {\n service: 'bandcamp';\n type: 'album' | 'song';\n uri: string;\n albumart?: string | null;\n title?: string | null;\n album?: string | null;\n artist?: string | null;\n year?: number | string | null;\n duration?: string | null;\n genre?: string | null;\n}\n\nexport default abstract class BaseRenderer {\n\n #uri: string;\n #currentView: View;\n #previousViews: View[];\n\n constructor(uri: string, currentView: View, previousViews: View[]) {\n this.#uri = uri;\n this.#currentView = currentView;\n this.#previousViews = previousViews;\n }\n\n abstract renderToListItem(data: T, ...args: any[]): RenderedListItem | null;\n\n \n renderToHeader(data: T): RenderedHeader | null {\n return null;\n }\n\n get uri(): string {\n return this.#uri;\n }\n\n get currentView(): View {\n return this.#currentView;\n }\n\n get previousViews(): View[] {\n return this.#previousViews;\n }\n\n protected addType(type: string, text: string) {\n return UIHelper.addTextBefore(text, bandcamp.getI18n(`BANDCAMP_${type.toUpperCase()}`), UI_STYLES.RESOURCE_TYPE);\n }\n\n // https://github.com/volumio/Volumio2-UI/blob/master/src/app/browse-music/browse-music.controller.js\n protected timeFormat(time: number | null): string | null {\n if (time) {\n // Hours, minutes and seconds\n const hrs = ~~(time / 3600);\n const mins = ~~((time % 3600) / 60);\n const secs = ~~time % 60;\n // Output like \"1:01\" or \"4:03:59\" or \"123:03:59\"\n let ret = '';\n if (hrs > 0) {\n ret += `${hrs}:${mins < 10 ? '0' : ''}`;\n }\n ret += `${mins}:${secs < 10 ? '0' : ''}`;\n ret += `${secs}`;\n return ret;\n }\n return null;\n }\n\n getStringFromIdNamePair(data: { id: string, name: string }[]): string {\n return data.reduce((parts, d) => {\n parts.push(d.name);\n return parts;\n }, []).join(', ');\n }\n}\n"]} \ No newline at end of file diff --git a/bandcamp/dist/lib/controller/browse/view-handlers/renderers/SearchResultParser.d.ts b/bandcamp/dist/lib/controller/browse/view-handlers/renderers/SearchResultParser.d.ts index 7d083278d..19ae4a6f4 100644 --- a/bandcamp/dist/lib/controller/browse/view-handlers/renderers/SearchResultParser.d.ts +++ b/bandcamp/dist/lib/controller/browse/view-handlers/renderers/SearchResultParser.d.ts @@ -1,8 +1,8 @@ -import AlbumEntity from '../../../../entities/AlbumEntity'; -import ArtistEntity from '../../../../entities/ArtistEntity'; -import LabelEntity from '../../../../entities/LabelEntity'; -import TrackEntity from '../../../../entities/TrackEntity'; -import BaseRenderer, { RenderedListItem } from './BaseRenderer'; +import type AlbumEntity from '../../../../entities/AlbumEntity'; +import type ArtistEntity from '../../../../entities/ArtistEntity'; +import type LabelEntity from '../../../../entities/LabelEntity'; +import type TrackEntity from '../../../../entities/TrackEntity'; +import BaseRenderer, { type RenderedListItem } from './BaseRenderer'; type SearchResultEntity = ArtistEntity | LabelEntity | AlbumEntity | TrackEntity; export default class SearchResultRenderer extends BaseRenderer { renderToListItem(data: SearchResultEntity): RenderedListItem | null; diff --git a/bandcamp/dist/lib/controller/browse/view-handlers/renderers/SearchResultParser.d.ts.map b/bandcamp/dist/lib/controller/browse/view-handlers/renderers/SearchResultParser.d.ts.map index 8e78233c8..5a9ccdf81 100644 --- a/bandcamp/dist/lib/controller/browse/view-handlers/renderers/SearchResultParser.d.ts.map +++ b/bandcamp/dist/lib/controller/browse/view-handlers/renderers/SearchResultParser.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"SearchResultParser.d.ts","sourceRoot":"","sources":["../../../../../../src/lib/controller/browse/view-handlers/renderers/SearchResultParser.ts"],"names":[],"mappings":"AAAA,OAAO,WAAW,MAAM,kCAAkC,CAAC;AAC3D,OAAO,YAAY,MAAM,mCAAmC,CAAC;AAC7D,OAAO,WAAW,MAAM,kCAAkC,CAAC;AAC3D,OAAO,WAAW,MAAM,kCAAkC,CAAC;AAM3D,OAAO,YAAY,EAAE,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEhE,KAAK,kBAAkB,GAAG,YAAY,GAAG,WAAW,GAAG,WAAW,GAAG,WAAW,CAAC;AAEjF,MAAM,CAAC,OAAO,OAAO,oBAAqB,SAAQ,YAAY,CAAC,kBAAkB,CAAC;IAEhF,gBAAgB,CAAC,IAAI,EAAE,kBAAkB,GAAG,gBAAgB,GAAG,IAAI;CAsDpE"} \ No newline at end of file +{"version":3,"file":"SearchResultParser.d.ts","sourceRoot":"","sources":["../../../../../../src/lib/controller/browse/view-handlers/renderers/SearchResultParser.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,WAAW,MAAM,kCAAkC,CAAC;AAChE,OAAO,KAAK,YAAY,MAAM,mCAAmC,CAAC;AAClE,OAAO,KAAK,WAAW,MAAM,kCAAkC,CAAC;AAChE,OAAO,KAAK,WAAW,MAAM,kCAAkC,CAAC;AAMhE,OAAO,YAAY,EAAE,EAAE,KAAK,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAErE,KAAK,kBAAkB,GAAG,YAAY,GAAG,WAAW,GAAG,WAAW,GAAG,WAAW,CAAC;AAEjF,MAAM,CAAC,OAAO,OAAO,oBAAqB,SAAQ,YAAY,CAAC,kBAAkB,CAAC;IAEhF,gBAAgB,CAAC,IAAI,EAAE,kBAAkB,GAAG,gBAAgB,GAAG,IAAI;CAsDpE"} \ No newline at end of file diff --git a/bandcamp/dist/lib/controller/browse/view-handlers/renderers/SearchResultParser.js.map b/bandcamp/dist/lib/controller/browse/view-handlers/renderers/SearchResultParser.js.map index f9cf00df9..7c60800fe 100644 --- a/bandcamp/dist/lib/controller/browse/view-handlers/renderers/SearchResultParser.js.map +++ b/bandcamp/dist/lib/controller/browse/view-handlers/renderers/SearchResultParser.js.map @@ -1 +1 @@ -{"version":3,"file":"SearchResultParser.js","sourceRoot":"","sources":["../../../../../../src/lib/controller/browse/view-handlers/renderers/SearchResultParser.ts"],"names":[],"mappings":";;;;;AAQA,+DAAuC;AACvC,kEAAgE;AAIhE,MAAqB,oBAAqB,SAAQ,sBAAgC;IAEhF,gBAAgB,CAAC,IAAwB;QACvC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;YACb,OAAO,IAAI,CAAC;SACb;QACD,MAAM,MAAM,GAAqB;YAC/B,OAAO,EAAE,UAAU;YACnB,GAAG,EAAE,EAAE;YACP,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC;YACzC,QAAQ,EAAE,IAAI,CAAC,SAAS;SACzB,CAAC;QAEF,IAAI,IAAU,CAAC;QACf,QAAQ,IAAI,CAAC,IAAI,EAAE;YACjB,KAAK,QAAQ;gBACX,IAAI,GAAG;oBACL,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE,IAAI,CAAC,GAAG;iBACN,CAAC;gBACd,MAAM,CAAC,IAAI,GAAG,QAAQ,CAAC;gBACvB,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC;gBAC9B,MAAM;YAER,KAAK,OAAO;gBACV,IAAI,GAAG;oBACL,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE,IAAI,CAAC,GAAG;iBACN,CAAC;gBACd,MAAM,CAAC,IAAI,GAAG,QAAQ,CAAC;gBACvB,MAAM;YAER,KAAK,OAAO;gBACV,IAAI,GAAG;oBACL,IAAI,EAAE,OAAO;oBACb,QAAQ,EAAE,IAAI,CAAC,GAAG;iBACN,CAAC;gBACf,MAAM,CAAC,IAAI,GAAG,QAAQ,CAAC;gBACvB,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;gBAClC,MAAM;YAER,KAAK,OAAO;gBACV,IAAI,GAAG;oBACL,IAAI,EAAE,OAAO;oBACb,QAAQ,EAAE,IAAI,CAAC,GAAG;iBACN,CAAC;gBACf,MAAM,CAAC,IAAI,GAAG,QAAQ,CAAC;gBACvB,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;gBAClC,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC;SACnC;QAED,MAAM,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,oBAAU,CAAC,2BAA2B,CAAC,IAAI,CAAC,EAAE,CAAC;QAE3E,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AAxDD,uCAwDC","sourcesContent":["import AlbumEntity from '../../../../entities/AlbumEntity';\nimport ArtistEntity from '../../../../entities/ArtistEntity';\nimport LabelEntity from '../../../../entities/LabelEntity';\nimport TrackEntity from '../../../../entities/TrackEntity';\nimport { AlbumView } from '../AlbumViewHandler';\nimport { BandView } from '../BandViewHandler';\nimport { TrackView } from '../TrackViewHandler';\nimport View from '../View';\nimport ViewHelper from '../ViewHelper';\nimport BaseRenderer, { RenderedListItem } from './BaseRenderer';\n\ntype SearchResultEntity = ArtistEntity | LabelEntity | AlbumEntity | TrackEntity;\n\nexport default class SearchResultRenderer extends BaseRenderer {\n\n renderToListItem(data: SearchResultEntity): RenderedListItem | null {\n if (!data.url) {\n return null;\n }\n const result: RenderedListItem = {\n service: 'bandcamp',\n uri: '',\n type: 'folder',\n title: this.addType(data.type, data.name),\n albumart: data.thumbnail\n };\n\n let view: View;\n switch (data.type) {\n case 'artist':\n view = {\n name: 'band',\n bandUrl: data.url\n } as BandView;\n result.type = 'folder';\n result.artist = data.location;\n break;\n\n case 'label':\n view = {\n name: 'band',\n bandUrl: data.url\n } as BandView;\n result.type = 'folder';\n break;\n\n case 'album':\n view = {\n name: 'album',\n albumUrl: data.url\n } as AlbumView;\n result.type = 'folder';\n result.artist = data.artist?.name;\n break;\n\n case 'track':\n view = {\n name: 'track',\n trackUrl: data.url\n } as TrackView;\n result.type = 'folder';\n result.artist = data.artist?.name;\n result.album = data.album?.name;\n }\n\n result.uri = `${this.uri}/${ViewHelper.constructUriSegmentFromView(view)}`;\n\n return result;\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"SearchResultParser.js","sourceRoot":"","sources":["../../../../../../src/lib/controller/browse/view-handlers/renderers/SearchResultParser.ts"],"names":[],"mappings":";;;;;AAQA,+DAAuC;AACvC,kEAAqE;AAIrE,MAAqB,oBAAqB,SAAQ,sBAAgC;IAEhF,gBAAgB,CAAC,IAAwB;QACvC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;YACd,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,MAAM,GAAqB;YAC/B,OAAO,EAAE,UAAU;YACnB,GAAG,EAAE,EAAE;YACP,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC;YACzC,QAAQ,EAAE,IAAI,CAAC,SAAS;SACzB,CAAC;QAEF,IAAI,IAAU,CAAC;QACf,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;YAClB,KAAK,QAAQ;gBACX,IAAI,GAAG;oBACL,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE,IAAI,CAAC,GAAG;iBACN,CAAC;gBACd,MAAM,CAAC,IAAI,GAAG,QAAQ,CAAC;gBACvB,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,QAAQ,CAAC;gBAC9B,MAAM;YAER,KAAK,OAAO;gBACV,IAAI,GAAG;oBACL,IAAI,EAAE,MAAM;oBACZ,OAAO,EAAE,IAAI,CAAC,GAAG;iBACN,CAAC;gBACd,MAAM,CAAC,IAAI,GAAG,QAAQ,CAAC;gBACvB,MAAM;YAER,KAAK,OAAO;gBACV,IAAI,GAAG;oBACL,IAAI,EAAE,OAAO;oBACb,QAAQ,EAAE,IAAI,CAAC,GAAG;iBACN,CAAC;gBACf,MAAM,CAAC,IAAI,GAAG,QAAQ,CAAC;gBACvB,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;gBAClC,MAAM;YAER,KAAK,OAAO;gBACV,IAAI,GAAG;oBACL,IAAI,EAAE,OAAO;oBACb,QAAQ,EAAE,IAAI,CAAC,GAAG;iBACN,CAAC;gBACf,MAAM,CAAC,IAAI,GAAG,QAAQ,CAAC;gBACvB,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC;gBAClC,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC;QACpC,CAAC;QAED,MAAM,CAAC,GAAG,GAAG,GAAG,IAAI,CAAC,GAAG,IAAI,oBAAU,CAAC,2BAA2B,CAAC,IAAI,CAAC,EAAE,CAAC;QAE3E,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AAxDD,uCAwDC","sourcesContent":["import type AlbumEntity from '../../../../entities/AlbumEntity';\nimport type ArtistEntity from '../../../../entities/ArtistEntity';\nimport type LabelEntity from '../../../../entities/LabelEntity';\nimport type TrackEntity from '../../../../entities/TrackEntity';\nimport { type AlbumView } from '../AlbumViewHandler';\nimport { type BandView } from '../BandViewHandler';\nimport { type TrackView } from '../TrackViewHandler';\nimport type View from '../View';\nimport ViewHelper from '../ViewHelper';\nimport BaseRenderer, { type RenderedListItem } from './BaseRenderer';\n\ntype SearchResultEntity = ArtistEntity | LabelEntity | AlbumEntity | TrackEntity;\n\nexport default class SearchResultRenderer extends BaseRenderer {\n\n renderToListItem(data: SearchResultEntity): RenderedListItem | null {\n if (!data.url) {\n return null;\n }\n const result: RenderedListItem = {\n service: 'bandcamp',\n uri: '',\n type: 'folder',\n title: this.addType(data.type, data.name),\n albumart: data.thumbnail\n };\n\n let view: View;\n switch (data.type) {\n case 'artist':\n view = {\n name: 'band',\n bandUrl: data.url\n } as BandView;\n result.type = 'folder';\n result.artist = data.location;\n break;\n\n case 'label':\n view = {\n name: 'band',\n bandUrl: data.url\n } as BandView;\n result.type = 'folder';\n break;\n\n case 'album':\n view = {\n name: 'album',\n albumUrl: data.url\n } as AlbumView;\n result.type = 'folder';\n result.artist = data.artist?.name;\n break;\n\n case 'track':\n view = {\n name: 'track',\n trackUrl: data.url\n } as TrackView;\n result.type = 'folder';\n result.artist = data.artist?.name;\n result.album = data.album?.name;\n }\n\n result.uri = `${this.uri}/${ViewHelper.constructUriSegmentFromView(view)}`;\n\n return result;\n }\n}\n"]} \ No newline at end of file diff --git a/bandcamp/dist/lib/controller/browse/view-handlers/renderers/ShowRenderer.d.ts b/bandcamp/dist/lib/controller/browse/view-handlers/renderers/ShowRenderer.d.ts index f42818dc1..fc826f7ec 100644 --- a/bandcamp/dist/lib/controller/browse/view-handlers/renderers/ShowRenderer.d.ts +++ b/bandcamp/dist/lib/controller/browse/view-handlers/renderers/ShowRenderer.d.ts @@ -1,5 +1,5 @@ -import BaseRenderer, { RenderedHeader, RenderedListItem } from './BaseRenderer'; -import ShowEntity from '../../../../entities/ShowEntity'; +import BaseRenderer, { type RenderedHeader, type RenderedListItem } from './BaseRenderer'; +import type ShowEntity from '../../../../entities/ShowEntity'; export default class ShowRenderer extends BaseRenderer { renderToListItem(data: ShowEntity, playOnClick?: boolean): RenderedListItem | null; renderToHeader(data: ShowEntity): RenderedHeader | null; diff --git a/bandcamp/dist/lib/controller/browse/view-handlers/renderers/ShowRenderer.d.ts.map b/bandcamp/dist/lib/controller/browse/view-handlers/renderers/ShowRenderer.d.ts.map index 32bfcd2f7..e198a5f17 100644 --- a/bandcamp/dist/lib/controller/browse/view-handlers/renderers/ShowRenderer.d.ts.map +++ b/bandcamp/dist/lib/controller/browse/view-handlers/renderers/ShowRenderer.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"ShowRenderer.d.ts","sourceRoot":"","sources":["../../../../../../src/lib/controller/browse/view-handlers/renderers/ShowRenderer.ts"],"names":[],"mappings":"AACA,OAAO,YAAY,EAAE,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEhF,OAAO,UAAU,MAAM,iCAAiC,CAAC;AAIzD,MAAM,CAAC,OAAO,OAAO,YAAa,SAAQ,YAAY,CAAC,UAAU,CAAC;IAEhE,gBAAgB,CAAC,IAAI,EAAE,UAAU,EAAE,WAAW,UAAQ,GAAG,gBAAgB,GAAG,IAAI;IA4BhF,cAAc,CAAC,IAAI,EAAE,UAAU,GAAG,cAAc,GAAG,IAAI;CAYxD"} \ No newline at end of file +{"version":3,"file":"ShowRenderer.d.ts","sourceRoot":"","sources":["../../../../../../src/lib/controller/browse/view-handlers/renderers/ShowRenderer.ts"],"names":[],"mappings":"AACA,OAAO,YAAY,EAAE,EAAE,KAAK,cAAc,EAAE,KAAK,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAE1F,OAAO,KAAK,UAAU,MAAM,iCAAiC,CAAC;AAI9D,MAAM,CAAC,OAAO,OAAO,YAAa,SAAQ,YAAY,CAAC,UAAU,CAAC;IAEhE,gBAAgB,CAAC,IAAI,EAAE,UAAU,EAAE,WAAW,UAAQ,GAAG,gBAAgB,GAAG,IAAI;IA4BhF,cAAc,CAAC,IAAI,EAAE,UAAU,GAAG,cAAc,GAAG,IAAI;CAYxD"} \ No newline at end of file diff --git a/bandcamp/dist/lib/controller/browse/view-handlers/renderers/ShowRenderer.js.map b/bandcamp/dist/lib/controller/browse/view-handlers/renderers/ShowRenderer.js.map index 7be2ad685..f720212e0 100644 --- a/bandcamp/dist/lib/controller/browse/view-handlers/renderers/ShowRenderer.js.map +++ b/bandcamp/dist/lib/controller/browse/view-handlers/renderers/ShowRenderer.js.map @@ -1 +1 @@ -{"version":3,"file":"ShowRenderer.js","sourceRoot":"","sources":["../../../../../../src/lib/controller/browse/view-handlers/renderers/ShowRenderer.ts"],"names":[],"mappings":";;;;;AAAA,kFAAmD;AACnD,kEAAgF;AAChF,yEAAiD;AAGjD,+DAAuC;AAEvC,MAAqB,YAAa,SAAQ,sBAAwB;IAEhE,gBAAgB,CAAC,IAAgB,EAAE,WAAW,GAAG,KAAK;QACpD,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;YACb,OAAO,IAAI,CAAC;SACb;QACD,MAAM,QAAQ,GAAa;YACzB,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,IAAI,CAAC,GAAG;SAClB,CAAC;QACF,MAAM,MAAM,GAAqB;YAC/B,OAAO,EAAE,UAAU;YACnB,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,IAAI,CAAC,IAAI;YAChB,MAAM,EAAE,kBAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;YACxC,QAAQ,EAAE,IAAI,CAAC,SAAS;YACxB,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,oBAAU,CAAC,2BAA2B,CAAC,QAAQ,CAAC,EAAE;SACvE,CAAC;QAEF,IAAI,WAAW,EAAE;YACf,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC;YACrB,MAAM,CAAC,KAAK,GAAG,yBAAQ,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC;YAC3D,MAAM,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;YACtB,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;YAChC,OAAO,MAAM,CAAC,MAAM,CAAC;SACtB;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,cAAc,CAAC,IAAgB;QAC7B,OAAO;YACL,KAAK,EAAE,IAAI,CAAC,GAAG;YACf,SAAS,EAAE,UAAU;YACrB,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,IAAI,CAAC,IAAI;YAClB,QAAQ,EAAE,yBAAQ,CAAC,OAAO,CAAC,sBAAsB,CAAC;YAClD,MAAM,EAAE,IAAI,CAAC,IAAI;YACjB,UAAU,EAAE,IAAI,CAAC,WAAW;YAC5B,UAAU,EAAE,IAAI,CAAC,SAAS;SAC3B,CAAC;IACJ,CAAC;CACF;AA1CD,+BA0CC","sourcesContent":["import bandcamp from '../../../../BandcampContext';\nimport BaseRenderer, { RenderedHeader, RenderedListItem } from './BaseRenderer';\nimport UIHelper from '../../../../util/UIHelper';\nimport ShowEntity from '../../../../entities/ShowEntity';\nimport { ShowView } from '../ShowViewHandler';\nimport ViewHelper from '../ViewHelper';\n\nexport default class ShowRenderer extends BaseRenderer {\n\n renderToListItem(data: ShowEntity, playOnClick = false): RenderedListItem | null {\n if (!data.url) {\n return null;\n }\n const showView: ShowView = {\n name: 'show',\n showUrl: data.url\n };\n const result: RenderedListItem = {\n service: 'bandcamp',\n type: 'folder',\n title: data.name,\n artist: UIHelper.reformatDate(data.date),\n albumart: data.thumbnail,\n uri: `${this.uri}/${ViewHelper.constructUriSegmentFromView(showView)}`\n };\n\n if (playOnClick) {\n result.type = 'song';\n result.title = bandcamp.getI18n('BANDCAMP_SHOW_PLAY_FULL');\n result.uri = this.uri;\n result.duration = data.duration;\n delete result.artist;\n }\n\n return result;\n }\n\n renderToHeader(data: ShowEntity): RenderedHeader | null {\n return {\n 'uri': this.uri,\n 'service': 'bandcamp',\n 'type': 'song',\n 'title': data.name,\n 'artist': bandcamp.getI18n('BANDCAMP_HEADER_SHOW'),\n 'year': data.date,\n 'duration': data.description,\n 'albumart': data.thumbnail\n };\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"ShowRenderer.js","sourceRoot":"","sources":["../../../../../../src/lib/controller/browse/view-handlers/renderers/ShowRenderer.ts"],"names":[],"mappings":";;;;;AAAA,kFAAmD;AACnD,kEAA0F;AAC1F,yEAAiD;AAGjD,+DAAuC;AAEvC,MAAqB,YAAa,SAAQ,sBAAwB;IAEhE,gBAAgB,CAAC,IAAgB,EAAE,WAAW,GAAG,KAAK;QACpD,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;YACd,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,QAAQ,GAAa;YACzB,IAAI,EAAE,MAAM;YACZ,OAAO,EAAE,IAAI,CAAC,GAAG;SAClB,CAAC;QACF,MAAM,MAAM,GAAqB;YAC/B,OAAO,EAAE,UAAU;YACnB,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,IAAI,CAAC,IAAI;YAChB,MAAM,EAAE,kBAAQ,CAAC,YAAY,CAAC,IAAI,CAAC,IAAI,CAAC;YACxC,QAAQ,EAAE,IAAI,CAAC,SAAS;YACxB,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,oBAAU,CAAC,2BAA2B,CAAC,QAAQ,CAAC,EAAE;SACvE,CAAC;QAEF,IAAI,WAAW,EAAE,CAAC;YAChB,MAAM,CAAC,IAAI,GAAG,MAAM,CAAC;YACrB,MAAM,CAAC,KAAK,GAAG,yBAAQ,CAAC,OAAO,CAAC,yBAAyB,CAAC,CAAC;YAC3D,MAAM,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;YACtB,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;YAChC,OAAO,MAAM,CAAC,MAAM,CAAC;QACvB,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,cAAc,CAAC,IAAgB;QAC7B,OAAO;YACL,KAAK,EAAE,IAAI,CAAC,GAAG;YACf,SAAS,EAAE,UAAU;YACrB,MAAM,EAAE,MAAM;YACd,OAAO,EAAE,IAAI,CAAC,IAAI;YAClB,QAAQ,EAAE,yBAAQ,CAAC,OAAO,CAAC,sBAAsB,CAAC;YAClD,MAAM,EAAE,IAAI,CAAC,IAAI;YACjB,UAAU,EAAE,IAAI,CAAC,WAAW;YAC5B,UAAU,EAAE,IAAI,CAAC,SAAS;SAC3B,CAAC;IACJ,CAAC;CACF;AA1CD,+BA0CC","sourcesContent":["import bandcamp from '../../../../BandcampContext';\nimport BaseRenderer, { type RenderedHeader, type RenderedListItem } from './BaseRenderer';\nimport UIHelper from '../../../../util/UIHelper';\nimport type ShowEntity from '../../../../entities/ShowEntity';\nimport { type ShowView } from '../ShowViewHandler';\nimport ViewHelper from '../ViewHelper';\n\nexport default class ShowRenderer extends BaseRenderer {\n\n renderToListItem(data: ShowEntity, playOnClick = false): RenderedListItem | null {\n if (!data.url) {\n return null;\n }\n const showView: ShowView = {\n name: 'show',\n showUrl: data.url\n };\n const result: RenderedListItem = {\n service: 'bandcamp',\n type: 'folder',\n title: data.name,\n artist: UIHelper.reformatDate(data.date),\n albumart: data.thumbnail,\n uri: `${this.uri}/${ViewHelper.constructUriSegmentFromView(showView)}`\n };\n\n if (playOnClick) {\n result.type = 'song';\n result.title = bandcamp.getI18n('BANDCAMP_SHOW_PLAY_FULL');\n result.uri = this.uri;\n result.duration = data.duration;\n delete result.artist;\n }\n\n return result;\n }\n\n renderToHeader(data: ShowEntity): RenderedHeader | null {\n return {\n 'uri': this.uri,\n 'service': 'bandcamp',\n 'type': 'song',\n 'title': data.name,\n 'artist': bandcamp.getI18n('BANDCAMP_HEADER_SHOW'),\n 'year': data.date,\n 'duration': data.description,\n 'albumart': data.thumbnail\n };\n }\n}\n"]} \ No newline at end of file diff --git a/bandcamp/dist/lib/controller/browse/view-handlers/renderers/TagRenderer.d.ts b/bandcamp/dist/lib/controller/browse/view-handlers/renderers/TagRenderer.d.ts index fe024f1cc..eddebfc67 100644 --- a/bandcamp/dist/lib/controller/browse/view-handlers/renderers/TagRenderer.d.ts +++ b/bandcamp/dist/lib/controller/browse/view-handlers/renderers/TagRenderer.d.ts @@ -1,11 +1,7 @@ -import BaseRenderer, { RenderedHeader, RenderedListItem } from './BaseRenderer'; -import TagEntity from '../../../../entities/TagEntity'; -export interface TagListSelectionRenderParams { - selected: boolean; - uri: string; -} +import BaseRenderer, { type RenderedHeader, type RenderedListItem } from './BaseRenderer'; +import type TagEntity from '../../../../entities/TagEntity'; export default class TagRenderer extends BaseRenderer { - renderToListItem(data: TagEntity, listSelectionParams: TagListSelectionRenderParams): RenderedListItem | null; + renderToListItem(data: TagEntity): RenderedListItem | null; renderGenreListItem(data: TagEntity): RenderedListItem | null; renderToHeader(data: TagEntity): RenderedHeader | null; } diff --git a/bandcamp/dist/lib/controller/browse/view-handlers/renderers/TagRenderer.d.ts.map b/bandcamp/dist/lib/controller/browse/view-handlers/renderers/TagRenderer.d.ts.map index d5759f23a..ec16ead7a 100644 --- a/bandcamp/dist/lib/controller/browse/view-handlers/renderers/TagRenderer.d.ts.map +++ b/bandcamp/dist/lib/controller/browse/view-handlers/renderers/TagRenderer.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"TagRenderer.d.ts","sourceRoot":"","sources":["../../../../../../src/lib/controller/browse/view-handlers/renderers/TagRenderer.ts"],"names":[],"mappings":"AACA,OAAO,YAAY,EAAE,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEhF,OAAO,SAAS,MAAM,gCAAgC,CAAC;AAIvD,MAAM,WAAW,4BAA4B;IAC3C,QAAQ,EAAE,OAAO,CAAC;IAClB,GAAG,EAAE,MAAM,CAAC;CACb;AAED,MAAM,CAAC,OAAO,OAAO,WAAY,SAAQ,YAAY,CAAC,SAAS,CAAC;IAE9D,gBAAgB,CAAC,IAAI,EAAE,SAAS,EAAE,mBAAmB,EAAE,4BAA4B,GAAG,gBAAgB,GAAG,IAAI;IAW7G,mBAAmB,CAAC,IAAI,EAAE,SAAS,GAAG,gBAAgB,GAAG,IAAI;IAc7D,cAAc,CAAC,IAAI,EAAE,SAAS,GAAG,cAAc,GAAG,IAAI;CASvD"} \ No newline at end of file +{"version":3,"file":"TagRenderer.d.ts","sourceRoot":"","sources":["../../../../../../src/lib/controller/browse/view-handlers/renderers/TagRenderer.ts"],"names":[],"mappings":"AACA,OAAO,YAAY,EAAE,EAAE,KAAK,cAAc,EAAE,KAAK,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAC1F,OAAO,KAAK,SAAS,MAAM,gCAAgC,CAAC;AAI5D,MAAM,CAAC,OAAO,OAAO,WAAY,SAAQ,YAAY,CAAC,SAAS,CAAC;IAE9D,gBAAgB,CAAC,IAAI,EAAE,SAAS,GAAG,gBAAgB,GAAG,IAAI;IAc1D,mBAAmB,CAAC,IAAI,EAAE,SAAS,GAAG,gBAAgB,GAAG,IAAI;IAc7D,cAAc,CAAC,IAAI,EAAE,SAAS,GAAG,cAAc,GAAG,IAAI;CASvD"} \ No newline at end of file diff --git a/bandcamp/dist/lib/controller/browse/view-handlers/renderers/TagRenderer.js b/bandcamp/dist/lib/controller/browse/view-handlers/renderers/TagRenderer.js index af3ab99da..da3f0ce24 100644 --- a/bandcamp/dist/lib/controller/browse/view-handlers/renderers/TagRenderer.js +++ b/bandcamp/dist/lib/controller/browse/view-handlers/renderers/TagRenderer.js @@ -1,57 +1,36 @@ "use strict"; -var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - var desc = Object.getOwnPropertyDescriptor(m, k); - if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) { - desc = { enumerable: true, get: function() { return m[k]; } }; - } - Object.defineProperty(o, k2, desc); -}) : (function(o, m, k, k2) { - if (k2 === undefined) k2 = k; - o[k2] = m[k]; -})); -var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) { - Object.defineProperty(o, "default", { enumerable: true, value: v }); -}) : function(o, v) { - o["default"] = v; -}); -var __importStar = (this && this.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; -}; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); const BandcampContext_1 = __importDefault(require("../../../../BandcampContext")); const BaseRenderer_1 = __importDefault(require("./BaseRenderer")); -const UIHelper_1 = __importStar(require("../../../../util/UIHelper")); const ViewHelper_1 = __importDefault(require("../ViewHelper")); class TagRenderer extends BaseRenderer_1.default { - renderToListItem(data, listSelectionParams) { - const title = listSelectionParams.selected ? UIHelper_1.default.styleText(data.name, UIHelper_1.UI_STYLES.LIST_ITEM_SELECTED) : data.name; + renderToListItem(data) { + const discoverView = { + name: 'discover', + customTags: data.value + }; return { service: 'bandcamp', type: 'item-no-menu', - title, - icon: listSelectionParams.selected ? 'fa fa-check' : 'fa', - uri: listSelectionParams.uri + title: data.name, + icon: 'fa', + uri: `${this.uri}/${ViewHelper_1.default.constructUriSegmentFromView(discoverView)}` }; } renderGenreListItem(data) { - const tagView = { - name: 'tag', - tagUrl: data.url + const discoverView = { + name: 'discover', + customTags: data.value }; return { service: 'bandcamp', type: 'folder', title: data.name, albumart: data.thumbnail, - uri: `${this.uri}/${ViewHelper_1.default.constructUriSegmentFromView(tagView)}` + uri: `${this.uri}/${ViewHelper_1.default.constructUriSegmentFromView(discoverView)}` }; } renderToHeader(data) { diff --git a/bandcamp/dist/lib/controller/browse/view-handlers/renderers/TagRenderer.js.map b/bandcamp/dist/lib/controller/browse/view-handlers/renderers/TagRenderer.js.map index 34cabd6c6..970a19149 100644 --- a/bandcamp/dist/lib/controller/browse/view-handlers/renderers/TagRenderer.js.map +++ b/bandcamp/dist/lib/controller/browse/view-handlers/renderers/TagRenderer.js.map @@ -1 +1 @@ -{"version":3,"file":"TagRenderer.js","sourceRoot":"","sources":["../../../../../../src/lib/controller/browse/view-handlers/renderers/TagRenderer.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,kFAAmD;AACnD,kEAAgF;AAChF,sEAAgE;AAGhE,+DAAuC;AAOvC,MAAqB,WAAY,SAAQ,sBAAuB;IAE9D,gBAAgB,CAAC,IAAe,EAAE,mBAAiD;QACjF,MAAM,KAAK,GAAG,mBAAmB,CAAC,QAAQ,CAAC,CAAC,CAAC,kBAAQ,CAAC,SAAS,CAAC,IAAI,CAAC,IAAI,EAAE,oBAAS,CAAC,kBAAkB,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC;QACrH,OAAO;YACL,OAAO,EAAE,UAAU;YACnB,IAAI,EAAE,cAAc;YACpB,KAAK;YACL,IAAI,EAAE,mBAAmB,CAAC,QAAQ,CAAC,CAAC,CAAC,aAAa,CAAC,CAAC,CAAC,IAAI;YACzD,GAAG,EAAE,mBAAmB,CAAC,GAAG;SAC7B,CAAC;IACJ,CAAC;IAED,mBAAmB,CAAC,IAAe;QACjC,MAAM,OAAO,GAAY;YACvB,IAAI,EAAE,KAAK;YACX,MAAM,EAAE,IAAI,CAAC,GAAG;SACjB,CAAC;QACF,OAAO;YACL,OAAO,EAAE,UAAU;YACnB,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,IAAI,CAAC,IAAI;YAChB,QAAQ,EAAE,IAAI,CAAC,SAAS;YACxB,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,oBAAU,CAAC,2BAA2B,CAAC,OAAO,CAAC,EAAE;SACtE,CAAC;IACJ,CAAC;IAED,cAAc,CAAC,IAAe;QAC5B,OAAO;YACL,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,OAAO,EAAE,UAAU;YACnB,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,IAAI,CAAC,IAAI;YAChB,MAAM,EAAE,yBAAQ,CAAC,OAAO,CAAC,qBAAqB,CAAC;SAChD,CAAC;IACJ,CAAC;CACF;AApCD,8BAoCC","sourcesContent":["import bandcamp from '../../../../BandcampContext';\nimport BaseRenderer, { RenderedHeader, RenderedListItem } from './BaseRenderer';\nimport UIHelper, { UI_STYLES } from '../../../../util/UIHelper';\nimport TagEntity from '../../../../entities/TagEntity';\nimport { TagView } from '../TagViewHandler';\nimport ViewHelper from '../ViewHelper';\n\nexport interface TagListSelectionRenderParams {\n selected: boolean;\n uri: string;\n}\n\nexport default class TagRenderer extends BaseRenderer {\n\n renderToListItem(data: TagEntity, listSelectionParams: TagListSelectionRenderParams): RenderedListItem | null {\n const title = listSelectionParams.selected ? UIHelper.styleText(data.name, UI_STYLES.LIST_ITEM_SELECTED) : data.name;\n return {\n service: 'bandcamp',\n type: 'item-no-menu',\n title,\n icon: listSelectionParams.selected ? 'fa fa-check' : 'fa',\n uri: listSelectionParams.uri\n };\n }\n\n renderGenreListItem(data: TagEntity): RenderedListItem | null {\n const tagView: TagView = {\n name: 'tag',\n tagUrl: data.url\n };\n return {\n service: 'bandcamp',\n type: 'folder',\n title: data.name,\n albumart: data.thumbnail,\n uri: `${this.uri}/${ViewHelper.constructUriSegmentFromView(tagView)}`\n };\n }\n\n renderToHeader(data: TagEntity): RenderedHeader | null {\n return {\n uri: this.uri,\n service: 'bandcamp',\n type: 'song',\n title: data.name,\n artist: bandcamp.getI18n('BANDCAMP_HEADER_TAG')\n };\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"TagRenderer.js","sourceRoot":"","sources":["../../../../../../src/lib/controller/browse/view-handlers/renderers/TagRenderer.ts"],"names":[],"mappings":";;;;;AAAA,kFAAmD;AACnD,kEAA0F;AAE1F,+DAAuC;AAGvC,MAAqB,WAAY,SAAQ,sBAAuB;IAE9D,gBAAgB,CAAC,IAAe;QAC9B,MAAM,YAAY,GAAiB;YACjC,IAAI,EAAE,UAAU;YAChB,UAAU,EAAE,IAAI,CAAC,KAAK;SACvB,CAAC;QACF,OAAO;YACL,OAAO,EAAE,UAAU;YACnB,IAAI,EAAE,cAAc;YACpB,KAAK,EAAE,IAAI,CAAC,IAAI;YAChB,IAAI,EAAE,IAAI;YACV,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,oBAAU,CAAC,2BAA2B,CAAC,YAAY,CAAC,EAAE;SAC3E,CAAC;IACJ,CAAC;IAED,mBAAmB,CAAC,IAAe;QACjC,MAAM,YAAY,GAAiB;YACjC,IAAI,EAAE,UAAU;YAChB,UAAU,EAAE,IAAI,CAAC,KAAK;SACvB,CAAC;QACF,OAAO;YACL,OAAO,EAAE,UAAU;YACnB,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,IAAI,CAAC,IAAI;YAChB,QAAQ,EAAE,IAAI,CAAC,SAAS;YACxB,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,oBAAU,CAAC,2BAA2B,CAAC,YAAY,CAAC,EAAE;SAC3E,CAAC;IACJ,CAAC;IAED,cAAc,CAAC,IAAe;QAC5B,OAAO;YACL,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,OAAO,EAAE,UAAU;YACnB,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,IAAI,CAAC,IAAI;YAChB,MAAM,EAAE,yBAAQ,CAAC,OAAO,CAAC,qBAAqB,CAAC;SAChD,CAAC;IACJ,CAAC;CACF;AAvCD,8BAuCC","sourcesContent":["import bandcamp from '../../../../BandcampContext';\nimport BaseRenderer, { type RenderedHeader, type RenderedListItem } from './BaseRenderer';\nimport type TagEntity from '../../../../entities/TagEntity';\nimport ViewHelper from '../ViewHelper';\nimport { type DiscoverView } from '../DiscoverViewHandler';\n\nexport default class TagRenderer extends BaseRenderer {\n\n renderToListItem(data: TagEntity): RenderedListItem | null {\n const discoverView: DiscoverView = {\n name: 'discover',\n customTags: data.value\n };\n return {\n service: 'bandcamp',\n type: 'item-no-menu',\n title: data.name,\n icon: 'fa',\n uri: `${this.uri}/${ViewHelper.constructUriSegmentFromView(discoverView)}`\n };\n }\n\n renderGenreListItem(data: TagEntity): RenderedListItem | null {\n const discoverView: DiscoverView = {\n name: 'discover',\n customTags: data.value\n };\n return {\n service: 'bandcamp',\n type: 'folder',\n title: data.name,\n albumart: data.thumbnail,\n uri: `${this.uri}/${ViewHelper.constructUriSegmentFromView(discoverView)}`\n };\n }\n\n renderToHeader(data: TagEntity): RenderedHeader | null {\n return {\n uri: this.uri,\n service: 'bandcamp',\n type: 'song',\n title: data.name,\n artist: bandcamp.getI18n('BANDCAMP_HEADER_TAG')\n };\n }\n}\n"]} \ No newline at end of file diff --git a/bandcamp/dist/lib/controller/browse/view-handlers/renderers/TrackRenderer.d.ts b/bandcamp/dist/lib/controller/browse/view-handlers/renderers/TrackRenderer.d.ts index addabf2e3..e5907bd60 100644 --- a/bandcamp/dist/lib/controller/browse/view-handlers/renderers/TrackRenderer.d.ts +++ b/bandcamp/dist/lib/controller/browse/view-handlers/renderers/TrackRenderer.d.ts @@ -1,5 +1,5 @@ -import BaseRenderer, { RenderedHeader, RenderedListItem } from './BaseRenderer'; -import TrackEntity from '../../../../entities/TrackEntity'; +import BaseRenderer, { type RenderedHeader, type RenderedListItem } from './BaseRenderer'; +import type TrackEntity from '../../../../entities/TrackEntity'; export default class TrackRenderer extends BaseRenderer { renderToListItem(data: TrackEntity, addType?: boolean, fakeAlbum?: boolean, addNonPlayableText?: boolean): RenderedListItem | null; renderToHeader(data: TrackEntity): RenderedHeader | null; diff --git a/bandcamp/dist/lib/controller/browse/view-handlers/renderers/TrackRenderer.d.ts.map b/bandcamp/dist/lib/controller/browse/view-handlers/renderers/TrackRenderer.d.ts.map index 0e81a4a46..acce911a6 100644 --- a/bandcamp/dist/lib/controller/browse/view-handlers/renderers/TrackRenderer.d.ts.map +++ b/bandcamp/dist/lib/controller/browse/view-handlers/renderers/TrackRenderer.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"TrackRenderer.d.ts","sourceRoot":"","sources":["../../../../../../src/lib/controller/browse/view-handlers/renderers/TrackRenderer.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,EAAE,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAEhF,OAAO,WAAW,MAAM,kCAAkC,CAAC;AAI3D,MAAM,CAAC,OAAO,OAAO,aAAc,SAAQ,YAAY,CAAC,WAAW,CAAC;IAElE,gBAAgB,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,UAAQ,EAAE,SAAS,UAAQ,EAAE,kBAAkB,UAAO,GAAG,gBAAgB,GAAG,IAAI;IA6B3H,cAAc,CAAC,IAAI,EAAE,WAAW,GAAG,cAAc,GAAG,IAAI;CAUzD"} \ No newline at end of file +{"version":3,"file":"TrackRenderer.d.ts","sourceRoot":"","sources":["../../../../../../src/lib/controller/browse/view-handlers/renderers/TrackRenderer.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,EAAE,EAAE,KAAK,cAAc,EAAE,KAAK,gBAAgB,EAAE,MAAM,gBAAgB,CAAC;AAE1F,OAAO,KAAK,WAAW,MAAM,kCAAkC,CAAC;AAIhE,MAAM,CAAC,OAAO,OAAO,aAAc,SAAQ,YAAY,CAAC,WAAW,CAAC;IAElE,gBAAgB,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,UAAQ,EAAE,SAAS,UAAQ,EAAE,kBAAkB,UAAO,GAAG,gBAAgB,GAAG,IAAI;IA6B3H,cAAc,CAAC,IAAI,EAAE,WAAW,GAAG,cAAc,GAAG,IAAI;CAUzD"} \ No newline at end of file diff --git a/bandcamp/dist/lib/controller/browse/view-handlers/renderers/TrackRenderer.js.map b/bandcamp/dist/lib/controller/browse/view-handlers/renderers/TrackRenderer.js.map index 4c88c6bb0..5b585bc92 100644 --- a/bandcamp/dist/lib/controller/browse/view-handlers/renderers/TrackRenderer.js.map +++ b/bandcamp/dist/lib/controller/browse/view-handlers/renderers/TrackRenderer.js.map @@ -1 +1 @@ -{"version":3,"file":"TrackRenderer.js","sourceRoot":"","sources":["../../../../../../src/lib/controller/browse/view-handlers/renderers/TrackRenderer.ts"],"names":[],"mappings":";;;;;AAAA,kEAAgF;AAChF,yEAAiD;AAGjD,+DAAuC;AAEvC,MAAqB,aAAc,SAAQ,sBAAyB;IAElE,gBAAgB,CAAC,IAAiB,EAAE,OAAO,GAAG,KAAK,EAAE,SAAS,GAAG,KAAK,EAAE,kBAAkB,GAAG,IAAI;QAC/F,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE;YACb,OAAO,IAAI,CAAC;SACb;QAED,MAAM,SAAS,GAAc;YAC3B,IAAI,EAAE,OAAO;YACb,QAAQ,EAAE,IAAI,CAAC,GAAG;SACnB,CAAC;QACF,MAAM,MAAM,GAAqB;YAC/B,OAAO,EAAE,UAAU;YACnB,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM;YACnC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI;YAC7D,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI;YACzB,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI;YACvB,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,oBAAU,CAAC,2BAA2B,CAAC,SAAS,CAAC,EAAE;YACvE,QAAQ,EAAE,IAAI,CAAC,SAAS;SACzB,CAAC;QAEF,IAAI,CAAC,SAAS,EAAE;YACd,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;SACjC;QACD,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,kBAAkB,EAAE;YACzC,MAAM,CAAC,KAAK,GAAG,kBAAQ,CAAC,kBAAkB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;SAC1D;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,cAAc,CAAC,IAAiB;QAC9B,OAAO;YACL,OAAO,EAAE,UAAU;YACnB,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,IAAI,CAAC,IAAI;YAChB,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI;YACzB,QAAQ,EAAE,IAAI,CAAC,SAAS;SACzB,CAAC;IACJ,CAAC;CACF;AAzCD,gCAyCC","sourcesContent":["import BaseRenderer, { RenderedHeader, RenderedListItem } from './BaseRenderer';\nimport UIHelper from '../../../../util/UIHelper';\nimport TrackEntity from '../../../../entities/TrackEntity';\nimport { TrackView } from '../TrackViewHandler';\nimport ViewHelper from '../ViewHelper';\n\nexport default class TrackRenderer extends BaseRenderer {\n\n renderToListItem(data: TrackEntity, addType = false, fakeAlbum = false, addNonPlayableText = true): RenderedListItem | null {\n if (!data.url) {\n return null;\n }\n\n const trackView: TrackView = {\n name: 'track',\n trackUrl: data.url\n };\n const result: RenderedListItem = {\n service: 'bandcamp',\n type: fakeAlbum ? 'folder' : 'song',\n title: addType ? this.addType('track', data.name) : data.name,\n artist: data.artist?.name,\n album: data.album?.name,\n uri: `${this.uri}/${ViewHelper.constructUriSegmentFromView(trackView)}`,\n albumart: data.thumbnail\n };\n\n if (!fakeAlbum) {\n result.duration = data.duration;\n }\n if (!data.streamUrl && addNonPlayableText) {\n result.title = UIHelper.addNonPlayableText(result.title);\n }\n\n return result;\n }\n\n renderToHeader(data: TrackEntity): RenderedHeader | null {\n return {\n service: 'bandcamp',\n uri: this.uri,\n type: 'song',\n album: data.name,\n artist: data.artist?.name,\n albumart: data.thumbnail\n };\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"TrackRenderer.js","sourceRoot":"","sources":["../../../../../../src/lib/controller/browse/view-handlers/renderers/TrackRenderer.ts"],"names":[],"mappings":";;;;;AAAA,kEAA0F;AAC1F,yEAAiD;AAGjD,+DAAuC;AAEvC,MAAqB,aAAc,SAAQ,sBAAyB;IAElE,gBAAgB,CAAC,IAAiB,EAAE,OAAO,GAAG,KAAK,EAAE,SAAS,GAAG,KAAK,EAAE,kBAAkB,GAAG,IAAI;QAC/F,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC;YACd,OAAO,IAAI,CAAC;QACd,CAAC;QAED,MAAM,SAAS,GAAc;YAC3B,IAAI,EAAE,OAAO;YACb,QAAQ,EAAE,IAAI,CAAC,GAAG;SACnB,CAAC;QACF,MAAM,MAAM,GAAqB;YAC/B,OAAO,EAAE,UAAU;YACnB,IAAI,EAAE,SAAS,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,MAAM;YACnC,KAAK,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI;YAC7D,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI;YACzB,KAAK,EAAE,IAAI,CAAC,KAAK,EAAE,IAAI;YACvB,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,oBAAU,CAAC,2BAA2B,CAAC,SAAS,CAAC,EAAE;YACvE,QAAQ,EAAE,IAAI,CAAC,SAAS;SACzB,CAAC;QAEF,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAClC,CAAC;QACD,IAAI,CAAC,IAAI,CAAC,SAAS,IAAI,kBAAkB,EAAE,CAAC;YAC1C,MAAM,CAAC,KAAK,GAAG,kBAAQ,CAAC,kBAAkB,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;QAC3D,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,cAAc,CAAC,IAAiB;QAC9B,OAAO;YACL,OAAO,EAAE,UAAU;YACnB,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,IAAI,EAAE,MAAM;YACZ,KAAK,EAAE,IAAI,CAAC,IAAI;YAChB,MAAM,EAAE,IAAI,CAAC,MAAM,EAAE,IAAI;YACzB,QAAQ,EAAE,IAAI,CAAC,SAAS;SACzB,CAAC;IACJ,CAAC;CACF;AAzCD,gCAyCC","sourcesContent":["import BaseRenderer, { type RenderedHeader, type RenderedListItem } from './BaseRenderer';\nimport UIHelper from '../../../../util/UIHelper';\nimport type TrackEntity from '../../../../entities/TrackEntity';\nimport { type TrackView } from '../TrackViewHandler';\nimport ViewHelper from '../ViewHelper';\n\nexport default class TrackRenderer extends BaseRenderer {\n\n renderToListItem(data: TrackEntity, addType = false, fakeAlbum = false, addNonPlayableText = true): RenderedListItem | null {\n if (!data.url) {\n return null;\n }\n\n const trackView: TrackView = {\n name: 'track',\n trackUrl: data.url\n };\n const result: RenderedListItem = {\n service: 'bandcamp',\n type: fakeAlbum ? 'folder' : 'song',\n title: addType ? this.addType('track', data.name) : data.name,\n artist: data.artist?.name,\n album: data.album?.name,\n uri: `${this.uri}/${ViewHelper.constructUriSegmentFromView(trackView)}`,\n albumart: data.thumbnail\n };\n\n if (!fakeAlbum) {\n result.duration = data.duration;\n }\n if (!data.streamUrl && addNonPlayableText) {\n result.title = UIHelper.addNonPlayableText(result.title);\n }\n\n return result;\n }\n\n renderToHeader(data: TrackEntity): RenderedHeader | null {\n return {\n service: 'bandcamp',\n uri: this.uri,\n type: 'song',\n album: data.name,\n artist: data.artist?.name,\n albumart: data.thumbnail\n };\n }\n}\n"]} \ No newline at end of file diff --git a/bandcamp/dist/lib/controller/browse/view-handlers/renderers/index.d.ts b/bandcamp/dist/lib/controller/browse/view-handlers/renderers/index.d.ts index 745140dce..4558e7605 100644 --- a/bandcamp/dist/lib/controller/browse/view-handlers/renderers/index.d.ts +++ b/bandcamp/dist/lib/controller/browse/view-handlers/renderers/index.d.ts @@ -1,4 +1,4 @@ -import View from '../View'; +import type View from '../View'; import AlbumRenderer from './AlbumRenderer'; import ArticleRenderer from './ArticleRenderer'; import BandRenderer from './BandRenderer'; diff --git a/bandcamp/dist/lib/controller/browse/view-handlers/renderers/index.d.ts.map b/bandcamp/dist/lib/controller/browse/view-handlers/renderers/index.d.ts.map index 68673e1b5..6f38b38d5 100644 --- a/bandcamp/dist/lib/controller/browse/view-handlers/renderers/index.d.ts.map +++ b/bandcamp/dist/lib/controller/browse/view-handlers/renderers/index.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/lib/controller/browse/view-handlers/renderers/index.ts"],"names":[],"mappings":"AAAA,OAAO,IAAI,MAAM,SAAS,CAAC;AAC3B,OAAO,aAAa,MAAM,iBAAiB,CAAC;AAC5C,OAAO,eAAe,MAAM,mBAAmB,CAAC;AAChD,OAAO,YAAY,MAAM,gBAAgB,CAAC;AAC1C,OAAO,oBAAoB,MAAM,sBAAsB,CAAC;AACxD,OAAO,YAAY,MAAM,gBAAgB,CAAC;AAC1C,OAAO,WAAW,MAAM,eAAe,CAAC;AACxC,OAAO,aAAa,MAAM,iBAAiB,CAAC;AAE5C,oBAAY,YAAY;IACtB,KAAK,UAAU;IACf,OAAO,YAAY;IACnB,IAAI,SAAS;IACb,YAAY,aAAa;IACzB,IAAI,QAAQ;IACZ,GAAG,WAAW;IACd,KAAK,SAAS;CACf;AAYD,MAAM,CAAC,OAAO,OAAO,QAAQ;IAE3B,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,YAAY,CAAC,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,GAAG,aAAa;IAClH,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,YAAY,CAAC,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,GAAG,eAAe;IACtH,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,GAAG,YAAY;IAChH,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,YAAY,CAAC,YAAY,EAAE,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,GAAG,oBAAoB;IAChI,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,GAAG,YAAY;IAChH,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,GAAG,WAAW;IAC9G,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,YAAY,CAAC,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,GAAG,aAAa;CAOnH"} \ No newline at end of file +{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../../../src/lib/controller/browse/view-handlers/renderers/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,SAAS,CAAC;AAChC,OAAO,aAAa,MAAM,iBAAiB,CAAC;AAC5C,OAAO,eAAe,MAAM,mBAAmB,CAAC;AAChD,OAAO,YAAY,MAAM,gBAAgB,CAAC;AAC1C,OAAO,oBAAoB,MAAM,sBAAsB,CAAC;AACxD,OAAO,YAAY,MAAM,gBAAgB,CAAC;AAC1C,OAAO,WAAW,MAAM,eAAe,CAAC;AACxC,OAAO,aAAa,MAAM,iBAAiB,CAAC;AAE5C,oBAAY,YAAY;IACtB,KAAK,UAAU;IACf,OAAO,YAAY;IACnB,IAAI,SAAS;IACb,YAAY,aAAa;IACzB,IAAI,QAAQ;IACZ,GAAG,WAAW;IACd,KAAK,SAAS;CACf;AAYD,MAAM,CAAC,OAAO,OAAO,QAAQ;IAE3B,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,YAAY,CAAC,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,GAAG,aAAa;IAClH,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,YAAY,CAAC,OAAO,EAAE,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,GAAG,eAAe;IACtH,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,GAAG,YAAY;IAChH,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,YAAY,CAAC,YAAY,EAAE,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,GAAG,oBAAoB;IAChI,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,YAAY,CAAC,IAAI,EAAE,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,GAAG,YAAY;IAChH,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,YAAY,CAAC,GAAG,EAAE,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,GAAG,WAAW;IAC9G,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,YAAY,CAAC,KAAK,EAAE,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,IAAI,EAAE,aAAa,EAAE,IAAI,EAAE,GAAG,aAAa;CAOnH"} \ No newline at end of file diff --git a/bandcamp/dist/lib/controller/browse/view-handlers/renderers/index.js b/bandcamp/dist/lib/controller/browse/view-handlers/renderers/index.js index 22bb98386..41a4fe9db 100644 --- a/bandcamp/dist/lib/controller/browse/view-handlers/renderers/index.js +++ b/bandcamp/dist/lib/controller/browse/view-handlers/renderers/index.js @@ -20,7 +20,7 @@ var RendererType; RendererType["Show"] = "Fan"; RendererType["Tag"] = "Search"; RendererType["Track"] = "Show"; -})(RendererType = exports.RendererType || (exports.RendererType = {})); +})(RendererType || (exports.RendererType = RendererType = {})); const RENDERER_TYPE_TO_CLASS = { [RendererType.Album]: AlbumRenderer_1.default, [RendererType.Article]: ArticleRenderer_1.default, @@ -35,7 +35,7 @@ class Renderer { if (RENDERER_TYPE_TO_CLASS[type]) { return new RENDERER_TYPE_TO_CLASS[type](uri, currentView, previousViews); } - throw Error(`Renderer not found for type ${RendererType}`); + throw Error(`Renderer not found for type ${String(type)}`); } } exports.default = Renderer; diff --git a/bandcamp/dist/lib/controller/browse/view-handlers/renderers/index.js.map b/bandcamp/dist/lib/controller/browse/view-handlers/renderers/index.js.map index 2263fcf60..87683ce9b 100644 --- a/bandcamp/dist/lib/controller/browse/view-handlers/renderers/index.js.map +++ b/bandcamp/dist/lib/controller/browse/view-handlers/renderers/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/lib/controller/browse/view-handlers/renderers/index.ts"],"names":[],"mappings":";;;;;;AACA,oEAA4C;AAC5C,wEAAgD;AAChD,kEAA0C;AAC1C,8EAAwD;AACxD,kEAA0C;AAC1C,gEAAwC;AACxC,oEAA4C;AAE5C,IAAY,YAQX;AARD,WAAY,YAAY;IACtB,+BAAe,CAAA;IACf,mCAAmB,CAAA;IACnB,6BAAa,CAAA;IACb,yCAAyB,CAAA;IACzB,4BAAY,CAAA;IACZ,8BAAc,CAAA;IACd,8BAAc,CAAA;AAChB,CAAC,EARW,YAAY,GAAZ,oBAAY,KAAZ,oBAAY,QAQvB;AAED,MAAM,sBAAsB,GAAqB;IAC/C,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,uBAAa;IACnC,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,yBAAe;IACvC,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,sBAAY;IACjC,CAAC,YAAY,CAAC,YAAY,CAAC,EAAE,4BAAoB;IACjD,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,sBAAY;IACjC,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,qBAAW;IAC/B,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,uBAAa;CACpC,CAAC;AAEF,MAAqB,QAAQ;IAS3B,MAAM,CAAC,WAAW,CAAC,IAAkB,EAAE,GAAW,EAAE,WAAiB,EAAE,aAAqB;QAC1F,IAAI,sBAAsB,CAAC,IAAI,CAAC,EAAE;YAChC,OAAO,IAAI,sBAAsB,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC;SAC1E;QACD,MAAM,KAAK,CAAC,+BAA+B,YAAY,EAAE,CAAC,CAAC;IAC7D,CAAC;CACF;AAfD,2BAeC","sourcesContent":["import View from '../View';\nimport AlbumRenderer from './AlbumRenderer';\nimport ArticleRenderer from './ArticleRenderer';\nimport BandRenderer from './BandRenderer';\nimport SearchResultRenderer from './SearchResultParser';\nimport ShowRenderer from './ShowRenderer';\nimport TagRenderer from './TagRenderer';\nimport TrackRenderer from './TrackRenderer';\n\nexport enum RendererType {\n Album = 'Album',\n Article = 'Article',\n Band = 'Band',\n SearchResult = 'Discover',\n Show = 'Fan',\n Tag = 'Search',\n Track = 'Show'\n}\n\nconst RENDERER_TYPE_TO_CLASS: Record = {\n [RendererType.Album]: AlbumRenderer,\n [RendererType.Article]: ArticleRenderer,\n [RendererType.Band]: BandRenderer,\n [RendererType.SearchResult]: SearchResultRenderer,\n [RendererType.Show]: ShowRenderer,\n [RendererType.Tag]: TagRenderer,\n [RendererType.Track]: TrackRenderer\n};\n\nexport default class Renderer {\n\n static getInstance(type: RendererType.Album, uri: string, currentView: View, previousViews: View[]): AlbumRenderer;\n static getInstance(type: RendererType.Article, uri: string, currentView: View, previousViews: View[]): ArticleRenderer;\n static getInstance(type: RendererType.Band, uri: string, currentView: View, previousViews: View[]): BandRenderer;\n static getInstance(type: RendererType.SearchResult, uri: string, currentView: View, previousViews: View[]): SearchResultRenderer;\n static getInstance(type: RendererType.Show, uri: string, currentView: View, previousViews: View[]): ShowRenderer;\n static getInstance(type: RendererType.Tag, uri: string, currentView: View, previousViews: View[]): TagRenderer;\n static getInstance(type: RendererType.Track, uri: string, currentView: View, previousViews: View[]): TrackRenderer;\n static getInstance(type: RendererType, uri: string, currentView: View, previousViews: View[]) {\n if (RENDERER_TYPE_TO_CLASS[type]) {\n return new RENDERER_TYPE_TO_CLASS[type](uri, currentView, previousViews);\n }\n throw Error(`Renderer not found for type ${RendererType}`);\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../../../src/lib/controller/browse/view-handlers/renderers/index.ts"],"names":[],"mappings":";;;;;;AACA,oEAA4C;AAC5C,wEAAgD;AAChD,kEAA0C;AAC1C,8EAAwD;AACxD,kEAA0C;AAC1C,gEAAwC;AACxC,oEAA4C;AAE5C,IAAY,YAQX;AARD,WAAY,YAAY;IACtB,+BAAe,CAAA;IACf,mCAAmB,CAAA;IACnB,6BAAa,CAAA;IACb,yCAAyB,CAAA;IACzB,4BAAY,CAAA;IACZ,8BAAc,CAAA;IACd,8BAAc,CAAA;AAChB,CAAC,EARW,YAAY,4BAAZ,YAAY,QAQvB;AAED,MAAM,sBAAsB,GAAqB;IAC/C,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,uBAAa;IACnC,CAAC,YAAY,CAAC,OAAO,CAAC,EAAE,yBAAe;IACvC,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,sBAAY;IACjC,CAAC,YAAY,CAAC,YAAY,CAAC,EAAE,4BAAoB;IACjD,CAAC,YAAY,CAAC,IAAI,CAAC,EAAE,sBAAY;IACjC,CAAC,YAAY,CAAC,GAAG,CAAC,EAAE,qBAAW;IAC/B,CAAC,YAAY,CAAC,KAAK,CAAC,EAAE,uBAAa;CACpC,CAAC;AAEF,MAAqB,QAAQ;IAS3B,MAAM,CAAC,WAAW,CAAC,IAAkB,EAAE,GAAW,EAAE,WAAiB,EAAE,aAAqB;QAC1F,IAAI,sBAAsB,CAAC,IAAI,CAAC,EAAE,CAAC;YACjC,OAAO,IAAI,sBAAsB,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,WAAW,EAAE,aAAa,CAAC,CAAC;QAC3E,CAAC;QACD,MAAM,KAAK,CAAC,+BAA+B,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC7D,CAAC;CACF;AAfD,2BAeC","sourcesContent":["import type View from '../View';\nimport AlbumRenderer from './AlbumRenderer';\nimport ArticleRenderer from './ArticleRenderer';\nimport BandRenderer from './BandRenderer';\nimport SearchResultRenderer from './SearchResultParser';\nimport ShowRenderer from './ShowRenderer';\nimport TagRenderer from './TagRenderer';\nimport TrackRenderer from './TrackRenderer';\n\nexport enum RendererType {\n Album = 'Album',\n Article = 'Article',\n Band = 'Band',\n SearchResult = 'Discover',\n Show = 'Fan',\n Tag = 'Search',\n Track = 'Show'\n}\n\nconst RENDERER_TYPE_TO_CLASS: Record = {\n [RendererType.Album]: AlbumRenderer,\n [RendererType.Article]: ArticleRenderer,\n [RendererType.Band]: BandRenderer,\n [RendererType.SearchResult]: SearchResultRenderer,\n [RendererType.Show]: ShowRenderer,\n [RendererType.Tag]: TagRenderer,\n [RendererType.Track]: TrackRenderer\n};\n\nexport default class Renderer {\n\n static getInstance(type: RendererType.Album, uri: string, currentView: View, previousViews: View[]): AlbumRenderer;\n static getInstance(type: RendererType.Article, uri: string, currentView: View, previousViews: View[]): ArticleRenderer;\n static getInstance(type: RendererType.Band, uri: string, currentView: View, previousViews: View[]): BandRenderer;\n static getInstance(type: RendererType.SearchResult, uri: string, currentView: View, previousViews: View[]): SearchResultRenderer;\n static getInstance(type: RendererType.Show, uri: string, currentView: View, previousViews: View[]): ShowRenderer;\n static getInstance(type: RendererType.Tag, uri: string, currentView: View, previousViews: View[]): TagRenderer;\n static getInstance(type: RendererType.Track, uri: string, currentView: View, previousViews: View[]): TrackRenderer;\n static getInstance(type: RendererType, uri: string, currentView: View, previousViews: View[]) {\n if (RENDERER_TYPE_TO_CLASS[type]) {\n return new RENDERER_TYPE_TO_CLASS[type](uri, currentView, previousViews);\n }\n throw Error(`Renderer not found for type ${String(type)}`);\n }\n}\n"]} \ No newline at end of file diff --git a/bandcamp/dist/lib/controller/play/PlayController.d.ts b/bandcamp/dist/lib/controller/play/PlayController.d.ts index d40f9dc6d..bac902808 100644 --- a/bandcamp/dist/lib/controller/play/PlayController.d.ts +++ b/bandcamp/dist/lib/controller/play/PlayController.d.ts @@ -1,4 +1,4 @@ -import { ExplodedTrackInfo } from '../browse/view-handlers/ExplodableViewHandler'; +import { type ExplodedTrackInfo } from '../browse/view-handlers/ExplodableViewHandler'; export default class PlayController { #private; constructor(); @@ -7,7 +7,7 @@ export default class PlayController { * - bandcamp/track@trackUrl={trackUrl}@artistUrl={...}@albumUrl={...} * - bandcamp/show@showUrl={showUrl} * - bandcamp/article@articleUrl={articleUrl}@mediaItemRef={...}@track={trackPosition}@artistUrl={...}@albumUrl={...} - * - bandcamp/album@albumUrl={...}@track={...}@artistUrl={...}@albumUrl={...} + * - bandcamp/album@albumUrl={...}@[track | trackId]={...}@artistUrl={...}@albumUrl={...} */ clearAddPlayTrack(track: ExplodedTrackInfo): Promise; stop(): any; diff --git a/bandcamp/dist/lib/controller/play/PlayController.d.ts.map b/bandcamp/dist/lib/controller/play/PlayController.d.ts.map index 07d31eebc..8700fe179 100644 --- a/bandcamp/dist/lib/controller/play/PlayController.d.ts.map +++ b/bandcamp/dist/lib/controller/play/PlayController.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"PlayController.d.ts","sourceRoot":"","sources":["../../../../src/lib/controller/play/PlayController.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,iBAAiB,EAAE,MAAM,+CAA+C,CAAC;AAalF,MAAM,CAAC,OAAO,OAAO,cAAc;;;IAUjC;;;;;;OAMG;IACG,iBAAiB,CAAC,KAAK,EAAE,iBAAiB;IAkBhD,IAAI;IAMJ,KAAK;IAML,MAAM;IAMN,IAAI,CAAC,QAAQ,EAAE,MAAM;IAMrB,IAAI;IAMJ,QAAQ;IAKR,OAAO;IAKD,QAAQ,CAAC,KAAK,EAAE,iBAAiB;CA2NxC"} \ No newline at end of file +{"version":3,"file":"PlayController.d.ts","sourceRoot":"","sources":["../../../../src/lib/controller/play/PlayController.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,KAAK,iBAAiB,EAAE,MAAM,+CAA+C,CAAC;AAavF,MAAM,CAAC,OAAO,OAAO,cAAc;;;IAUjC;;;;;;OAMG;IACG,iBAAiB,CAAC,KAAK,EAAE,iBAAiB;IAkBhD,IAAI;IAMJ,KAAK;IAML,MAAM;IAMN,IAAI,CAAC,QAAQ,EAAE,MAAM;IAMrB,IAAI;IAMJ,QAAQ;IAKR,OAAO;IAKD,QAAQ,CAAC,KAAK,EAAE,iBAAiB;CAsOxC"} \ No newline at end of file diff --git a/bandcamp/dist/lib/controller/play/PlayController.js b/bandcamp/dist/lib/controller/play/PlayController.js index 208b20eb5..f88fbd879 100644 --- a/bandcamp/dist/lib/controller/play/PlayController.js +++ b/bandcamp/dist/lib/controller/play/PlayController.js @@ -15,13 +15,23 @@ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? ( }) : function(o, v) { o["default"] = v; }); -var __importStar = (this && this.__importStar) || function (mod) { - if (mod && mod.__esModule) return mod; - var result = {}; - if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k); - __setModuleDefault(result, mod); - return result; -}; +var __importStar = (this && this.__importStar) || (function () { + var ownKeys = function(o) { + ownKeys = Object.getOwnPropertyNames || function (o) { + var ar = []; + for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k; + return ar; + }; + return ownKeys(o); + }; + return function (mod) { + if (mod && mod.__esModule) return mod; + var result = {}; + if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]); + __setModuleDefault(result, mod); + return result; + }; +})(); var __classPrivateFieldSet = (this && this.__classPrivateFieldSet) || function (receiver, state, value, kind, f) { if (kind === "m") throw new TypeError("Private method is not writable"); if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a setter"); @@ -59,7 +69,7 @@ class PlayController { * - bandcamp/track@trackUrl={trackUrl}@artistUrl={...}@albumUrl={...} * - bandcamp/show@showUrl={showUrl} * - bandcamp/article@articleUrl={articleUrl}@mediaItemRef={...}@track={trackPosition}@artistUrl={...}@albumUrl={...} - * - bandcamp/album@albumUrl={...}@track={...}@artistUrl={...}@albumUrl={...} + * - bandcamp/album@albumUrl={...}@[track | trackId]={...}@artistUrl={...}@albumUrl={...} */ async clearAddPlayTrack(track) { BandcampContext_1.default.getLogger().info(`[bandcamp-play] clearAddPlayTrack: ${track.uri}`); @@ -144,7 +154,6 @@ class PlayController { return res; } } -exports.default = PlayController; _PlayController_mpdPlugin = new WeakMap(), _PlayController_prefetchPlaybackStateFixer = new WeakMap(), _PlayController_instances = new WeakSet(), _PlayController_getStreamUrl = async function _PlayController_getStreamUrl(track, isPrefetching = false) { let streamUrl = await __classPrivateFieldGet(this, _PlayController_instances, "m", _PlayController_doGetStreamUrl).call(this, track, isPrefetching); // Ensure stream URL is valid @@ -254,19 +263,30 @@ _PlayController_mpdPlugin = new WeakMap(), _PlayController_prefetchPlaybackState throw Error(`Stream URL missing for track matching ${trackPosition ? `${trackPosition}@` : ''}${mediaItemRef} (article URL: ${articleUrl})`); } else if (trackView.name === 'album') { - const { albumUrl, track: trackPosition } = trackView; - if (!albumUrl || !trackPosition) { - throw Error('Album URL or track position not specified'); + const { albumUrl, track: trackPosition, trackId } = trackView; + if (!albumUrl || (!trackPosition && !trackId)) { + throw Error('Album URL or track position / ID not specified'); } const model = model_1.default.getInstance(model_1.ModelType.Album); const album = await model.getAlbum(albumUrl); - const albumTrack = album.tracks?.[parseInt(trackPosition, 10) - 1]; + let albumTrack; + if (trackPosition !== undefined) { + albumTrack = album.tracks?.[parseInt(trackPosition, 10) - 1]; + } + else if (trackId !== undefined) { + albumTrack = album.tracks?.find((track) => track.id !== undefined && String(track.id) === trackId); + } if (albumTrack?.streamUrl) { const safeUri = albumTrack.streamUrl.replace(/"/g, '\\"'); return safeUri; } _toast('error', BandcampContext_1.default.getI18n('BANDCAMP_ERR_STREAM_NOT_FOUND', albumTrack?.name || track.name)); - throw Error(`Track or stream URL missing at position ${trackPosition} for album URL: ${albumUrl}`); + if (trackPosition !== undefined) { + throw Error(`Track or stream URL missing at position ${trackPosition} for album URL: ${albumUrl}`); + } + if (trackId !== undefined) { + throw Error(`Track matching ID ${trackId} or its stream URL missing for album URL: ${albumUrl}`); + } } _toast('error', BandcampContext_1.default.getI18n('BANDCAMP_ERR_INVALID_PLAY_REQUEST')); throw Error(`Invalid track URI: ${track.uri}`); @@ -306,6 +326,7 @@ _PlayController_mpdPlugin = new WeakMap(), _PlayController_prefetchPlaybackState } return kew_1.default.resolve(); }; +exports.default = PlayController; /** * (Taken from YouTube Music plugin) * https://github.com/patrickkfkan/volumio-ytmusic/blob/master/src/lib/controller/play/PlayController.ts diff --git a/bandcamp/dist/lib/controller/play/PlayController.js.map b/bandcamp/dist/lib/controller/play/PlayController.js.map index 6315b7fb3..4b9e82d72 100644 --- a/bandcamp/dist/lib/controller/play/PlayController.js.map +++ b/bandcamp/dist/lib/controller/play/PlayController.js.map @@ -1 +1 @@ -{"version":3,"file":"PlayController.js","sourceRoot":"","sources":["../../../../src/lib/controller/play/PlayController.ts"],"names":[],"mappings":"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","sourcesContent":["// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nimport libQ from 'kew';\n\nimport bandcamp from '../../BandcampContext';\nimport { ExplodedTrackInfo } from '../browse/view-handlers/ExplodableViewHandler';\nimport ViewHelper from '../browse/view-handlers/ViewHelper';\nimport Model, { ModelType } from '../../model';\nimport { TrackView } from '../browse/view-handlers/TrackViewHandler';\nimport { ShowView } from '../browse/view-handlers/ShowViewHandler';\nimport { ArticleView } from '../browse/view-handlers/ArticleViewHandler';\nimport AlbumEntity from '../../entities/AlbumEntity';\nimport { ArticleEntityMediaItem } from '../../entities/ArticleEntity';\nimport TrackEntity from '../../entities/TrackEntity';\nimport { AlbumView } from '../browse/view-handlers/AlbumViewHandler';\nimport { kewToJSPromise } from '../../util';\nimport EventEmitter from 'events';\n\nexport default class PlayController {\n\n #mpdPlugin: any;\n #prefetchPlaybackStateFixer: PrefetchPlaybackStateFixer | null;\n\n constructor() {\n this.#mpdPlugin = bandcamp.getMpdPlugin();\n this.#prefetchPlaybackStateFixer = new PrefetchPlaybackStateFixer();\n }\n\n /**\n * Track uri:\n * - bandcamp/track@trackUrl={trackUrl}@artistUrl={...}@albumUrl={...}\n * - bandcamp/show@showUrl={showUrl}\n * - bandcamp/article@articleUrl={articleUrl}@mediaItemRef={...}@track={trackPosition}@artistUrl={...}@albumUrl={...}\n * - bandcamp/album@albumUrl={...}@track={...}@artistUrl={...}@albumUrl={...}\n */\n async clearAddPlayTrack(track: ExplodedTrackInfo) {\n bandcamp.getLogger().info(`[bandcamp-play] clearAddPlayTrack: ${track.uri}`);\n\n this.#prefetchPlaybackStateFixer?.notifyPrefetchCleared();\n\n let streamUrl;\n try {\n streamUrl = await this.#getStreamUrl(track);\n }\n catch (error: any) {\n bandcamp.getLogger().error(`[bandcamp-play] Error getting stream: ${error}`);\n throw error;\n }\n\n return this.#doPlay(streamUrl, track);\n }\n\n // Returns kew promise!\n stop() {\n bandcamp.getStateMachine().setConsumeUpdateService('mpd', true, false);\n return this.#mpdPlugin.stop();\n }\n\n // Returns kew promise!\n pause() {\n bandcamp.getStateMachine().setConsumeUpdateService('mpd', true, false);\n return this.#mpdPlugin.pause();\n }\n\n // Returns kew promise!\n resume() {\n bandcamp.getStateMachine().setConsumeUpdateService('mpd', true, false);\n return this.#mpdPlugin.resume();\n }\n\n // Returns kew promise!\n seek(position: number) {\n bandcamp.getStateMachine().setConsumeUpdateService('mpd', true, false);\n return this.#mpdPlugin.seek(position);\n }\n\n // Returns kew promise!\n next() {\n bandcamp.getStateMachine().setConsumeUpdateService('mpd', true, false);\n return this.#mpdPlugin.next();\n }\n\n // Returns kew promise!\n previous() {\n bandcamp.getStateMachine().setConsumeUpdateService(undefined);\n return bandcamp.getStateMachine().previous();\n }\n\n dispose() {\n this.#prefetchPlaybackStateFixer?.reset();\n this.#prefetchPlaybackStateFixer = null;\n }\n\n async prefetch(track: ExplodedTrackInfo) {\n const prefetchEnabled = bandcamp.getConfigValue('prefetch', true);\n if (!prefetchEnabled) {\n /**\n * Volumio doesn't check whether `prefetch()` is actually performed or\n * successful (such as inspecting the result of the function call) -\n * it just sets its internal state variable `prefetchDone`\n * to `true`. This results in the next track being skipped in cases\n * where prefetch is not performed or fails. So when we want to signal\n * that prefetch is not done, we would have to directly falsify the\n * statemachine's `prefetchDone` variable.\n */\n bandcamp.getLogger().info('[bandcamp-play] Prefetch disabled');\n bandcamp.getStateMachine().prefetchDone = false;\n return;\n }\n let streamUrl;\n try {\n streamUrl = await this.#getStreamUrl(track, true);\n }\n catch (error: any) {\n bandcamp.getLogger().error(`[bandcamp] Prefetch failed: ${error}`);\n bandcamp.getStateMachine().prefetchDone = false;\n return;\n }\n\n const mpdPlugin = this.#mpdPlugin;\n const res = await kewToJSPromise(mpdPlugin.sendMpdCommand(`addid \"${streamUrl}\"`, [])\n .then((addIdResp: { Id: string }) => this.#mpdAddTags(addIdResp, track))\n .then(() => {\n bandcamp.getLogger().info(`[bandcamp-play] Prefetched and added track to MPD queue: ${track.name}`);\n return mpdPlugin.sendMpdCommand('consume 1', []);\n }));\n\n this.#prefetchPlaybackStateFixer?.notifyPrefetched(track);\n\n return res;\n }\n\n async #getStreamUrl(track: ExplodedTrackInfo, isPrefetching = false): Promise {\n let streamUrl = await this.#doGetStreamUrl(track, isPrefetching);\n\n // Ensure stream URL is valid\n const ensuredUrl = await Model.ensureStreamURL(streamUrl);\n if (!ensuredUrl) {\n if (!isPrefetching) {\n bandcamp.toast('error', bandcamp.getI18n('BANDCAMP_ERR_REFRESH_STREAM', track.title));\n }\n throw Error(`Failed to refresh stream URL for ${track.title}: ${streamUrl}`);\n }\n\n // Safe\n streamUrl = ensuredUrl.replace(/\"/g, '\\\\\"');\n\n /**\n * 1. Add bitrate info to track\n * 2. Fool MPD plugin to return correct `trackType` in `parseTrackInfo()` by adding\n * track type to URL query string as a dummy param.\n */\n if (streamUrl.includes('mp3-128')) {\n track.samplerate = '128 kbps';\n streamUrl += '&t.mp3';\n }\n else if (streamUrl.includes('mp3-v0')) {\n track.samplerate = 'HQ VBR';\n streamUrl += '&t.mp3';\n }\n\n return streamUrl;\n }\n\n async #doGetStreamUrl(track: ExplodedTrackInfo, isPrefetching = false): Promise {\n\n const _toast = (type: 'error' | 'warning', msg: string) => {\n if (!isPrefetching) {\n bandcamp.toast(type, msg);\n }\n };\n\n const views = ViewHelper.getViewsFromUri(track.uri);\n let trackView = views[1];\n if (!trackView) {\n trackView = { name: '' };\n }\n if (trackView.name === 'track') {\n const { trackUrl } = trackView as TrackView;\n if (!trackUrl) {\n _toast('error', bandcamp.getI18n('BANDCAMP_ERR_INVALID_PLAY_REQUEST'));\n throw Error('Track URL not specified');\n }\n const model = Model.getInstance(ModelType.Track);\n const trackInfo = await model.getTrack(trackUrl);\n if (!trackInfo.streamUrl) {\n _toast('warning', bandcamp.getI18n('BANDCAMP_SKIP_NON_PLAYABLE_TRACK', trackInfo.name));\n if (!isPrefetching) {\n bandcamp.getStateMachine().next();\n }\n throw Error('Skipping non-playable track');\n }\n else {\n const safeUri = trackInfo.streamUrl.replace(/\"/g, '\\\\\"');\n return safeUri;\n }\n }\n else if (trackView.name === 'show') {\n const { showUrl } = trackView as ShowView;\n if (!showUrl) {\n _toast('error', bandcamp.getI18n('BANDCAMP_ERR_INVALID_PLAY_REQUEST'));\n throw Error('Show URL not specified');\n }\n const model = Model.getInstance(ModelType.Show);\n const showInfo = await model.getShow(showUrl);\n const streamUrl = showInfo.streamUrl;\n if (!streamUrl) {\n _toast('error', bandcamp.getI18n('BANDCAMP_ERR_STREAM_NOT_FOUND', showInfo.name));\n throw Error(`Stream not found for show URL: ${showUrl}`);\n }\n const safeUri = streamUrl.replace(/\"/g, '\\\\\"');\n return safeUri;\n }\n else if (trackView.name === 'article') {\n const { articleUrl, mediaItemRef, track: trackPosition } = trackView as ArticleView;\n if (!articleUrl || !mediaItemRef) {\n _toast('error', bandcamp.getI18n('BANDCAMP_ERR_INVALID_PLAY_REQUEST'));\n throw Error('Article URL, mediaItemRef or track position not specified');\n }\n const model = Model.getInstance(ModelType.Article);\n const article = await model.getArticle(articleUrl);\n const mediaItem = article.mediaItems?.find((mi) => mi.mediaItemRef === mediaItemRef);\n if (!mediaItem) {\n _toast('error', bandcamp.getI18n('BANDCAMP_ERR_STREAM_NOT_FOUND', track.name));\n throw Error(`Target mediaItemRef '${mediaItemRef}' not found for article URL: ${articleUrl}`);\n }\n let matchedTrack: TrackEntity | undefined;\n if (mediaItem.type === 'album') {\n if (!trackPosition) {\n _toast('error', bandcamp.getI18n('BANDCAMP_ERR_INVALID_PLAY_REQUEST'));\n throw Error(`Track position not specified for mediaItemRef '${mediaItemRef}' (article URL: ${articleUrl})`);\n }\n matchedTrack = (mediaItem as ArticleEntityMediaItem).tracks?.find((tr) => tr.position?.toString() === trackPosition);\n if (!matchedTrack) {\n _toast('error', bandcamp.getI18n('BANDCAMP_ERR_STREAM_NOT_FOUND', track.name));\n throw Error(`No track at position ${trackPosition} for mediaItemRef '${mediaItemRef}' (article URL: ${articleUrl})`);\n }\n }\n else {\n matchedTrack = mediaItem as ArticleEntityMediaItem;\n }\n if (matchedTrack.streamUrl) {\n const safeUri = matchedTrack.streamUrl.replace(/\"/g, '\\\\\"');\n return safeUri;\n }\n\n _toast('error', bandcamp.getI18n('BANDCAMP_ERR_STREAM_NOT_FOUND', matchedTrack.name));\n throw Error(`Stream URL missing for track matching ${trackPosition ? `${trackPosition}@` : ''}${mediaItemRef} (article URL: ${articleUrl})`);\n\n }\n else if (trackView.name === 'album') {\n const { albumUrl, track: trackPosition } = trackView as AlbumView;\n if (!albumUrl || !trackPosition) {\n throw Error('Album URL or track position not specified');\n }\n const model = Model.getInstance(ModelType.Album);\n const album = await model.getAlbum(albumUrl);\n const albumTrack = album.tracks?.[parseInt(trackPosition, 10) - 1];\n if (albumTrack?.streamUrl) {\n const safeUri = albumTrack.streamUrl.replace(/\"/g, '\\\\\"');\n return safeUri;\n }\n _toast('error', bandcamp.getI18n('BANDCAMP_ERR_STREAM_NOT_FOUND', albumTrack?.name || track.name));\n throw Error(`Track or stream URL missing at position ${trackPosition} for album URL: ${albumUrl}`);\n }\n\n _toast('error', bandcamp.getI18n('BANDCAMP_ERR_INVALID_PLAY_REQUEST'));\n throw Error(`Invalid track URI: ${track.uri}`);\n }\n\n // Returns kew promise!\n #doPlay(streamUrl: string, track: ExplodedTrackInfo) {\n const mpdPlugin = this.#mpdPlugin;\n\n return mpdPlugin.sendMpdCommand('stop', [])\n .then(() => {\n return mpdPlugin.sendMpdCommand('clear', []);\n })\n .then(() => {\n return mpdPlugin.sendMpdCommand(`addid \"${streamUrl}\"`, []);\n })\n .then((addIdResp: { Id: string }) => this.#mpdAddTags(addIdResp, track))\n .then(() => {\n bandcamp.getStateMachine().setConsumeUpdateService('mpd', true, false);\n return mpdPlugin.sendMpdCommand('play', []);\n });\n }\n\n // Returns kew promise!\n #mpdAddTags(mpdAddIdResponse: { Id: string }, track: ExplodedTrackInfo) {\n const songId = mpdAddIdResponse?.Id;\n if (songId !== undefined) {\n const cmds = [];\n cmds.push({\n command: 'addtagid',\n parameters: [ songId, 'title', track.title ]\n });\n if (track.album) {\n cmds.push({\n command: 'addtagid',\n parameters: [ songId, 'album', track.album ]\n });\n }\n cmds.push({\n command: 'addtagid',\n parameters: [ songId, 'artist', track.artist ]\n });\n\n return this.#mpdPlugin.sendMpdCommandArray(cmds);\n }\n return libQ.resolve();\n }\n}\n\n/**\n * (Taken from YouTube Music plugin)\n * https://github.com/patrickkfkan/volumio-ytmusic/blob/master/src/lib/controller/play/PlayController.ts\n *\n * Given state is updated by calling `setConsumeUpdateService('mpd', true)` (`consumeIgnoreMetadata`: true), when moving to\n * prefetched track there's no guarantee the state machine will store the correct consume state obtained from MPD. It depends on\n * whether the state machine increments `currentPosition` before or after MPD calls `pushState()`. The intended\n * order is 'before' - but because the increment is triggered through a timer, it is possible that MPD calls `pushState()` first,\n * thereby causing the state machine to store the wrong state info (title, artist, album...obtained from trackBlock at\n * `currentPosition` which has not yet been incremented).\n *\n * See state machine `syncState()` and `increasePlaybackTimer()`.\n *\n * `PrefetchPlaybackStateFixer` checks whether the state is consistent when prefetched track is played and `currentPosition` updated\n * and triggers an MPD `pushState()` if necessary.\n */\nclass PrefetchPlaybackStateFixer extends EventEmitter {\n\n #positionAtPrefetch: number;\n #prefetchedTrack: ExplodedTrackInfo | null;\n #volumioPushStateListener: ((state: any) => void) | null;\n\n constructor() {\n super();\n this.#positionAtPrefetch = -1;\n this.#prefetchedTrack = null;\n }\n\n reset() {\n this.#removePushStateListener();\n this.removeAllListeners();\n }\n\n notifyPrefetched(track: ExplodedTrackInfo) {\n this.#positionAtPrefetch = bandcamp.getStateMachine().currentPosition;\n this.#prefetchedTrack = track;\n this.#addPushStateListener();\n }\n\n notifyPrefetchCleared() {\n this.#removePushStateListener();\n }\n\n #addPushStateListener() {\n if (!this.#volumioPushStateListener) {\n this.#volumioPushStateListener = this.#handleVolumioPushState.bind(this);\n bandcamp.volumioCoreCommand?.addCallback('volumioPushState', this.#volumioPushStateListener);\n }\n }\n\n #removePushStateListener() {\n if (this.#volumioPushStateListener) {\n const listeners = bandcamp.volumioCoreCommand?.callbacks?.['volumioPushState'] || [];\n const index = listeners.indexOf(this.#volumioPushStateListener);\n if (index >= 0) {\n bandcamp.volumioCoreCommand.callbacks['volumioPushState'].splice(index, 1);\n }\n this.#volumioPushStateListener = null;\n this.#positionAtPrefetch = -1;\n this.#prefetchedTrack = null;\n }\n }\n\n #handleVolumioPushState(state: any) {\n const sm = bandcamp.getStateMachine();\n const currentPosition = sm.currentPosition as number;\n if (sm.getState().service !== 'bandcamp') {\n this.#removePushStateListener();\n return;\n }\n if (this.#positionAtPrefetch >= 0 && this.#positionAtPrefetch !== currentPosition) {\n const track = sm.getTrack(currentPosition);\n const pf = this.#prefetchedTrack;\n this.#removePushStateListener();\n if (track && state && pf && track.service === 'bandcamp' && pf.uri === track.uri) {\n if (state.uri !== track.uri) {\n const mpdPlugin = bandcamp.getMpdPlugin();\n mpdPlugin.getState().then((st: any) => mpdPlugin.pushState(st));\n }\n this.emit('playPrefetch', {\n track: pf,\n position: currentPosition\n });\n }\n }\n }\n\n emit(event: 'playPrefetch', info: { track: ExplodedTrackInfo; position: number; }): boolean;\n emit(event: string | symbol, ...args: any[]): boolean {\n return super.emit(event, ...args);\n }\n\n on(event: 'playPrefetch', listener: (info: { track: ExplodedTrackInfo; position: number; }) => void): this;\n on(event: string | symbol, listener: (...args: any[]) => void): this {\n super.on(event, listener);\n return this;\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"PlayController.js","sourceRoot":"","sources":["../../../../src/lib/controller/play/PlayController.ts"],"names":[],"mappings":"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","sourcesContent":["// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nimport libQ from 'kew';\n\nimport bandcamp from '../../BandcampContext';\nimport { type ExplodedTrackInfo } from '../browse/view-handlers/ExplodableViewHandler';\nimport ViewHelper from '../browse/view-handlers/ViewHelper';\nimport Model, { ModelType } from '../../model';\nimport { type TrackView } from '../browse/view-handlers/TrackViewHandler';\nimport { type ShowView } from '../browse/view-handlers/ShowViewHandler';\nimport { type ArticleView } from '../browse/view-handlers/ArticleViewHandler';\nimport type AlbumEntity from '../../entities/AlbumEntity';\nimport { type ArticleEntityMediaItem } from '../../entities/ArticleEntity';\nimport type TrackEntity from '../../entities/TrackEntity';\nimport { type AlbumView } from '../browse/view-handlers/AlbumViewHandler';\nimport { kewToJSPromise } from '../../util';\nimport EventEmitter from 'events';\n\nexport default class PlayController {\n\n #mpdPlugin: any;\n #prefetchPlaybackStateFixer: PrefetchPlaybackStateFixer | null;\n\n constructor() {\n this.#mpdPlugin = bandcamp.getMpdPlugin();\n this.#prefetchPlaybackStateFixer = new PrefetchPlaybackStateFixer();\n }\n\n /**\n * Track uri:\n * - bandcamp/track@trackUrl={trackUrl}@artistUrl={...}@albumUrl={...}\n * - bandcamp/show@showUrl={showUrl}\n * - bandcamp/article@articleUrl={articleUrl}@mediaItemRef={...}@track={trackPosition}@artistUrl={...}@albumUrl={...}\n * - bandcamp/album@albumUrl={...}@[track | trackId]={...}@artistUrl={...}@albumUrl={...}\n */\n async clearAddPlayTrack(track: ExplodedTrackInfo) {\n bandcamp.getLogger().info(`[bandcamp-play] clearAddPlayTrack: ${track.uri}`);\n\n this.#prefetchPlaybackStateFixer?.notifyPrefetchCleared();\n\n let streamUrl;\n try {\n streamUrl = await this.#getStreamUrl(track);\n }\n catch (error: any) {\n bandcamp.getLogger().error(`[bandcamp-play] Error getting stream: ${error}`);\n throw error;\n }\n\n return this.#doPlay(streamUrl, track);\n }\n\n // Returns kew promise!\n stop() {\n bandcamp.getStateMachine().setConsumeUpdateService('mpd', true, false);\n return this.#mpdPlugin.stop();\n }\n\n // Returns kew promise!\n pause() {\n bandcamp.getStateMachine().setConsumeUpdateService('mpd', true, false);\n return this.#mpdPlugin.pause();\n }\n\n // Returns kew promise!\n resume() {\n bandcamp.getStateMachine().setConsumeUpdateService('mpd', true, false);\n return this.#mpdPlugin.resume();\n }\n\n // Returns kew promise!\n seek(position: number) {\n bandcamp.getStateMachine().setConsumeUpdateService('mpd', true, false);\n return this.#mpdPlugin.seek(position);\n }\n\n // Returns kew promise!\n next() {\n bandcamp.getStateMachine().setConsumeUpdateService('mpd', true, false);\n return this.#mpdPlugin.next();\n }\n\n // Returns kew promise!\n previous() {\n bandcamp.getStateMachine().setConsumeUpdateService(undefined);\n return bandcamp.getStateMachine().previous();\n }\n\n dispose() {\n this.#prefetchPlaybackStateFixer?.reset();\n this.#prefetchPlaybackStateFixer = null;\n }\n\n async prefetch(track: ExplodedTrackInfo) {\n const prefetchEnabled = bandcamp.getConfigValue('prefetch', true);\n if (!prefetchEnabled) {\n /**\n * Volumio doesn't check whether `prefetch()` is actually performed or\n * successful (such as inspecting the result of the function call) -\n * it just sets its internal state variable `prefetchDone`\n * to `true`. This results in the next track being skipped in cases\n * where prefetch is not performed or fails. So when we want to signal\n * that prefetch is not done, we would have to directly falsify the\n * statemachine's `prefetchDone` variable.\n */\n bandcamp.getLogger().info('[bandcamp-play] Prefetch disabled');\n bandcamp.getStateMachine().prefetchDone = false;\n return;\n }\n let streamUrl;\n try {\n streamUrl = await this.#getStreamUrl(track, true);\n }\n catch (error: any) {\n bandcamp.getLogger().error(`[bandcamp] Prefetch failed: ${error}`);\n bandcamp.getStateMachine().prefetchDone = false;\n return;\n }\n\n const mpdPlugin = this.#mpdPlugin;\n const res = await kewToJSPromise(mpdPlugin.sendMpdCommand(`addid \"${streamUrl}\"`, [])\n .then((addIdResp: { Id: string }) => this.#mpdAddTags(addIdResp, track))\n .then(() => {\n bandcamp.getLogger().info(`[bandcamp-play] Prefetched and added track to MPD queue: ${track.name}`);\n return mpdPlugin.sendMpdCommand('consume 1', []);\n }));\n\n this.#prefetchPlaybackStateFixer?.notifyPrefetched(track);\n\n return res;\n }\n\n async #getStreamUrl(track: ExplodedTrackInfo, isPrefetching = false): Promise {\n let streamUrl = await this.#doGetStreamUrl(track, isPrefetching);\n\n // Ensure stream URL is valid\n const ensuredUrl = await Model.ensureStreamURL(streamUrl);\n if (!ensuredUrl) {\n if (!isPrefetching) {\n bandcamp.toast('error', bandcamp.getI18n('BANDCAMP_ERR_REFRESH_STREAM', track.title));\n }\n throw Error(`Failed to refresh stream URL for ${track.title}: ${streamUrl}`);\n }\n\n // Safe\n streamUrl = ensuredUrl.replace(/\"/g, '\\\\\"');\n\n /**\n * 1. Add bitrate info to track\n * 2. Fool MPD plugin to return correct `trackType` in `parseTrackInfo()` by adding\n * track type to URL query string as a dummy param.\n */\n if (streamUrl.includes('mp3-128')) {\n track.samplerate = '128 kbps';\n streamUrl += '&t.mp3';\n }\n else if (streamUrl.includes('mp3-v0')) {\n track.samplerate = 'HQ VBR';\n streamUrl += '&t.mp3';\n }\n\n return streamUrl;\n }\n\n async #doGetStreamUrl(track: ExplodedTrackInfo, isPrefetching = false): Promise {\n\n const _toast = (type: 'error' | 'warning', msg: string) => {\n if (!isPrefetching) {\n bandcamp.toast(type, msg);\n }\n };\n\n const views = ViewHelper.getViewsFromUri(track.uri);\n let trackView = views[1];\n if (!trackView) {\n trackView = { name: '' };\n }\n if (trackView.name === 'track') {\n const { trackUrl } = trackView as TrackView;\n if (!trackUrl) {\n _toast('error', bandcamp.getI18n('BANDCAMP_ERR_INVALID_PLAY_REQUEST'));\n throw Error('Track URL not specified');\n }\n const model = Model.getInstance(ModelType.Track);\n const trackInfo = await model.getTrack(trackUrl);\n if (!trackInfo.streamUrl) {\n _toast('warning', bandcamp.getI18n('BANDCAMP_SKIP_NON_PLAYABLE_TRACK', trackInfo.name));\n if (!isPrefetching) {\n bandcamp.getStateMachine().next();\n }\n throw Error('Skipping non-playable track');\n }\n else {\n const safeUri = trackInfo.streamUrl.replace(/\"/g, '\\\\\"');\n return safeUri;\n }\n }\n else if (trackView.name === 'show') {\n const { showUrl } = trackView as ShowView;\n if (!showUrl) {\n _toast('error', bandcamp.getI18n('BANDCAMP_ERR_INVALID_PLAY_REQUEST'));\n throw Error('Show URL not specified');\n }\n const model = Model.getInstance(ModelType.Show);\n const showInfo = await model.getShow(showUrl);\n const streamUrl = showInfo.streamUrl;\n if (!streamUrl) {\n _toast('error', bandcamp.getI18n('BANDCAMP_ERR_STREAM_NOT_FOUND', showInfo.name));\n throw Error(`Stream not found for show URL: ${showUrl}`);\n }\n const safeUri = streamUrl.replace(/\"/g, '\\\\\"');\n return safeUri;\n }\n else if (trackView.name === 'article') {\n const { articleUrl, mediaItemRef, track: trackPosition } = trackView as ArticleView;\n if (!articleUrl || !mediaItemRef) {\n _toast('error', bandcamp.getI18n('BANDCAMP_ERR_INVALID_PLAY_REQUEST'));\n throw Error('Article URL, mediaItemRef or track position not specified');\n }\n const model = Model.getInstance(ModelType.Article);\n const article = await model.getArticle(articleUrl);\n const mediaItem = article.mediaItems?.find((mi) => mi.mediaItemRef === mediaItemRef);\n if (!mediaItem) {\n _toast('error', bandcamp.getI18n('BANDCAMP_ERR_STREAM_NOT_FOUND', track.name));\n throw Error(`Target mediaItemRef '${mediaItemRef}' not found for article URL: ${articleUrl}`);\n }\n let matchedTrack: TrackEntity | undefined;\n if (mediaItem.type === 'album') {\n if (!trackPosition) {\n _toast('error', bandcamp.getI18n('BANDCAMP_ERR_INVALID_PLAY_REQUEST'));\n throw Error(`Track position not specified for mediaItemRef '${mediaItemRef}' (article URL: ${articleUrl})`);\n }\n matchedTrack = (mediaItem as ArticleEntityMediaItem).tracks?.find((tr) => tr.position?.toString() === trackPosition);\n if (!matchedTrack) {\n _toast('error', bandcamp.getI18n('BANDCAMP_ERR_STREAM_NOT_FOUND', track.name));\n throw Error(`No track at position ${trackPosition} for mediaItemRef '${mediaItemRef}' (article URL: ${articleUrl})`);\n }\n }\n else {\n matchedTrack = mediaItem as ArticleEntityMediaItem;\n }\n if (matchedTrack.streamUrl) {\n const safeUri = matchedTrack.streamUrl.replace(/\"/g, '\\\\\"');\n return safeUri;\n }\n\n _toast('error', bandcamp.getI18n('BANDCAMP_ERR_STREAM_NOT_FOUND', matchedTrack.name));\n throw Error(`Stream URL missing for track matching ${trackPosition ? `${trackPosition}@` : ''}${mediaItemRef} (article URL: ${articleUrl})`);\n\n }\n else if (trackView.name === 'album') {\n const { albumUrl, track: trackPosition, trackId } = trackView as AlbumView;\n if (!albumUrl || (!trackPosition && !trackId)) {\n throw Error('Album URL or track position / ID not specified');\n }\n const model = Model.getInstance(ModelType.Album);\n const album = await model.getAlbum(albumUrl);\n let albumTrack;\n if (trackPosition !== undefined) {\n albumTrack = album.tracks?.[parseInt(trackPosition, 10) - 1];\n }\n else if (trackId !== undefined) {\n albumTrack = album.tracks?.find((track) => track.id !== undefined && String(track.id) === trackId);\n }\n if (albumTrack?.streamUrl) {\n const safeUri = albumTrack.streamUrl.replace(/\"/g, '\\\\\"');\n return safeUri;\n }\n _toast('error', bandcamp.getI18n('BANDCAMP_ERR_STREAM_NOT_FOUND', albumTrack?.name || track.name));\n if (trackPosition !== undefined) {\n throw Error(`Track or stream URL missing at position ${trackPosition} for album URL: ${albumUrl}`);\n }\n if (trackId !== undefined) {\n throw Error(`Track matching ID ${trackId} or its stream URL missing for album URL: ${albumUrl}`);\n }\n }\n\n _toast('error', bandcamp.getI18n('BANDCAMP_ERR_INVALID_PLAY_REQUEST'));\n throw Error(`Invalid track URI: ${track.uri}`);\n }\n\n // Returns kew promise!\n #doPlay(streamUrl: string, track: ExplodedTrackInfo) {\n const mpdPlugin = this.#mpdPlugin;\n\n return mpdPlugin.sendMpdCommand('stop', [])\n .then(() => {\n return mpdPlugin.sendMpdCommand('clear', []);\n })\n .then(() => {\n return mpdPlugin.sendMpdCommand(`addid \"${streamUrl}\"`, []);\n })\n .then((addIdResp: { Id: string }) => this.#mpdAddTags(addIdResp, track))\n .then(() => {\n bandcamp.getStateMachine().setConsumeUpdateService('mpd', true, false);\n return mpdPlugin.sendMpdCommand('play', []);\n });\n }\n\n // Returns kew promise!\n #mpdAddTags(mpdAddIdResponse: { Id: string }, track: ExplodedTrackInfo) {\n const songId = mpdAddIdResponse?.Id;\n if (songId !== undefined) {\n const cmds = [];\n cmds.push({\n command: 'addtagid',\n parameters: [ songId, 'title', track.title ]\n });\n if (track.album) {\n cmds.push({\n command: 'addtagid',\n parameters: [ songId, 'album', track.album ]\n });\n }\n cmds.push({\n command: 'addtagid',\n parameters: [ songId, 'artist', track.artist ]\n });\n\n return this.#mpdPlugin.sendMpdCommandArray(cmds);\n }\n return libQ.resolve();\n }\n}\n\n/**\n * (Taken from YouTube Music plugin)\n * https://github.com/patrickkfkan/volumio-ytmusic/blob/master/src/lib/controller/play/PlayController.ts\n *\n * Given state is updated by calling `setConsumeUpdateService('mpd', true)` (`consumeIgnoreMetadata`: true), when moving to\n * prefetched track there's no guarantee the state machine will store the correct consume state obtained from MPD. It depends on\n * whether the state machine increments `currentPosition` before or after MPD calls `pushState()`. The intended\n * order is 'before' - but because the increment is triggered through a timer, it is possible that MPD calls `pushState()` first,\n * thereby causing the state machine to store the wrong state info (title, artist, album...obtained from trackBlock at\n * `currentPosition` which has not yet been incremented).\n *\n * See state machine `syncState()` and `increasePlaybackTimer()`.\n *\n * `PrefetchPlaybackStateFixer` checks whether the state is consistent when prefetched track is played and `currentPosition` updated\n * and triggers an MPD `pushState()` if necessary.\n */\nclass PrefetchPlaybackStateFixer extends EventEmitter {\n\n #positionAtPrefetch: number;\n #prefetchedTrack: ExplodedTrackInfo | null;\n #volumioPushStateListener: ((state: any) => void) | null;\n\n constructor() {\n super();\n this.#positionAtPrefetch = -1;\n this.#prefetchedTrack = null;\n }\n\n reset() {\n this.#removePushStateListener();\n this.removeAllListeners();\n }\n\n notifyPrefetched(track: ExplodedTrackInfo) {\n this.#positionAtPrefetch = bandcamp.getStateMachine().currentPosition;\n this.#prefetchedTrack = track;\n this.#addPushStateListener();\n }\n\n notifyPrefetchCleared() {\n this.#removePushStateListener();\n }\n\n #addPushStateListener() {\n if (!this.#volumioPushStateListener) {\n this.#volumioPushStateListener = this.#handleVolumioPushState.bind(this);\n bandcamp.volumioCoreCommand?.addCallback('volumioPushState', this.#volumioPushStateListener);\n }\n }\n\n #removePushStateListener() {\n if (this.#volumioPushStateListener) {\n const listeners = bandcamp.volumioCoreCommand?.callbacks?.['volumioPushState'] || [];\n const index = listeners.indexOf(this.#volumioPushStateListener);\n if (index >= 0) {\n bandcamp.volumioCoreCommand.callbacks['volumioPushState'].splice(index, 1);\n }\n this.#volumioPushStateListener = null;\n this.#positionAtPrefetch = -1;\n this.#prefetchedTrack = null;\n }\n }\n\n #handleVolumioPushState(state: any) {\n const sm = bandcamp.getStateMachine();\n const currentPosition = sm.currentPosition as number;\n if (sm.getState().service !== 'bandcamp') {\n this.#removePushStateListener();\n return;\n }\n if (this.#positionAtPrefetch >= 0 && this.#positionAtPrefetch !== currentPosition) {\n const track = sm.getTrack(currentPosition);\n const pf = this.#prefetchedTrack;\n this.#removePushStateListener();\n if (track && state && pf && track.service === 'bandcamp' && pf.uri === track.uri) {\n if (state.uri !== track.uri) {\n const mpdPlugin = bandcamp.getMpdPlugin();\n mpdPlugin.getState().then((st: any) => mpdPlugin.pushState(st));\n }\n this.emit('playPrefetch', {\n track: pf,\n position: currentPosition\n });\n }\n }\n }\n\n emit(event: 'playPrefetch', info: { track: ExplodedTrackInfo; position: number; }): boolean;\n emit(event: string | symbol, ...args: any[]): boolean {\n return super.emit(event, ...args);\n }\n\n on(event: 'playPrefetch', listener: (info: { track: ExplodedTrackInfo; position: number; }) => void): this;\n on(event: string | symbol, listener: (...args: any[]) => void): this {\n super.on(event, listener);\n return this;\n }\n}\n"]} \ No newline at end of file diff --git a/bandcamp/dist/lib/controller/search/SearchController.d.ts b/bandcamp/dist/lib/controller/search/SearchController.d.ts index 060dc1054..830711970 100644 --- a/bandcamp/dist/lib/controller/search/SearchController.d.ts +++ b/bandcamp/dist/lib/controller/search/SearchController.d.ts @@ -1,4 +1,4 @@ -import { RenderedList } from '../browse/view-handlers/ViewHandler'; +import { type RenderedList } from '../browse/view-handlers/ViewHandler'; export interface SearchQuery { value: string; } diff --git a/bandcamp/dist/lib/controller/search/SearchController.d.ts.map b/bandcamp/dist/lib/controller/search/SearchController.d.ts.map index 922109efb..c17136e08 100644 --- a/bandcamp/dist/lib/controller/search/SearchController.d.ts.map +++ b/bandcamp/dist/lib/controller/search/SearchController.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"SearchController.d.ts","sourceRoot":"","sources":["../../../../src/lib/controller/search/SearchController.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,YAAY,EAAE,MAAM,qCAAqC,CAAC;AAInE,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,CAAC,OAAO,OAAO,gBAAgB;IAE7B,MAAM,CAAC,KAAK,EAAE,WAAW;CAiChC"} \ No newline at end of file +{"version":3,"file":"SearchController.d.ts","sourceRoot":"","sources":["../../../../src/lib/controller/search/SearchController.ts"],"names":[],"mappings":"AAGA,OAAO,EAAE,KAAK,YAAY,EAAE,MAAM,qCAAqC,CAAC;AAIxE,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,CAAC,OAAO,OAAO,gBAAgB;IAE7B,MAAM,CAAC,KAAK,EAAE,WAAW;CAiChC"} \ No newline at end of file diff --git a/bandcamp/dist/lib/controller/search/SearchController.js.map b/bandcamp/dist/lib/controller/search/SearchController.js.map index febe1b995..10c0d5943 100644 --- a/bandcamp/dist/lib/controller/search/SearchController.js.map +++ b/bandcamp/dist/lib/controller/search/SearchController.js.map @@ -1 +1 @@ -{"version":3,"file":"SearchController.js","sourceRoot":"","sources":["../../../../src/lib/controller/search/SearchController.ts"],"names":[],"mappings":";;;;;AAAA,4EAA6C;AAC7C,yDAAyD;AAGzD,oGAA4E;AAC5E,oFAA4D;AAM5D,MAAqB,gBAAgB;IAEnC,KAAK,CAAC,MAAM,CAAC,KAAkB;QAC7B,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACnD,MAAM,UAAU,GAAe;YAC7B,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,SAAS;SACjB,CAAC;QAEF,MAAM,cAAc,GAAG,EAAE,CAAC;QAC1B,IAAI,yBAAQ,CAAC,cAAc,CAAC,kBAAkB,EAAE,IAAI,CAAC,EAAE;YACrD,CAAE,4BAAc,CAAC,gBAAgB,EAAE,4BAAc,CAAC,MAAM,EAAE,4BAAc,CAAC,MAAM,CAAE,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;gBACrG,MAAM,gBAAgB,GAAe;oBACnC,GAAG,UAAU;oBACb,QAAQ;iBACT,CAAC;gBACF,MAAM,OAAO,GAAG,4BAAkB,CAAC,UAAU,CAAC,YAAY,oBAAU,CAAC,2BAA2B,CAAC,gBAAgB,CAAC,mBAAmB,CAAC,CAAC;gBACvI,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;YACxC,CAAC,CAAC,CAAC;SACJ;aACI;YACH,MAAM,OAAO,GAAG,4BAAkB,CAAC,UAAU,CAAC,YAAY,oBAAU,CAAC,2BAA2B,CAAC,UAAU,CAAC,mBAAmB,CAAC,CAAC;YACjI,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;SACvC;QAED,MAAM,iBAAiB,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QAC5D,MAAM,QAAQ,GAAG,iBAAiB,CAAC,MAAM,CAAiB,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE;YACzE,IAAI,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE;gBAC1B,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;aAC/E;YACD,OAAO,MAAM,CAAC;QAChB,CAAC,EAAE,EAAE,CAAC,CAAC;QAEP,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF;AAnCD,mCAmCC","sourcesContent":["import bandcamp from '../../BandcampContext';\nimport { SearchItemType } from '../../model/SearchModel';\nimport { SearchView } from '../browse/view-handlers/SearchViewHandler';\nimport { RenderedList } from '../browse/view-handlers/ViewHandler';\nimport ViewHandlerFactory from '../browse/view-handlers/ViewHandlerFactory';\nimport ViewHelper from '../browse/view-handlers/ViewHelper';\n\nexport interface SearchQuery {\n value: string;\n}\n\nexport default class SearchController {\n\n async search(query: SearchQuery) {\n const safeQuery = query.value.replace(/\"/g, '\\\\\"');\n const searchView: SearchView = {\n name: 'search',\n query: safeQuery\n };\n\n const browsePromises = [];\n if (bandcamp.getConfigValue('searchByItemType', true)) {\n [ SearchItemType.ArtistsAndLabels, SearchItemType.Albums, SearchItemType.Tracks ].forEach((itemType) => {\n const searchByTypeView: SearchView = {\n ...searchView,\n itemType\n };\n const handler = ViewHandlerFactory.getHandler(`bandcamp/${ViewHelper.constructUriSegmentFromView(searchByTypeView)}@combinedSearch=1`);\n browsePromises.push(handler.browse());\n });\n }\n else {\n const handler = ViewHandlerFactory.getHandler(`bandcamp/${ViewHelper.constructUriSegmentFromView(searchView)}@combinedSearch=1`);\n browsePromises.push(handler.browse());\n }\n\n const searchResultPages = await Promise.all(browsePromises);\n const allLists = searchResultPages.reduce((result, page) => {\n if (page.navigation?.lists) {\n result.push(...page.navigation.lists.filter((list) => list.items.length > 0));\n }\n return result;\n }, []);\n\n return allLists;\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"SearchController.js","sourceRoot":"","sources":["../../../../src/lib/controller/search/SearchController.ts"],"names":[],"mappings":";;;;;AAAA,4EAA6C;AAC7C,yDAAyD;AAGzD,oGAA4E;AAC5E,oFAA4D;AAM5D,MAAqB,gBAAgB;IAEnC,KAAK,CAAC,MAAM,CAAC,KAAkB;QAC7B,MAAM,SAAS,GAAG,KAAK,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,KAAK,CAAC,CAAC;QACnD,MAAM,UAAU,GAAe;YAC7B,IAAI,EAAE,QAAQ;YACd,KAAK,EAAE,SAAS;SACjB,CAAC;QAEF,MAAM,cAAc,GAAG,EAAE,CAAC;QAC1B,IAAI,yBAAQ,CAAC,cAAc,CAAC,kBAAkB,EAAE,IAAI,CAAC,EAAE,CAAC;YACtD,CAAE,4BAAc,CAAC,gBAAgB,EAAE,4BAAc,CAAC,MAAM,EAAE,4BAAc,CAAC,MAAM,CAAE,CAAC,OAAO,CAAC,CAAC,QAAQ,EAAE,EAAE;gBACrG,MAAM,gBAAgB,GAAe;oBACnC,GAAG,UAAU;oBACb,QAAQ;iBACT,CAAC;gBACF,MAAM,OAAO,GAAG,4BAAkB,CAAC,UAAU,CAAC,YAAY,oBAAU,CAAC,2BAA2B,CAAC,gBAAgB,CAAC,mBAAmB,CAAC,CAAC;gBACvI,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;YACxC,CAAC,CAAC,CAAC;QACL,CAAC;aACI,CAAC;YACJ,MAAM,OAAO,GAAG,4BAAkB,CAAC,UAAU,CAAC,YAAY,oBAAU,CAAC,2BAA2B,CAAC,UAAU,CAAC,mBAAmB,CAAC,CAAC;YACjI,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,MAAM,EAAE,CAAC,CAAC;QACxC,CAAC;QAED,MAAM,iBAAiB,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC,cAAc,CAAC,CAAC;QAC5D,MAAM,QAAQ,GAAG,iBAAiB,CAAC,MAAM,CAAiB,CAAC,MAAM,EAAE,IAAI,EAAE,EAAE;YACzE,IAAI,IAAI,CAAC,UAAU,EAAE,KAAK,EAAE,CAAC;gBAC3B,MAAM,CAAC,IAAI,CAAC,GAAG,IAAI,CAAC,UAAU,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC;YAChF,CAAC;YACD,OAAO,MAAM,CAAC;QAChB,CAAC,EAAE,EAAE,CAAC,CAAC;QAEP,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF;AAnCD,mCAmCC","sourcesContent":["import bandcamp from '../../BandcampContext';\nimport { SearchItemType } from '../../model/SearchModel';\nimport { type SearchView } from '../browse/view-handlers/SearchViewHandler';\nimport { type RenderedList } from '../browse/view-handlers/ViewHandler';\nimport ViewHandlerFactory from '../browse/view-handlers/ViewHandlerFactory';\nimport ViewHelper from '../browse/view-handlers/ViewHelper';\n\nexport interface SearchQuery {\n value: string;\n}\n\nexport default class SearchController {\n\n async search(query: SearchQuery) {\n const safeQuery = query.value.replace(/\"/g, '\\\\\"');\n const searchView: SearchView = {\n name: 'search',\n query: safeQuery\n };\n\n const browsePromises = [];\n if (bandcamp.getConfigValue('searchByItemType', true)) {\n [ SearchItemType.ArtistsAndLabels, SearchItemType.Albums, SearchItemType.Tracks ].forEach((itemType) => {\n const searchByTypeView: SearchView = {\n ...searchView,\n itemType\n };\n const handler = ViewHandlerFactory.getHandler(`bandcamp/${ViewHelper.constructUriSegmentFromView(searchByTypeView)}@combinedSearch=1`);\n browsePromises.push(handler.browse());\n });\n }\n else {\n const handler = ViewHandlerFactory.getHandler(`bandcamp/${ViewHelper.constructUriSegmentFromView(searchView)}@combinedSearch=1`);\n browsePromises.push(handler.browse());\n }\n\n const searchResultPages = await Promise.all(browsePromises);\n const allLists = searchResultPages.reduce((result, page) => {\n if (page.navigation?.lists) {\n result.push(...page.navigation.lists.filter((list) => list.items.length > 0));\n }\n return result;\n }, []);\n\n return allLists;\n }\n}\n"]} \ No newline at end of file diff --git a/bandcamp/dist/lib/entities/AlbumEntity.d.ts b/bandcamp/dist/lib/entities/AlbumEntity.d.ts index d009932dd..2175d6df2 100644 --- a/bandcamp/dist/lib/entities/AlbumEntity.d.ts +++ b/bandcamp/dist/lib/entities/AlbumEntity.d.ts @@ -1,5 +1,5 @@ -import ArtistEntity from './ArtistEntity'; -import TrackEntity from './TrackEntity'; +import type ArtistEntity from './ArtistEntity'; +import type TrackEntity from './TrackEntity'; interface AlbumEntity { type: 'album'; name: string; diff --git a/bandcamp/dist/lib/entities/AlbumEntity.d.ts.map b/bandcamp/dist/lib/entities/AlbumEntity.d.ts.map index 93afb90e0..070f60879 100644 --- a/bandcamp/dist/lib/entities/AlbumEntity.d.ts.map +++ b/bandcamp/dist/lib/entities/AlbumEntity.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"AlbumEntity.d.ts","sourceRoot":"","sources":["../../../src/lib/entities/AlbumEntity.ts"],"names":[],"mappings":"AAAA,OAAO,YAAY,MAAM,gBAAgB,CAAC;AAC1C,OAAO,WAAW,MAAM,eAAe,CAAC;AAExC,UAAU,WAAW;IACnB,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,MAAM,CAAC,EAAE,WAAW,EAAE,CAAC;IACvB,aAAa,CAAC,EAAE,WAAW,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,eAAe,WAAW,CAAC"} \ No newline at end of file +{"version":3,"file":"AlbumEntity.d.ts","sourceRoot":"","sources":["../../../src/lib/entities/AlbumEntity.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,YAAY,MAAM,gBAAgB,CAAC;AAC/C,OAAO,KAAK,WAAW,MAAM,eAAe,CAAC;AAE7C,UAAU,WAAW;IACnB,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,MAAM,CAAC,EAAE,WAAW,EAAE,CAAC;IACvB,aAAa,CAAC,EAAE,WAAW,CAAC;IAC5B,WAAW,CAAC,EAAE,MAAM,CAAC;CACtB;AAED,eAAe,WAAW,CAAC"} \ No newline at end of file diff --git a/bandcamp/dist/lib/entities/AlbumEntity.js.map b/bandcamp/dist/lib/entities/AlbumEntity.js.map index 72a631ca6..52d7ddd27 100644 --- a/bandcamp/dist/lib/entities/AlbumEntity.js.map +++ b/bandcamp/dist/lib/entities/AlbumEntity.js.map @@ -1 +1 @@ -{"version":3,"file":"AlbumEntity.js","sourceRoot":"","sources":["../../../src/lib/entities/AlbumEntity.ts"],"names":[],"mappings":"","sourcesContent":["import ArtistEntity from './ArtistEntity';\nimport TrackEntity from './TrackEntity';\n\ninterface AlbumEntity {\n type: 'album';\n name: string;\n url?: string;\n thumbnail?: string;\n artist?: ArtistEntity;\n tracks?: TrackEntity[];\n featuredTrack?: TrackEntity;\n releaseDate?: string;\n}\n\nexport default AlbumEntity;\n"]} \ No newline at end of file +{"version":3,"file":"AlbumEntity.js","sourceRoot":"","sources":["../../../src/lib/entities/AlbumEntity.ts"],"names":[],"mappings":"","sourcesContent":["import type ArtistEntity from './ArtistEntity';\nimport type TrackEntity from './TrackEntity';\n\ninterface AlbumEntity {\n type: 'album';\n name: string;\n url?: string;\n thumbnail?: string;\n artist?: ArtistEntity;\n tracks?: TrackEntity[];\n featuredTrack?: TrackEntity;\n releaseDate?: string;\n}\n\nexport default AlbumEntity;\n"]} \ No newline at end of file diff --git a/bandcamp/dist/lib/entities/ArticleEntity.d.ts b/bandcamp/dist/lib/entities/ArticleEntity.d.ts index 203265487..3173cbd5e 100644 --- a/bandcamp/dist/lib/entities/ArticleEntity.d.ts +++ b/bandcamp/dist/lib/entities/ArticleEntity.d.ts @@ -1,5 +1,5 @@ -import AlbumEntity from './AlbumEntity'; -import TrackEntity from './TrackEntity'; +import type AlbumEntity from './AlbumEntity'; +import type TrackEntity from './TrackEntity'; interface ArticleEntity { type: 'article'; url: string; diff --git a/bandcamp/dist/lib/entities/ArticleEntity.d.ts.map b/bandcamp/dist/lib/entities/ArticleEntity.d.ts.map index ed60d65f1..58dd9e85e 100644 --- a/bandcamp/dist/lib/entities/ArticleEntity.d.ts.map +++ b/bandcamp/dist/lib/entities/ArticleEntity.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"ArticleEntity.d.ts","sourceRoot":"","sources":["../../../src/lib/entities/ArticleEntity.ts"],"names":[],"mappings":"AAAA,OAAO,WAAW,MAAM,eAAe,CAAC;AACxC,OAAO,WAAW,MAAM,eAAe,CAAC;AAExC,UAAU,aAAa;IACrB,IAAI,EAAE,SAAS,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE;QACT,IAAI,EAAE,MAAM,CAAC;QACb,GAAG,CAAC,EAAE,MAAM,CAAA;KACb,CAAC;IACF,MAAM,CAAC,EAAE;QACP,IAAI,EAAE,MAAM,CAAC;QACb,GAAG,EAAE,MAAM,CAAA;KACZ,CAAC;IACF,UAAU,CAAC,EAAE,sBAAsB,CAAC,WAAW,GAAG,WAAW,CAAC,EAAE,CAAC;IACjE,QAAQ,CAAC,EAAE,oBAAoB,EAAE,CAAC;CACnC;AAED,MAAM,MAAM,sBAAsB,CAAC,CAAC,SAAS,WAAW,GAAG,WAAW,IAAI,CAAC,GAAG;IAC5E,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,qBAAqB,EAAE,MAAM,CAAA;CAC9B,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,OAAO,CAAC,EAAE;QACR,IAAI,EAAE,MAAM,CAAA;KACb,CAAC;IACF,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,eAAe,aAAa,CAAC"} \ No newline at end of file +{"version":3,"file":"ArticleEntity.d.ts","sourceRoot":"","sources":["../../../src/lib/entities/ArticleEntity.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,WAAW,MAAM,eAAe,CAAC;AAC7C,OAAO,KAAK,WAAW,MAAM,eAAe,CAAC;AAE7C,UAAU,aAAa;IACrB,IAAI,EAAE,SAAS,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,QAAQ,CAAC,EAAE;QACT,IAAI,EAAE,MAAM,CAAC;QACb,GAAG,CAAC,EAAE,MAAM,CAAA;KACb,CAAC;IACF,MAAM,CAAC,EAAE;QACP,IAAI,EAAE,MAAM,CAAC;QACb,GAAG,EAAE,MAAM,CAAA;KACZ,CAAC;IACF,UAAU,CAAC,EAAE,sBAAsB,CAAC,WAAW,GAAG,WAAW,CAAC,EAAE,CAAC;IACjE,QAAQ,CAAC,EAAE,oBAAoB,EAAE,CAAC;CACnC;AAED,MAAM,MAAM,sBAAsB,CAAC,CAAC,SAAS,WAAW,GAAG,WAAW,IAAI,CAAC,GAAG;IAC5E,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,qBAAqB,EAAE,MAAM,CAAA;CAC9B,CAAC;AAEF,MAAM,MAAM,oBAAoB,GAAG;IACjC,OAAO,CAAC,EAAE;QACR,IAAI,EAAE,MAAM,CAAA;KACb,CAAC;IACF,IAAI,EAAE,MAAM,CAAC;IACb,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB,CAAC;AAEF,eAAe,aAAa,CAAC"} \ No newline at end of file diff --git a/bandcamp/dist/lib/entities/ArticleEntity.js.map b/bandcamp/dist/lib/entities/ArticleEntity.js.map index 41d85dfb2..ca971eb2b 100644 --- a/bandcamp/dist/lib/entities/ArticleEntity.js.map +++ b/bandcamp/dist/lib/entities/ArticleEntity.js.map @@ -1 +1 @@ -{"version":3,"file":"ArticleEntity.js","sourceRoot":"","sources":["../../../src/lib/entities/ArticleEntity.ts"],"names":[],"mappings":"","sourcesContent":["import AlbumEntity from './AlbumEntity';\nimport TrackEntity from './TrackEntity';\n\ninterface ArticleEntity {\n type: 'article',\n url: string;\n title: string;\n date: string;\n thumbnail?: string;\n description?: string;\n category?: {\n name: string,\n url?: string\n };\n author?: {\n name: string,\n url: string\n };\n mediaItems?: ArticleEntityMediaItem[];\n sections?: ArticleEntitySection[];\n}\n\nexport type ArticleEntityMediaItem = T & {\n mediaItemRef?: string,\n featuredTrackPosition: number\n};\n\nexport type ArticleEntitySection = {\n heading?: {\n text: string\n };\n text: string;\n mediaItemRef?: string;\n};\n\nexport default ArticleEntity;\n"]} \ No newline at end of file +{"version":3,"file":"ArticleEntity.js","sourceRoot":"","sources":["../../../src/lib/entities/ArticleEntity.ts"],"names":[],"mappings":"","sourcesContent":["import type AlbumEntity from './AlbumEntity';\nimport type TrackEntity from './TrackEntity';\n\ninterface ArticleEntity {\n type: 'article',\n url: string;\n title: string;\n date: string;\n thumbnail?: string;\n description?: string;\n category?: {\n name: string,\n url?: string\n };\n author?: {\n name: string,\n url: string\n };\n mediaItems?: ArticleEntityMediaItem[];\n sections?: ArticleEntitySection[];\n}\n\nexport type ArticleEntityMediaItem = T & {\n mediaItemRef?: string,\n featuredTrackPosition: number\n};\n\nexport type ArticleEntitySection = {\n heading?: {\n text: string\n };\n text: string;\n mediaItemRef?: string;\n};\n\nexport default ArticleEntity;\n"]} \ No newline at end of file diff --git a/bandcamp/dist/lib/entities/ArtistEntity.d.ts b/bandcamp/dist/lib/entities/ArtistEntity.d.ts index 4e8331161..fb79e7f99 100644 --- a/bandcamp/dist/lib/entities/ArtistEntity.d.ts +++ b/bandcamp/dist/lib/entities/ArtistEntity.d.ts @@ -1,5 +1,5 @@ -import BandEntity from './BandEntity'; -import LabelEntity from './LabelEntity'; +import type BandEntity from './BandEntity'; +import type LabelEntity from './LabelEntity'; interface ArtistEntity extends BandEntity { type: 'artist'; label?: LabelEntity; diff --git a/bandcamp/dist/lib/entities/ArtistEntity.d.ts.map b/bandcamp/dist/lib/entities/ArtistEntity.d.ts.map index 44009fc47..dc77f3e99 100644 --- a/bandcamp/dist/lib/entities/ArtistEntity.d.ts.map +++ b/bandcamp/dist/lib/entities/ArtistEntity.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"ArtistEntity.d.ts","sourceRoot":"","sources":["../../../src/lib/entities/ArtistEntity.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,cAAc,CAAC;AACtC,OAAO,WAAW,MAAM,eAAe,CAAC;AAExC,UAAU,YAAa,SAAQ,UAAU;IACvC,IAAI,EAAE,QAAQ,CAAC;IACf,KAAK,CAAC,EAAE,WAAW,CAAC;CACrB;AAED,eAAe,YAAY,CAAC"} \ No newline at end of file +{"version":3,"file":"ArtistEntity.d.ts","sourceRoot":"","sources":["../../../src/lib/entities/ArtistEntity.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,UAAU,MAAM,cAAc,CAAC;AAC3C,OAAO,KAAK,WAAW,MAAM,eAAe,CAAC;AAE7C,UAAU,YAAa,SAAQ,UAAU;IACvC,IAAI,EAAE,QAAQ,CAAC;IACf,KAAK,CAAC,EAAE,WAAW,CAAC;CACrB;AAED,eAAe,YAAY,CAAC"} \ No newline at end of file diff --git a/bandcamp/dist/lib/entities/ArtistEntity.js.map b/bandcamp/dist/lib/entities/ArtistEntity.js.map index d36aea946..29391ccf5 100644 --- a/bandcamp/dist/lib/entities/ArtistEntity.js.map +++ b/bandcamp/dist/lib/entities/ArtistEntity.js.map @@ -1 +1 @@ -{"version":3,"file":"ArtistEntity.js","sourceRoot":"","sources":["../../../src/lib/entities/ArtistEntity.ts"],"names":[],"mappings":"","sourcesContent":["import BandEntity from './BandEntity';\nimport LabelEntity from './LabelEntity';\n\ninterface ArtistEntity extends BandEntity {\n type: 'artist';\n label?: LabelEntity;\n}\n\nexport default ArtistEntity;\n"]} \ No newline at end of file +{"version":3,"file":"ArtistEntity.js","sourceRoot":"","sources":["../../../src/lib/entities/ArtistEntity.ts"],"names":[],"mappings":"","sourcesContent":["import type BandEntity from './BandEntity';\nimport type LabelEntity from './LabelEntity';\n\ninterface ArtistEntity extends BandEntity {\n type: 'artist';\n label?: LabelEntity;\n}\n\nexport default ArtistEntity;\n"]} \ No newline at end of file diff --git a/bandcamp/dist/lib/entities/LabelEntity.d.ts b/bandcamp/dist/lib/entities/LabelEntity.d.ts index 71ad20d9c..4b79768b5 100644 --- a/bandcamp/dist/lib/entities/LabelEntity.d.ts +++ b/bandcamp/dist/lib/entities/LabelEntity.d.ts @@ -1,4 +1,4 @@ -import BandEntity from './BandEntity'; +import type BandEntity from './BandEntity'; interface LabelEntity extends BandEntity { type: 'label'; } diff --git a/bandcamp/dist/lib/entities/LabelEntity.d.ts.map b/bandcamp/dist/lib/entities/LabelEntity.d.ts.map index b2a8a839e..be0395581 100644 --- a/bandcamp/dist/lib/entities/LabelEntity.d.ts.map +++ b/bandcamp/dist/lib/entities/LabelEntity.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"LabelEntity.d.ts","sourceRoot":"","sources":["../../../src/lib/entities/LabelEntity.ts"],"names":[],"mappings":"AAAA,OAAO,UAAU,MAAM,cAAc,CAAC;AAEtC,UAAU,WAAY,SAAQ,UAAU;IACtC,IAAI,EAAE,OAAO,CAAC;CACf;AAED,eAAe,WAAW,CAAC"} \ No newline at end of file +{"version":3,"file":"LabelEntity.d.ts","sourceRoot":"","sources":["../../../src/lib/entities/LabelEntity.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,UAAU,MAAM,cAAc,CAAC;AAE3C,UAAU,WAAY,SAAQ,UAAU;IACtC,IAAI,EAAE,OAAO,CAAC;CACf;AAED,eAAe,WAAW,CAAC"} \ No newline at end of file diff --git a/bandcamp/dist/lib/entities/LabelEntity.js.map b/bandcamp/dist/lib/entities/LabelEntity.js.map index c6f695fcb..d31475a24 100644 --- a/bandcamp/dist/lib/entities/LabelEntity.js.map +++ b/bandcamp/dist/lib/entities/LabelEntity.js.map @@ -1 +1 @@ -{"version":3,"file":"LabelEntity.js","sourceRoot":"","sources":["../../../src/lib/entities/LabelEntity.ts"],"names":[],"mappings":"","sourcesContent":["import BandEntity from './BandEntity';\n\ninterface LabelEntity extends BandEntity {\n type: 'label';\n}\n\nexport default LabelEntity;\n"]} \ No newline at end of file +{"version":3,"file":"LabelEntity.js","sourceRoot":"","sources":["../../../src/lib/entities/LabelEntity.ts"],"names":[],"mappings":"","sourcesContent":["import type BandEntity from './BandEntity';\n\ninterface LabelEntity extends BandEntity {\n type: 'label';\n}\n\nexport default LabelEntity;\n"]} \ No newline at end of file diff --git a/bandcamp/dist/lib/entities/ShowEntity.d.ts b/bandcamp/dist/lib/entities/ShowEntity.d.ts index 92079fb30..85b2ca91b 100644 --- a/bandcamp/dist/lib/entities/ShowEntity.d.ts +++ b/bandcamp/dist/lib/entities/ShowEntity.d.ts @@ -1,4 +1,4 @@ -import TrackEntity from './TrackEntity'; +import type TrackEntity from './TrackEntity'; interface ShowEntity { type: 'show'; url: string; diff --git a/bandcamp/dist/lib/entities/ShowEntity.d.ts.map b/bandcamp/dist/lib/entities/ShowEntity.d.ts.map index 0b0d20fac..e6a4a27b4 100644 --- a/bandcamp/dist/lib/entities/ShowEntity.d.ts.map +++ b/bandcamp/dist/lib/entities/ShowEntity.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"ShowEntity.d.ts","sourceRoot":"","sources":["../../../src/lib/entities/ShowEntity.ts"],"names":[],"mappings":"AAAA,OAAO,WAAW,MAAM,eAAe,CAAC;AAExC,UAAU,UAAU;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,WAAW,EAAE,CAAC;CACxB;AAED,eAAe,UAAU,CAAC"} \ No newline at end of file +{"version":3,"file":"ShowEntity.d.ts","sourceRoot":"","sources":["../../../src/lib/entities/ShowEntity.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,WAAW,MAAM,eAAe,CAAC;AAE7C,UAAU,UAAU;IAClB,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,MAAM,CAAC,EAAE,WAAW,EAAE,CAAC;CACxB;AAED,eAAe,UAAU,CAAC"} \ No newline at end of file diff --git a/bandcamp/dist/lib/entities/ShowEntity.js.map b/bandcamp/dist/lib/entities/ShowEntity.js.map index 671b86887..3b2e40c1d 100644 --- a/bandcamp/dist/lib/entities/ShowEntity.js.map +++ b/bandcamp/dist/lib/entities/ShowEntity.js.map @@ -1 +1 @@ -{"version":3,"file":"ShowEntity.js","sourceRoot":"","sources":["../../../src/lib/entities/ShowEntity.ts"],"names":[],"mappings":"","sourcesContent":["import TrackEntity from './TrackEntity';\n\ninterface ShowEntity {\n type: 'show';\n url: string;\n name: string;\n thumbnail?: string;\n description: string;\n date: string;\n streamUrl?: string;\n duration?: number;\n tracks?: TrackEntity[];\n}\n\nexport default ShowEntity;\n"]} \ No newline at end of file +{"version":3,"file":"ShowEntity.js","sourceRoot":"","sources":["../../../src/lib/entities/ShowEntity.ts"],"names":[],"mappings":"","sourcesContent":["import type TrackEntity from './TrackEntity';\n\ninterface ShowEntity {\n type: 'show';\n url: string;\n name: string;\n thumbnail?: string;\n description: string;\n date: string;\n streamUrl?: string;\n duration?: number;\n tracks?: TrackEntity[];\n}\n\nexport default ShowEntity;\n"]} \ No newline at end of file diff --git a/bandcamp/dist/lib/entities/TagEntity.d.ts b/bandcamp/dist/lib/entities/TagEntity.d.ts index 5f256383e..ae13983ec 100644 --- a/bandcamp/dist/lib/entities/TagEntity.d.ts +++ b/bandcamp/dist/lib/entities/TagEntity.d.ts @@ -1,7 +1,7 @@ interface TagEntity { type: 'tag'; name: string; - url: string; + value: string; thumbnail?: string; } export default TagEntity; diff --git a/bandcamp/dist/lib/entities/TagEntity.d.ts.map b/bandcamp/dist/lib/entities/TagEntity.d.ts.map index 452994308..e963bcff8 100644 --- a/bandcamp/dist/lib/entities/TagEntity.d.ts.map +++ b/bandcamp/dist/lib/entities/TagEntity.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"TagEntity.d.ts","sourceRoot":"","sources":["../../../src/lib/entities/TagEntity.ts"],"names":[],"mappings":"AAAA,UAAU,SAAS;IACjB,IAAI,EAAE,KAAK,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,EAAE,MAAM,CAAC;IACZ,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,eAAe,SAAS,CAAC"} \ No newline at end of file +{"version":3,"file":"TagEntity.d.ts","sourceRoot":"","sources":["../../../src/lib/entities/TagEntity.ts"],"names":[],"mappings":"AAAA,UAAU,SAAS;IACjB,IAAI,EAAE,KAAK,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,eAAe,SAAS,CAAC"} \ No newline at end of file diff --git a/bandcamp/dist/lib/entities/TagEntity.js.map b/bandcamp/dist/lib/entities/TagEntity.js.map index 7240092b3..63e3e9f3a 100644 --- a/bandcamp/dist/lib/entities/TagEntity.js.map +++ b/bandcamp/dist/lib/entities/TagEntity.js.map @@ -1 +1 @@ -{"version":3,"file":"TagEntity.js","sourceRoot":"","sources":["../../../src/lib/entities/TagEntity.ts"],"names":[],"mappings":"","sourcesContent":["interface TagEntity {\n type: 'tag';\n name: string;\n url: string;\n thumbnail?: string;\n}\n\nexport default TagEntity;\n"]} \ No newline at end of file +{"version":3,"file":"TagEntity.js","sourceRoot":"","sources":["../../../src/lib/entities/TagEntity.ts"],"names":[],"mappings":"","sourcesContent":["interface TagEntity {\n type: 'tag';\n name: string;\n value: string;\n thumbnail?: string;\n}\n\nexport default TagEntity;\n"]} \ No newline at end of file diff --git a/bandcamp/dist/lib/entities/TrackEntity.d.ts b/bandcamp/dist/lib/entities/TrackEntity.d.ts index 4d950c0b0..d38f3e970 100644 --- a/bandcamp/dist/lib/entities/TrackEntity.d.ts +++ b/bandcamp/dist/lib/entities/TrackEntity.d.ts @@ -1,7 +1,8 @@ -import AlbumEntity from './AlbumEntity'; -import ArtistEntity from './ArtistEntity'; +import type AlbumEntity from './AlbumEntity'; +import type ArtistEntity from './ArtistEntity'; interface TrackEntity { type: 'track'; + id?: number; name: string; url?: string; duration?: number; diff --git a/bandcamp/dist/lib/entities/TrackEntity.d.ts.map b/bandcamp/dist/lib/entities/TrackEntity.d.ts.map index 5e1c3e70a..d856a17bf 100644 --- a/bandcamp/dist/lib/entities/TrackEntity.d.ts.map +++ b/bandcamp/dist/lib/entities/TrackEntity.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"TrackEntity.d.ts","sourceRoot":"","sources":["../../../src/lib/entities/TrackEntity.ts"],"names":[],"mappings":"AAAA,OAAO,WAAW,MAAM,eAAe,CAAC;AACxC,OAAO,YAAY,MAAM,gBAAgB,CAAC;AAE1C,UAAU,WAAW;IACnB,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,eAAe,WAAW,CAAC"} \ No newline at end of file +{"version":3,"file":"TrackEntity.d.ts","sourceRoot":"","sources":["../../../src/lib/entities/TrackEntity.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,WAAW,MAAM,eAAe,CAAC;AAC7C,OAAO,KAAK,YAAY,MAAM,gBAAgB,CAAC;AAE/C,UAAU,WAAW;IACnB,IAAI,EAAE,OAAO,CAAC;IACd,EAAE,CAAC,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC;IACb,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,WAAW,CAAC;IACpB,MAAM,CAAC,EAAE,YAAY,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,eAAe,WAAW,CAAC"} \ No newline at end of file diff --git a/bandcamp/dist/lib/entities/TrackEntity.js.map b/bandcamp/dist/lib/entities/TrackEntity.js.map index 438589beb..e8c0cc689 100644 --- a/bandcamp/dist/lib/entities/TrackEntity.js.map +++ b/bandcamp/dist/lib/entities/TrackEntity.js.map @@ -1 +1 @@ -{"version":3,"file":"TrackEntity.js","sourceRoot":"","sources":["../../../src/lib/entities/TrackEntity.ts"],"names":[],"mappings":"","sourcesContent":["import AlbumEntity from './AlbumEntity';\nimport ArtistEntity from './ArtistEntity';\n\ninterface TrackEntity {\n type: 'track';\n name: string;\n url?: string;\n duration?: number;\n thumbnail?: string;\n streamUrl?: string;\n album?: AlbumEntity;\n artist?: ArtistEntity;\n position?: number;\n}\n\nexport default TrackEntity;\n"]} \ No newline at end of file +{"version":3,"file":"TrackEntity.js","sourceRoot":"","sources":["../../../src/lib/entities/TrackEntity.ts"],"names":[],"mappings":"","sourcesContent":["import type AlbumEntity from './AlbumEntity';\nimport type ArtistEntity from './ArtistEntity';\n\ninterface TrackEntity {\n type: 'track';\n id?: number;\n name: string;\n url?: string;\n duration?: number;\n thumbnail?: string;\n streamUrl?: string;\n album?: AlbumEntity;\n artist?: ArtistEntity;\n position?: number;\n}\n\nexport default TrackEntity;\n"]} \ No newline at end of file diff --git a/bandcamp/dist/lib/model/AlbumModel.d.ts b/bandcamp/dist/lib/model/AlbumModel.d.ts index 33e4d5f65..9d764ecbe 100644 --- a/bandcamp/dist/lib/model/AlbumModel.d.ts +++ b/bandcamp/dist/lib/model/AlbumModel.d.ts @@ -1,5 +1,5 @@ import BaseModel from './BaseModel'; -import AlbumEntity from '../entities/AlbumEntity'; +import type AlbumEntity from '../entities/AlbumEntity'; export default class AlbumModel extends BaseModel { #private; getAlbum(albumUrl: string): Promise; diff --git a/bandcamp/dist/lib/model/AlbumModel.d.ts.map b/bandcamp/dist/lib/model/AlbumModel.d.ts.map index 51122a865..27def2391 100644 --- a/bandcamp/dist/lib/model/AlbumModel.d.ts.map +++ b/bandcamp/dist/lib/model/AlbumModel.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"AlbumModel.d.ts","sourceRoot":"","sources":["../../../src/lib/model/AlbumModel.ts"],"names":[],"mappings":"AAEA,OAAO,SAAS,MAAM,aAAa,CAAC;AACpC,OAAO,WAAW,MAAM,yBAAyB,CAAC;AAGlD,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,SAAS;;IAEzC,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;CAgCvD"} \ No newline at end of file +{"version":3,"file":"AlbumModel.d.ts","sourceRoot":"","sources":["../../../src/lib/model/AlbumModel.ts"],"names":[],"mappings":"AAEA,OAAO,SAAS,MAAM,aAAa,CAAC;AACpC,OAAO,KAAK,WAAW,MAAM,yBAAyB,CAAC;AAGvD,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,SAAS;;IAEzC,QAAQ,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC;CAgCvD"} \ No newline at end of file diff --git a/bandcamp/dist/lib/model/AlbumModel.js b/bandcamp/dist/lib/model/AlbumModel.js index ca1191aed..30710db03 100644 --- a/bandcamp/dist/lib/model/AlbumModel.js +++ b/bandcamp/dist/lib/model/AlbumModel.js @@ -31,7 +31,6 @@ class AlbumModel extends BaseModel_1.default { return albumEntity; } } -exports.default = AlbumModel; _AlbumModel_instances = new WeakSet(), _AlbumModel_cacheTracks = function _AlbumModel_cacheTracks(tracks) { if (!tracks) { return; @@ -44,4 +43,5 @@ _AlbumModel_instances = new WeakSet(), _AlbumModel_cacheTracks = function _Album }, _AlbumModel_converFetchedAlbumToEntity = function _AlbumModel_converFetchedAlbumToEntity(item) { return EntityConverter_1.default.convertAlbum(item); }; +exports.default = AlbumModel; //# sourceMappingURL=AlbumModel.js.map \ No newline at end of file diff --git a/bandcamp/dist/lib/model/AlbumModel.js.map b/bandcamp/dist/lib/model/AlbumModel.js.map index 34841baa5..0f77a2cac 100644 --- a/bandcamp/dist/lib/model/AlbumModel.js.map +++ b/bandcamp/dist/lib/model/AlbumModel.js.map @@ -1 +1 @@ -{"version":3,"file":"AlbumModel.js","sourceRoot":"","sources":["../../../src/lib/model/AlbumModel.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,oEAAgD;AAChD,yEAA0C;AAC1C,4DAAoC;AAEpC,8EAAsD;AAEtD,MAAqB,UAAW,SAAQ,mBAAS;IAAjD;;;IAkCA,CAAC;IAhCC,KAAK,CAAC,QAAQ,CAAC,QAAgB;QAC7B,MAAM,WAAW,GAAG;YAClB,QAAQ;YACR,gBAAgB,EAAE,IAAI,CAAC,mBAAmB,EAAE;YAC5C,iBAAiB,EAAE,IAAI,CAAC,oBAAoB,EAAE;YAC9C,cAAc,EAAE,KAAK;SACtB,CAAC;QACF,MAAM,KAAK,GAAG,MAAM,yBAAQ,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAC9C,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,WAAW,CAAC,EAC9C,GAAG,EAAE,CAAC,wBAAO,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC;QAEpD,MAAM,WAAW,GAAG,uBAAA,IAAI,qEAA4B,MAAhC,IAAI,EAA6B,KAAK,CAAC,CAAC;QAE5D,uBAAA,IAAI,sDAAa,MAAjB,IAAI,EAAc,WAAW,CAAC,MAAM,CAAC,CAAC;QAEtC,OAAO,WAAW,CAAC;IACrB,CAAC;CAgBF;AAlCD,6BAkCC;kGAdc,MAAuB;IAClC,IAAI,CAAC,MAAM,EAAE;QACX,OAAO;KACR;IACD,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;QACvB,IAAI,KAAK,CAAC,GAAG,EAAE;YACb,yBAAQ,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;SAC5F;IACH,CAAC,CAAC,CAAC;AACL,CAAC,2FAE2B,IAAW;IACrC,OAAO,yBAAe,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;AAC5C,CAAC","sourcesContent":["import bcfetch, { Album } from 'bandcamp-fetch';\nimport bandcamp from '../BandcampContext';\nimport BaseModel from './BaseModel';\nimport AlbumEntity from '../entities/AlbumEntity';\nimport EntityConverter from '../util/EntityConverter';\n\nexport default class AlbumModel extends BaseModel {\n\n async getAlbum(albumUrl: string): Promise {\n const queryParams = {\n albumUrl,\n albumImageFormat: this.getAlbumImageFormat(),\n artistImageFormat: this.getArtistImageFormat(),\n includeRawData: false\n };\n const album = await bandcamp.getCache().getOrSet(\n this.getCacheKeyForFetch('album', queryParams),\n () => bcfetch.limiter.album.getInfo(queryParams));\n\n const albumEntity = this.#converFetchedAlbumToEntity(album);\n\n this.#cacheTracks(albumEntity.tracks);\n\n return albumEntity;\n }\n\n #cacheTracks(tracks: Album['tracks']) {\n if (!tracks) {\n return;\n }\n tracks.forEach((track) => {\n if (track.url) {\n bandcamp.getCache().put(this.getCacheKeyForFetch('track', { trackUrl: track.url }), track);\n }\n });\n }\n\n #converFetchedAlbumToEntity(item: Album): AlbumEntity {\n return EntityConverter.convertAlbum(item);\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"AlbumModel.js","sourceRoot":"","sources":["../../../src/lib/model/AlbumModel.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,oEAAqD;AACrD,yEAA0C;AAC1C,4DAAoC;AAEpC,8EAAsD;AAEtD,MAAqB,UAAW,SAAQ,mBAAS;IAAjD;;;IAkCA,CAAC;IAhCC,KAAK,CAAC,QAAQ,CAAC,QAAgB;QAC7B,MAAM,WAAW,GAAG;YAClB,QAAQ;YACR,gBAAgB,EAAE,IAAI,CAAC,mBAAmB,EAAE;YAC5C,iBAAiB,EAAE,IAAI,CAAC,oBAAoB,EAAE;YAC9C,cAAc,EAAE,KAAK;SACtB,CAAC;QACF,MAAM,KAAK,GAAG,MAAM,yBAAQ,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAC9C,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,WAAW,CAAC,EAC9C,GAAG,EAAE,CAAC,wBAAO,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC;QAEpD,MAAM,WAAW,GAAG,uBAAA,IAAI,qEAA4B,MAAhC,IAAI,EAA6B,KAAK,CAAC,CAAC;QAE5D,uBAAA,IAAI,sDAAa,MAAjB,IAAI,EAAc,WAAW,CAAC,MAAM,CAAC,CAAC;QAEtC,OAAO,WAAW,CAAC;IACrB,CAAC;CAgBF;kGAdc,MAAuB;IAClC,IAAI,CAAC,MAAM,EAAE,CAAC;QACZ,OAAO;IACT,CAAC;IACD,MAAM,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;QACvB,IAAI,KAAK,CAAC,GAAG,EAAE,CAAC;YACd,yBAAQ,CAAC,QAAQ,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,KAAK,CAAC,GAAG,EAAE,CAAC,EAAE,KAAK,CAAC,CAAC;QAC7F,CAAC;IACH,CAAC,CAAC,CAAC;AACL,CAAC,2FAE2B,IAAW;IACrC,OAAO,yBAAe,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;AAC5C,CAAC;kBAjCkB,UAAU","sourcesContent":["import bcfetch, { type Album } from 'bandcamp-fetch';\nimport bandcamp from '../BandcampContext';\nimport BaseModel from './BaseModel';\nimport type AlbumEntity from '../entities/AlbumEntity';\nimport EntityConverter from '../util/EntityConverter';\n\nexport default class AlbumModel extends BaseModel {\n\n async getAlbum(albumUrl: string): Promise {\n const queryParams = {\n albumUrl,\n albumImageFormat: this.getAlbumImageFormat(),\n artistImageFormat: this.getArtistImageFormat(),\n includeRawData: false\n };\n const album = await bandcamp.getCache().getOrSet(\n this.getCacheKeyForFetch('album', queryParams),\n () => bcfetch.limiter.album.getInfo(queryParams));\n\n const albumEntity = this.#converFetchedAlbumToEntity(album);\n\n this.#cacheTracks(albumEntity.tracks);\n\n return albumEntity;\n }\n\n #cacheTracks(tracks: Album['tracks']) {\n if (!tracks) {\n return;\n }\n tracks.forEach((track) => {\n if (track.url) {\n bandcamp.getCache().put(this.getCacheKeyForFetch('track', { trackUrl: track.url }), track);\n }\n });\n }\n\n #converFetchedAlbumToEntity(item: Album): AlbumEntity {\n return EntityConverter.convertAlbum(item);\n }\n}\n"]} \ No newline at end of file diff --git a/bandcamp/dist/lib/model/ArticleModel.d.ts b/bandcamp/dist/lib/model/ArticleModel.d.ts index 9db9d40a1..8cad335e7 100644 --- a/bandcamp/dist/lib/model/ArticleModel.d.ts +++ b/bandcamp/dist/lib/model/ArticleModel.d.ts @@ -1,5 +1,5 @@ import BaseModel from './BaseModel'; -import ArticleEntity from '../entities/ArticleEntity'; +import type ArticleEntity from '../entities/ArticleEntity'; export interface ArticleModelGetArticlesParams { categoryUrl?: string; pageToken?: string; diff --git a/bandcamp/dist/lib/model/ArticleModel.d.ts.map b/bandcamp/dist/lib/model/ArticleModel.d.ts.map index c7d435d85..1bf4abb0b 100644 --- a/bandcamp/dist/lib/model/ArticleModel.d.ts.map +++ b/bandcamp/dist/lib/model/ArticleModel.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"ArticleModel.d.ts","sourceRoot":"","sources":["../../../src/lib/model/ArticleModel.ts"],"names":[],"mappings":"AAEA,OAAO,SAAsC,MAAM,aAAa,CAAC;AACjE,OAAO,aAAa,MAAM,2BAA2B,CAAC;AAGtD,MAAM,WAAW,6BAA6B;IAC5C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;CACf;AAMD,MAAM,CAAC,OAAO,OAAO,YAAa,SAAQ,SAAS;;IAEjD,WAAW,CAAC,MAAM,EAAE,6BAA6B;IA4D3C,UAAU,CAAC,UAAU,EAAE,MAAM;IAanC,oBAAoB;CASrB"} \ No newline at end of file +{"version":3,"file":"ArticleModel.d.ts","sourceRoot":"","sources":["../../../src/lib/model/ArticleModel.ts"],"names":[],"mappings":"AAEA,OAAO,SAA2C,MAAM,aAAa,CAAC;AACtE,OAAO,KAAK,aAAa,MAAM,2BAA2B,CAAC;AAG3D,MAAM,WAAW,6BAA6B;IAC5C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;CACf;AAMD,MAAM,CAAC,OAAO,OAAO,YAAa,SAAQ,SAAS;;IAEjD,WAAW,CAAC,MAAM,EAAE,6BAA6B;IA4D3C,UAAU,CAAC,UAAU,EAAE,MAAM;IAanC,oBAAoB;CASrB"} \ No newline at end of file diff --git a/bandcamp/dist/lib/model/ArticleModel.js b/bandcamp/dist/lib/model/ArticleModel.js index d28d1bf87..1c1ec24b9 100644 --- a/bandcamp/dist/lib/model/ArticleModel.js +++ b/bandcamp/dist/lib/model/ArticleModel.js @@ -43,7 +43,6 @@ class ArticleModel extends BaseModel_1.default { return BandcampContext_1.default.getCache().getOrSet(this.getCacheKeyForFetch('articleCategories'), () => bandcamp_fetch_1.default.limiter.article.getCategories()); } } -exports.default = ArticleModel; _ArticleModel_instances = new WeakSet(), _ArticleModel_getArticlesFetchPromise = function _ArticleModel_getArticlesFetchPromise(params) { let page = 1; if (params.pageToken) { @@ -80,4 +79,5 @@ _ArticleModel_instances = new WeakSet(), _ArticleModel_getArticlesFetchPromise = }, _ArticleModel_convertFetchedArticleToEntity = function _ArticleModel_convertFetchedArticleToEntity(item) { return EntityConverter_1.default.convertArticle(item); }; +exports.default = ArticleModel; //# sourceMappingURL=ArticleModel.js.map \ No newline at end of file diff --git a/bandcamp/dist/lib/model/ArticleModel.js.map b/bandcamp/dist/lib/model/ArticleModel.js.map index faf051f01..6f18dc870 100644 --- a/bandcamp/dist/lib/model/ArticleModel.js.map +++ b/bandcamp/dist/lib/model/ArticleModel.js.map @@ -1 +1 @@ -{"version":3,"file":"ArticleModel.js","sourceRoot":"","sources":["../../../src/lib/model/ArticleModel.ts"],"names":[],"mappings":"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","sourcesContent":["import bcfetch, { Article, ArticleAPIListParams, ArticleList, ArticleListItem } from 'bandcamp-fetch';\nimport bandcamp from '../BandcampContext';\nimport BaseModel, { LoopFetchCallbackParams } from './BaseModel';\nimport ArticleEntity from '../entities/ArticleEntity';\nimport EntityConverter from '../util/EntityConverter';\n\nexport interface ArticleModelGetArticlesParams {\n categoryUrl?: string;\n pageToken?: string;\n pageOffset?: number;\n limit: number;\n}\n\ninterface GetArticlesLoopFetchCallbackParams extends LoopFetchCallbackParams {\n categoryUrl?: string;\n}\n\nexport default class ArticleModel extends BaseModel {\n\n getArticles(params: ArticleModelGetArticlesParams) {\n return this.loopFetch({\n callbackParams: { ...params },\n getFetchPromise: this.#getArticlesFetchPromise.bind(this),\n getItemsFromFetchResult: this.#getArticlesFromFetchResult.bind(this),\n getNextPageTokenFromFetchResult: this.#getNextPageTokenFromArticlesFetchResult.bind(this),\n convertToEntity: this.#convertFetchedArticleListItemToEntity.bind(this),\n pageOffset: params.pageOffset,\n pageToken: params.pageToken,\n limit: params.limit\n });\n }\n\n #getArticlesFetchPromise(params: GetArticlesLoopFetchCallbackParams) {\n let page = 1;\n if (params.pageToken) {\n const parsedPageToken = JSON.parse(params.pageToken);\n page = parsedPageToken?.page || 1;\n }\n\n const queryParams: ArticleAPIListParams = {\n page,\n imageFormat: this.getAlbumImageFormat()\n };\n if (params.categoryUrl) {\n queryParams.categoryUrl = params.categoryUrl;\n }\n\n return bandcamp.getCache().getOrSet(\n this.getCacheKeyForFetch('articles', queryParams),\n () => bcfetch.limiter.article.list(queryParams));\n }\n\n #getArticlesFromFetchResult(result: ArticleList) {\n return result.articles.slice(0);\n }\n\n #getNextPageTokenFromArticlesFetchResult(result: ArticleList, params: GetArticlesLoopFetchCallbackParams) {\n let page = 1, indexRef = 0;\n if (params.pageToken) {\n const parsedPageToken = JSON.parse(params.pageToken);\n page = parsedPageToken?.page || 1;\n indexRef = parsedPageToken?.indexRef || 0;\n }\n if (result.articles.length > 0 && result.total > indexRef + result.articles.length) {\n const nextPageToken = {\n page: page + 1,\n indexRef: indexRef + result.articles.length\n };\n return JSON.stringify(nextPageToken);\n }\n\n return null;\n\n }\n\n #convertFetchedArticleListItemToEntity(item: ArticleListItem): ArticleEntity {\n return EntityConverter.convertArticleListItem(item);\n }\n\n async getArticle(articleUrl: string) {\n const queryParams = {\n articleUrl,\n albumImageFormat: this.getAlbumImageFormat(),\n artistImageFormat: this.getArtistImageFormat()\n };\n const article = await bandcamp.getCache().getOrSet(\n this.getCacheKeyForFetch('article', queryParams),\n () => bcfetch.limiter.article.getArticle(queryParams));\n\n return this.#convertFetchedArticleToEntity(article);\n }\n\n getArticleCategories() {\n return bandcamp.getCache().getOrSet(\n this.getCacheKeyForFetch('articleCategories'),\n () => bcfetch.limiter.article.getCategories());\n }\n\n #convertFetchedArticleToEntity(item: Article): ArticleEntity {\n return EntityConverter.convertArticle(item);\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"ArticleModel.js","sourceRoot":"","sources":["../../../src/lib/model/ArticleModel.ts"],"names":[],"mappings":"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","sourcesContent":["import bcfetch, { type Article, type ArticleAPIListParams, type ArticleList, type ArticleListItem } from 'bandcamp-fetch';\nimport bandcamp from '../BandcampContext';\nimport BaseModel, { type LoopFetchCallbackParams } from './BaseModel';\nimport type ArticleEntity from '../entities/ArticleEntity';\nimport EntityConverter from '../util/EntityConverter';\n\nexport interface ArticleModelGetArticlesParams {\n categoryUrl?: string;\n pageToken?: string;\n pageOffset?: number;\n limit: number;\n}\n\ninterface GetArticlesLoopFetchCallbackParams extends LoopFetchCallbackParams {\n categoryUrl?: string;\n}\n\nexport default class ArticleModel extends BaseModel {\n\n getArticles(params: ArticleModelGetArticlesParams) {\n return this.loopFetch({\n callbackParams: { ...params },\n getFetchPromise: this.#getArticlesFetchPromise.bind(this),\n getItemsFromFetchResult: this.#getArticlesFromFetchResult.bind(this),\n getNextPageTokenFromFetchResult: this.#getNextPageTokenFromArticlesFetchResult.bind(this),\n convertToEntity: this.#convertFetchedArticleListItemToEntity.bind(this),\n pageOffset: params.pageOffset,\n pageToken: params.pageToken,\n limit: params.limit\n });\n }\n\n #getArticlesFetchPromise(params: GetArticlesLoopFetchCallbackParams) {\n let page = 1;\n if (params.pageToken) {\n const parsedPageToken = JSON.parse(params.pageToken);\n page = parsedPageToken?.page || 1;\n }\n\n const queryParams: ArticleAPIListParams = {\n page,\n imageFormat: this.getAlbumImageFormat()\n };\n if (params.categoryUrl) {\n queryParams.categoryUrl = params.categoryUrl;\n }\n\n return bandcamp.getCache().getOrSet(\n this.getCacheKeyForFetch('articles', queryParams),\n () => bcfetch.limiter.article.list(queryParams));\n }\n\n #getArticlesFromFetchResult(result: ArticleList) {\n return result.articles.slice(0);\n }\n\n #getNextPageTokenFromArticlesFetchResult(result: ArticleList, params: GetArticlesLoopFetchCallbackParams) {\n let page = 1, indexRef = 0;\n if (params.pageToken) {\n const parsedPageToken = JSON.parse(params.pageToken);\n page = parsedPageToken?.page || 1;\n indexRef = parsedPageToken?.indexRef || 0;\n }\n if (result.articles.length > 0 && result.total > indexRef + result.articles.length) {\n const nextPageToken = {\n page: page + 1,\n indexRef: indexRef + result.articles.length\n };\n return JSON.stringify(nextPageToken);\n }\n\n return null;\n\n }\n\n #convertFetchedArticleListItemToEntity(item: ArticleListItem): ArticleEntity {\n return EntityConverter.convertArticleListItem(item);\n }\n\n async getArticle(articleUrl: string) {\n const queryParams = {\n articleUrl,\n albumImageFormat: this.getAlbumImageFormat(),\n artistImageFormat: this.getArtistImageFormat()\n };\n const article = await bandcamp.getCache().getOrSet(\n this.getCacheKeyForFetch('article', queryParams),\n () => bcfetch.limiter.article.getArticle(queryParams));\n\n return this.#convertFetchedArticleToEntity(article);\n }\n\n getArticleCategories() {\n return bandcamp.getCache().getOrSet(\n this.getCacheKeyForFetch('articleCategories'),\n () => bcfetch.limiter.article.getCategories());\n }\n\n #convertFetchedArticleToEntity(item: Article): ArticleEntity {\n return EntityConverter.convertArticle(item);\n }\n}\n"]} \ No newline at end of file diff --git a/bandcamp/dist/lib/model/BandModel.d.ts b/bandcamp/dist/lib/model/BandModel.d.ts index f7aabcf5d..18ef3e0be 100644 --- a/bandcamp/dist/lib/model/BandModel.d.ts +++ b/bandcamp/dist/lib/model/BandModel.d.ts @@ -1,8 +1,8 @@ import BaseModel from './BaseModel'; -import ArtistEntity from '../entities/ArtistEntity'; -import AlbumEntity from '../entities/AlbumEntity'; -import TrackEntity from '../entities/TrackEntity'; -import LabelEntity from '../entities/LabelEntity'; +import type ArtistEntity from '../entities/ArtistEntity'; +import type AlbumEntity from '../entities/AlbumEntity'; +import type TrackEntity from '../entities/TrackEntity'; +import type LabelEntity from '../entities/LabelEntity'; export interface BandModelGetLabelArtistsParams { labelUrl: string; pageToken?: string; diff --git a/bandcamp/dist/lib/model/BandModel.d.ts.map b/bandcamp/dist/lib/model/BandModel.d.ts.map index eedb8d217..02ac78560 100644 --- a/bandcamp/dist/lib/model/BandModel.d.ts.map +++ b/bandcamp/dist/lib/model/BandModel.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"BandModel.d.ts","sourceRoot":"","sources":["../../../src/lib/model/BandModel.ts"],"names":[],"mappings":"AAEA,OAAO,SAAsC,MAAM,aAAa,CAAC;AACjE,OAAO,YAAY,MAAM,0BAA0B,CAAC;AAEpD,OAAO,WAAW,MAAM,yBAAyB,CAAC;AAClD,OAAO,WAAW,MAAM,yBAAyB,CAAC;AAClD,OAAO,WAAW,MAAM,yBAAyB,CAAC;AAElD,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,6BAA6B;IAC5C,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;CACf;AAUD,MAAM,CAAC,OAAO,OAAO,SAAU,SAAQ,SAAS;;IAE9C,eAAe,CAAC,MAAM,EAAE,8BAA8B;IA8BtD,cAAc,CAAC,MAAM,EAAE,6BAA6B;IAkC9C,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,WAAW,CAAC;CAgBpE"} \ No newline at end of file +{"version":3,"file":"BandModel.d.ts","sourceRoot":"","sources":["../../../src/lib/model/BandModel.ts"],"names":[],"mappings":"AAEA,OAAO,SAA2C,MAAM,aAAa,CAAC;AACtE,OAAO,KAAK,YAAY,MAAM,0BAA0B,CAAC;AAEzD,OAAO,KAAK,WAAW,MAAM,yBAAyB,CAAC;AACvD,OAAO,KAAK,WAAW,MAAM,yBAAyB,CAAC;AACvD,OAAO,KAAK,WAAW,MAAM,yBAAyB,CAAC;AAEvD,MAAM,WAAW,8BAA8B;IAC7C,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,6BAA6B;IAC5C,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;CACf;AAUD,MAAM,CAAC,OAAO,OAAO,SAAU,SAAQ,SAAS;;IAE9C,eAAe,CAAC,MAAM,EAAE,8BAA8B;IA8BtD,cAAc,CAAC,MAAM,EAAE,6BAA6B;IAkC9C,OAAO,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,YAAY,GAAG,WAAW,CAAC;CAgBpE"} \ No newline at end of file diff --git a/bandcamp/dist/lib/model/BandModel.js b/bandcamp/dist/lib/model/BandModel.js index 3e535fd3a..b9b575f37 100644 --- a/bandcamp/dist/lib/model/BandModel.js +++ b/bandcamp/dist/lib/model/BandModel.js @@ -52,7 +52,6 @@ class BandModel extends BaseModel_1.default { return EntityConverter_1.default.convertLabel(band); } } -exports.default = BandModel; _BandModel_instances = new WeakSet(), _BandModel_getLabelArtistsFetchPromise = function _BandModel_getLabelArtistsFetchPromise(params) { const queryParams = { labelUrl: params.labelUrl, @@ -77,4 +76,5 @@ _BandModel_instances = new WeakSet(), _BandModel_getLabelArtistsFetchPromise = f } return EntityConverter_1.default.convertTrack(item); }; +exports.default = BandModel; //# sourceMappingURL=BandModel.js.map \ No newline at end of file diff --git a/bandcamp/dist/lib/model/BandModel.js.map b/bandcamp/dist/lib/model/BandModel.js.map index 5ca0e062b..5e7e1eadc 100644 --- a/bandcamp/dist/lib/model/BandModel.js.map +++ b/bandcamp/dist/lib/model/BandModel.js.map @@ -1 +1 @@ -{"version":3,"file":"BandModel.js","sourceRoot":"","sources":["../../../src/lib/model/BandModel.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,oEAAoE;AACpE,yEAA0C;AAC1C,4DAAiE;AAEjE,8EAAsD;AA2BtD,MAAqB,SAAU,SAAQ,mBAAS;IAAhD;;;IAkFA,CAAC;IAhFC,eAAe,CAAC,MAAsC;QACpD,OAAO,IAAI,CAAC,SAAS,CAAC;YACpB,cAAc,EAAE,EAAE,GAAG,MAAM,EAAE;YAC7B,eAAe,EAAE,uBAAA,IAAI,oEAA6B,CAAC,IAAI,CAAC,IAAI,CAAC;YAC7D,uBAAuB,EAAE,uBAAA,IAAI,uEAAgC,CAAC,IAAI,CAAC,IAAI,CAAC;YACxE,eAAe,EAAE,uBAAA,IAAI,0EAAmC,CAAC,IAAI,CAAC,IAAI,CAAC;YACnE,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,KAAK,EAAE,MAAM,CAAC,KAAK;SACpB,CAAC,CAAC;IACL,CAAC;IAoBD,cAAc,CAAC,MAAqC;QAClD,OAAO,IAAI,CAAC,SAAS,CAAC;YACpB,cAAc,EAAE,EAAE,GAAG,MAAM,EAAE;YAC7B,eAAe,EAAE,uBAAA,IAAI,mEAA4B,CAAC,IAAI,CAAC,IAAI,CAAC;YAC5D,uBAAuB,EAAE,uBAAA,IAAI,2EAAoC,CAAC,IAAI,CAAC,IAAI,CAAC;YAC5E,eAAe,EAAE,uBAAA,IAAI,8EAAuC,CAAC,IAAI,CAAC,IAAI,CAAC;YACvE,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,KAAK,EAAE,MAAM,CAAC,KAAK;SACpB,CAAC,CAAC;IACL,CAAC;IAwBD,KAAK,CAAC,OAAO,CAAC,OAAe;QAC3B,MAAM,WAAW,GAAG;YAClB,OAAO;YACP,WAAW,EAAE,IAAI,CAAC,oBAAoB,EAAE;SACzC,CAAC;QAEF,MAAM,IAAI,GAAG,MAAM,yBAAQ,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAC7C,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,WAAW,CAAC,EAC7C,GAAG,EAAE,CAAC,wBAAO,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC;QAEnD,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ,EAAE;YAC1B,OAAO,yBAAe,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;SAC5C;QAED,OAAO,yBAAe,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IAC5C,CAAC;CACF;AAlFD,4BAkFC;+HApE8B,MAA8C;IACzE,MAAM,WAAW,GAAG;QAClB,QAAQ,EAAE,MAAM,CAAC,QAAQ;QACzB,WAAW,EAAE,IAAI,CAAC,oBAAoB,EAAE;KACzC,CAAC;IACF,OAAO,yBAAQ,CAAC,QAAQ,EAAE,CAAC,QAAQ,CACjC,IAAI,CAAC,mBAAmB,CAAC,SAAS,EAAE,WAAW,CAAC,EAChD,GAAG,EAAE,CAAC,wBAAO,CAAC,OAAO,CAAC,IAAI,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC,CAAC;AAC7D,CAAC,iGAE+B,MAAqB;IACnD,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACzB,CAAC,uGAEkC,IAAiB;IAClD,OAAO,yBAAe,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;AAC7C,CAAC,yFAc2B,MAA6C;IACvE,MAAM,WAAW,GAAG;QAClB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,WAAW,EAAE,IAAI,CAAC,mBAAmB,EAAE;KACxC,CAAC;IACF,OAAO,yBAAQ,CAAC,QAAQ,EAAE,CAAC,QAAQ,CACjC,IAAI,CAAC,mBAAmB,CAAC,aAAa,EAAE,WAAW,CAAC,EACpD,GAAG,EAAE,CAAC,wBAAO,CAAC,OAAO,CAAC,IAAI,CAAC,cAAc,CAAC,WAAW,CAAC,CAAC,CAAC;AAC5D,CAAC,yGAEmC,MAA4B;IAC9D,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACzB,CAAC,+GAEsC,IAAmB;IACxD,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE;QACzB,OAAO,yBAAe,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;KAC3C;IAED,OAAO,yBAAe,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;AAC5C,CAAC","sourcesContent":["import bcfetch, { Album, LabelArtist, Track } from 'bandcamp-fetch';\nimport bandcamp from '../BandcampContext';\nimport BaseModel, { LoopFetchCallbackParams } from './BaseModel';\nimport ArtistEntity from '../entities/ArtistEntity';\nimport EntityConverter from '../util/EntityConverter';\nimport AlbumEntity from '../entities/AlbumEntity';\nimport TrackEntity from '../entities/TrackEntity';\nimport LabelEntity from '../entities/LabelEntity';\n\nexport interface BandModelGetLabelArtistsParams {\n labelUrl: string;\n pageToken?: string;\n pageOffset?: number;\n limit: number;\n}\n\nexport interface BandModelGetDiscographyParams {\n bandUrl: string;\n pageToken?: string;\n pageOffset?: number;\n limit: number;\n}\n\ninterface GetLabelArtistsLoopFetchCallbackParams extends LoopFetchCallbackParams {\n labelUrl: string;\n}\n\ninterface GetDiscographyLoopFetchCallbackParams extends LoopFetchCallbackParams {\n bandUrl: string;\n}\n\nexport default class BandModel extends BaseModel {\n\n getLabelArtists(params: BandModelGetLabelArtistsParams) {\n return this.loopFetch({\n callbackParams: { ...params },\n getFetchPromise: this.#getLabelArtistsFetchPromise.bind(this),\n getItemsFromFetchResult: this.#getLabelArtistsFromFetchResult.bind(this),\n convertToEntity: this.#convertFetchedLabelArtistToEntity.bind(this),\n pageOffset: params.pageOffset,\n pageToken: params.pageToken,\n limit: params.limit\n });\n }\n\n #getLabelArtistsFetchPromise(params: GetLabelArtistsLoopFetchCallbackParams) {\n const queryParams = {\n labelUrl: params.labelUrl,\n imageFormat: this.getArtistImageFormat()\n };\n return bandcamp.getCache().getOrSet(\n this.getCacheKeyForFetch('artists', queryParams),\n () => bcfetch.limiter.band.getLabelArtists(queryParams));\n }\n\n #getLabelArtistsFromFetchResult(result: LabelArtist[]) {\n return result.slice(0);\n }\n\n #convertFetchedLabelArtistToEntity(item: LabelArtist): ArtistEntity {\n return EntityConverter.convertArtist(item);\n }\n\n getDiscography(params: BandModelGetDiscographyParams) {\n return this.loopFetch({\n callbackParams: { ...params },\n getFetchPromise: this.#getDiscographyFetchPromise.bind(this),\n getItemsFromFetchResult: this.#getDiscographyItemsFromFetchResult.bind(this),\n convertToEntity: this.#convertFetchedDiscographyItemToEntity.bind(this),\n pageOffset: params.pageOffset,\n pageToken: params.pageToken,\n limit: params.limit\n });\n }\n\n #getDiscographyFetchPromise(params: GetDiscographyLoopFetchCallbackParams) {\n const queryParams = {\n bandUrl: params.bandUrl,\n imageFormat: this.getAlbumImageFormat()\n };\n return bandcamp.getCache().getOrSet(\n this.getCacheKeyForFetch('discography', queryParams),\n () => bcfetch.limiter.band.getDiscography(queryParams));\n }\n\n #getDiscographyItemsFromFetchResult(result: Array) {\n return result.slice(0);\n }\n\n #convertFetchedDiscographyItemToEntity(item: Album | Track): AlbumEntity | TrackEntity {\n if (item.type === 'album') {\n return EntityConverter.convertAlbum(item);\n }\n\n return EntityConverter.convertTrack(item);\n }\n\n async getBand(bandUrl: string): Promise {\n const queryParams = {\n bandUrl,\n imageFormat: this.getArtistImageFormat()\n };\n\n const band = await bandcamp.getCache().getOrSet(\n this.getCacheKeyForFetch('band', queryParams),\n () => bcfetch.limiter.band.getInfo(queryParams));\n\n if (band.type === 'artist') {\n return EntityConverter.convertArtist(band);\n }\n\n return EntityConverter.convertLabel(band);\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"BandModel.js","sourceRoot":"","sources":["../../../src/lib/model/BandModel.ts"],"names":[],"mappings":"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","sourcesContent":["import bcfetch, { type Album, type LabelArtist, type Track } from 'bandcamp-fetch';\nimport bandcamp from '../BandcampContext';\nimport BaseModel, { type LoopFetchCallbackParams } from './BaseModel';\nimport type ArtistEntity from '../entities/ArtistEntity';\nimport EntityConverter from '../util/EntityConverter';\nimport type AlbumEntity from '../entities/AlbumEntity';\nimport type TrackEntity from '../entities/TrackEntity';\nimport type LabelEntity from '../entities/LabelEntity';\n\nexport interface BandModelGetLabelArtistsParams {\n labelUrl: string;\n pageToken?: string;\n pageOffset?: number;\n limit: number;\n}\n\nexport interface BandModelGetDiscographyParams {\n bandUrl: string;\n pageToken?: string;\n pageOffset?: number;\n limit: number;\n}\n\ninterface GetLabelArtistsLoopFetchCallbackParams extends LoopFetchCallbackParams {\n labelUrl: string;\n}\n\ninterface GetDiscographyLoopFetchCallbackParams extends LoopFetchCallbackParams {\n bandUrl: string;\n}\n\nexport default class BandModel extends BaseModel {\n\n getLabelArtists(params: BandModelGetLabelArtistsParams) {\n return this.loopFetch({\n callbackParams: { ...params },\n getFetchPromise: this.#getLabelArtistsFetchPromise.bind(this),\n getItemsFromFetchResult: this.#getLabelArtistsFromFetchResult.bind(this),\n convertToEntity: this.#convertFetchedLabelArtistToEntity.bind(this),\n pageOffset: params.pageOffset,\n pageToken: params.pageToken,\n limit: params.limit\n });\n }\n\n #getLabelArtistsFetchPromise(params: GetLabelArtistsLoopFetchCallbackParams) {\n const queryParams = {\n labelUrl: params.labelUrl,\n imageFormat: this.getArtistImageFormat()\n };\n return bandcamp.getCache().getOrSet(\n this.getCacheKeyForFetch('artists', queryParams),\n () => bcfetch.limiter.band.getLabelArtists(queryParams));\n }\n\n #getLabelArtistsFromFetchResult(result: LabelArtist[]) {\n return result.slice(0);\n }\n\n #convertFetchedLabelArtistToEntity(item: LabelArtist): ArtistEntity {\n return EntityConverter.convertArtist(item);\n }\n\n getDiscography(params: BandModelGetDiscographyParams) {\n return this.loopFetch({\n callbackParams: { ...params },\n getFetchPromise: this.#getDiscographyFetchPromise.bind(this),\n getItemsFromFetchResult: this.#getDiscographyItemsFromFetchResult.bind(this),\n convertToEntity: this.#convertFetchedDiscographyItemToEntity.bind(this),\n pageOffset: params.pageOffset,\n pageToken: params.pageToken,\n limit: params.limit\n });\n }\n\n #getDiscographyFetchPromise(params: GetDiscographyLoopFetchCallbackParams) {\n const queryParams = {\n bandUrl: params.bandUrl,\n imageFormat: this.getAlbumImageFormat()\n };\n return bandcamp.getCache().getOrSet(\n this.getCacheKeyForFetch('discography', queryParams),\n () => bcfetch.limiter.band.getDiscography(queryParams));\n }\n\n #getDiscographyItemsFromFetchResult(result: Array) {\n return result.slice(0);\n }\n\n #convertFetchedDiscographyItemToEntity(item: Album | Track): AlbumEntity | TrackEntity {\n if (item.type === 'album') {\n return EntityConverter.convertAlbum(item);\n }\n\n return EntityConverter.convertTrack(item);\n }\n\n async getBand(bandUrl: string): Promise {\n const queryParams = {\n bandUrl,\n imageFormat: this.getArtistImageFormat()\n };\n\n const band = await bandcamp.getCache().getOrSet(\n this.getCacheKeyForFetch('band', queryParams),\n () => bcfetch.limiter.band.getInfo(queryParams));\n\n if (band.type === 'artist') {\n return EntityConverter.convertArtist(band);\n }\n\n return EntityConverter.convertLabel(band);\n }\n}\n"]} \ No newline at end of file diff --git a/bandcamp/dist/lib/model/BaseModel.js b/bandcamp/dist/lib/model/BaseModel.js index c6aa60ade..02b68f562 100644 --- a/bandcamp/dist/lib/model/BaseModel.js +++ b/bandcamp/dist/lib/model/BaseModel.js @@ -35,7 +35,6 @@ class BaseModel { return 'bio_app'; } } -exports.default = BaseModel; _BaseModel_instances = new WeakSet(), _BaseModel_doLoopFetch = async function _BaseModel_doLoopFetch(params, currentList = [], iteration = 1) { const pageOffset = params.pageOffset || 0; const limit = params.limit || 47; @@ -117,4 +116,5 @@ _BaseModel_instances = new WeakSet(), _BaseModel_doLoopFetch = async function _B } return result; }; +exports.default = BaseModel; //# sourceMappingURL=BaseModel.js.map \ No newline at end of file diff --git a/bandcamp/dist/lib/model/BaseModel.js.map b/bandcamp/dist/lib/model/BaseModel.js.map index 6ce6daf21..dfd22556b 100644 --- a/bandcamp/dist/lib/model/BaseModel.js.map +++ b/bandcamp/dist/lib/model/BaseModel.js.map @@ -1 +1 @@ -{"version":3,"file":"BaseModel.js","sourceRoot":"","sources":["../../../src/lib/model/BaseModel.ts"],"names":[],"mappings":"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","sourcesContent":["import md5 from 'md5';\n\nexport interface LoopFetchParams> extends LoopFetchCallbackParams {\n callbackParams?: C;\n getFetchPromise: (params: C) => Promise;\n getItemsFromFetchResult: (fetchResult: R, params: C) => I[];\n filterFetchedItem?: (item: I, params: C) => boolean;\n getNextPageTokenFromFetchResult?: (fetchResult: R, params: C) => string | null;\n convertToEntity: (item: I, params: C) => E | null;\n onEnd?:(result: LoopFetchResult, lastFetchResult: R, params: C) => F;\n maxIterations?: number;\n pageOffset?: number;\n limit?: number;\n}\n\nexport interface LoopFetchCallbackParams {\n pageToken?: string;\n}\n\nexport interface LoopFetchResult {\n items: E[];\n nextPageToken: string | null;\n nextPageOffset: number;\n}\n\nexport default class BaseModel {\n\n async #doLoopFetch>(\n params: LoopFetchParams & { onEnd: undefined }, currentList?: I[], iteration?: number): Promise>;\n async #doLoopFetch>(\n params: LoopFetchParams, currentList?: I[], iteration?: number): Promise;\n async #doLoopFetch>(\n params: LoopFetchParams, currentList: I[] = [], iteration = 1): Promise | F> {\n\n const pageOffset = params.pageOffset || 0;\n const limit = params.limit || 47;\n const callbackParams = { ...params.callbackParams } as C;\n if (params.pageToken) {\n callbackParams.pageToken = params.pageToken;\n }\n\n const fetchResult = await params.getFetchPromise(callbackParams);\n\n let items = params.getItemsFromFetchResult(fetchResult, callbackParams);\n if (pageOffset) {\n items.splice(0, pageOffset);\n }\n // Number of items to add before hitting limit\n const itemCountToLimit = limit - currentList.length;\n\n let nextPageOffset = 0;\n const filter = params.filterFetchedItem;\n if (items.length > 0 && filter) {\n let itemOffset = 0;\n let includeCount = 0;\n const filtered = items.filter((item) => {\n if (includeCount >= itemCountToLimit) {\n return false;\n }\n const inc = filter(item, callbackParams);\n if (inc) {\n includeCount++;\n }\n itemOffset++;\n return inc;\n });\n if (itemOffset === items.length) {\n nextPageOffset = 0;\n }\n else {\n nextPageOffset = itemOffset + pageOffset;\n }\n items = filtered;\n }\n else if (items) {\n if (items.length > itemCountToLimit) {\n items.splice(itemCountToLimit);\n nextPageOffset = items.length + pageOffset;\n }\n else {\n nextPageOffset = 0;\n }\n }\n currentList = [ ...currentList, ...items ];\n\n let nextPageToken;\n if (nextPageOffset > 0 && params.pageToken) {\n nextPageToken = params.pageToken;\n }\n else if (nextPageOffset === 0 && params.getNextPageTokenFromFetchResult) {\n nextPageToken = params.getNextPageTokenFromFetchResult(fetchResult, callbackParams);\n }\n else {\n nextPageToken = null;\n }\n\n iteration++;\n const maxFetchIterationsReached = params.maxIterations !== undefined && iteration > params.maxIterations;\n if (!maxFetchIterationsReached && currentList.length < limit && nextPageToken) { // Get more items\n params.pageToken = nextPageToken;\n params.pageOffset = 0;\n return await this.#doLoopFetch(params, currentList, iteration);\n }\n\n const result: LoopFetchResult = {\n items: currentList.reduce((reduced, item) => {\n const entity = params.convertToEntity(item, callbackParams);\n if (entity) {\n reduced.push(entity);\n }\n return reduced;\n }, []),\n nextPageToken: maxFetchIterationsReached ? null : nextPageToken,\n nextPageOffset: maxFetchIterationsReached ? 0 : nextPageOffset\n };\n if (params.onEnd) {\n return params.onEnd(result, fetchResult, callbackParams);\n }\n return result;\n\n }\n\n loopFetch>(params: LoopFetchParams) {\n return this.#doLoopFetch({ ...params });\n }\n\n protected getCacheKeyForFetch(resourceName: string, cacheKeyParams?: Record) {\n const prefix = `bandcamp.model.${resourceName}`;\n\n if (!cacheKeyParams) {\n return md5(prefix);\n }\n\n const key = Object.keys(cacheKeyParams).sort().reduce((s, k) => {\n const p = `${k}=${encodeURIComponent(JSON.stringify(cacheKeyParams[k]))}`;\n return `${s}@${p}`;\n }, prefix);\n\n return md5(key);\n }\n\n protected getAlbumImageFormat() {\n return 'art_app_large';\n }\n\n protected getArtistImageFormat() {\n return 'bio_app';\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"BaseModel.js","sourceRoot":"","sources":["../../../src/lib/model/BaseModel.ts"],"names":[],"mappings":"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","sourcesContent":["import md5 from 'md5';\n\nexport interface LoopFetchParams> extends LoopFetchCallbackParams {\n callbackParams?: C;\n getFetchPromise: (params: C) => Promise;\n getItemsFromFetchResult: (fetchResult: R, params: C) => I[];\n filterFetchedItem?: (item: I, params: C) => boolean;\n getNextPageTokenFromFetchResult?: (fetchResult: R, params: C) => string | null;\n convertToEntity: (item: I, params: C) => E | null;\n onEnd?:(result: LoopFetchResult, lastFetchResult: R, params: C) => F;\n maxIterations?: number;\n pageOffset?: number;\n limit?: number;\n}\n\nexport interface LoopFetchCallbackParams {\n pageToken?: string;\n}\n\nexport interface LoopFetchResult {\n items: E[];\n nextPageToken: string | null;\n nextPageOffset: number;\n}\n\nexport default class BaseModel {\n\n async #doLoopFetch>(\n params: LoopFetchParams & { onEnd: undefined }, currentList?: I[], iteration?: number): Promise>;\n async #doLoopFetch>(\n params: LoopFetchParams, currentList?: I[], iteration?: number): Promise;\n async #doLoopFetch>(\n params: LoopFetchParams, currentList: I[] = [], iteration = 1): Promise | F> {\n\n const pageOffset = params.pageOffset || 0;\n const limit = params.limit || 47;\n const callbackParams = { ...params.callbackParams } as C;\n if (params.pageToken) {\n callbackParams.pageToken = params.pageToken;\n }\n\n const fetchResult = await params.getFetchPromise(callbackParams);\n\n let items = params.getItemsFromFetchResult(fetchResult, callbackParams);\n if (pageOffset) {\n items.splice(0, pageOffset);\n }\n // Number of items to add before hitting limit\n const itemCountToLimit = limit - currentList.length;\n\n let nextPageOffset = 0;\n const filter = params.filterFetchedItem;\n if (items.length > 0 && filter) {\n let itemOffset = 0;\n let includeCount = 0;\n const filtered = items.filter((item) => {\n if (includeCount >= itemCountToLimit) {\n return false;\n }\n const inc = filter(item, callbackParams);\n if (inc) {\n includeCount++;\n }\n itemOffset++;\n return inc;\n });\n if (itemOffset === items.length) {\n nextPageOffset = 0;\n }\n else {\n nextPageOffset = itemOffset + pageOffset;\n }\n items = filtered;\n }\n else if (items) {\n if (items.length > itemCountToLimit) {\n items.splice(itemCountToLimit);\n nextPageOffset = items.length + pageOffset;\n }\n else {\n nextPageOffset = 0;\n }\n }\n currentList = [ ...currentList, ...items ];\n\n let nextPageToken;\n if (nextPageOffset > 0 && params.pageToken) {\n nextPageToken = params.pageToken;\n }\n else if (nextPageOffset === 0 && params.getNextPageTokenFromFetchResult) {\n nextPageToken = params.getNextPageTokenFromFetchResult(fetchResult, callbackParams);\n }\n else {\n nextPageToken = null;\n }\n\n iteration++;\n const maxFetchIterationsReached = params.maxIterations !== undefined && iteration > params.maxIterations;\n if (!maxFetchIterationsReached && currentList.length < limit && nextPageToken) { // Get more items\n params.pageToken = nextPageToken;\n params.pageOffset = 0;\n return await this.#doLoopFetch(params, currentList, iteration);\n }\n\n const result: LoopFetchResult = {\n items: currentList.reduce((reduced, item) => {\n const entity = params.convertToEntity(item, callbackParams);\n if (entity) {\n reduced.push(entity);\n }\n return reduced;\n }, []),\n nextPageToken: maxFetchIterationsReached ? null : nextPageToken,\n nextPageOffset: maxFetchIterationsReached ? 0 : nextPageOffset\n };\n if (params.onEnd) {\n return params.onEnd(result, fetchResult, callbackParams);\n }\n return result;\n\n }\n\n loopFetch>(params: LoopFetchParams) {\n return this.#doLoopFetch({ ...params });\n }\n\n protected getCacheKeyForFetch(resourceName: string, cacheKeyParams?: Record) {\n const prefix = `bandcamp.model.${resourceName}`;\n\n if (!cacheKeyParams) {\n return md5(prefix);\n }\n\n const key = Object.keys(cacheKeyParams).sort().reduce((s, k) => {\n const p = `${k}=${encodeURIComponent(JSON.stringify(cacheKeyParams[k]))}`;\n return `${s}@${p}`;\n }, prefix);\n\n return md5(key);\n }\n\n protected getAlbumImageFormat() {\n return 'art_app_large';\n }\n\n protected getArtistImageFormat() {\n return 'bio_app';\n }\n}\n"]} \ No newline at end of file diff --git a/bandcamp/dist/lib/model/DiscoverModel.d.ts b/bandcamp/dist/lib/model/DiscoverModel.d.ts index 5811bb33c..f3d976265 100644 --- a/bandcamp/dist/lib/model/DiscoverModel.d.ts +++ b/bandcamp/dist/lib/model/DiscoverModel.d.ts @@ -1,6 +1,6 @@ -import { DiscoverParams } from 'bandcamp-fetch'; -import BaseModel, { LoopFetchResult } from './BaseModel'; -import AlbumEntity from '../entities/AlbumEntity'; +import { type DiscoverParams } from 'bandcamp-fetch'; +import BaseModel, { type LoopFetchResult } from './BaseModel'; +import type AlbumEntity from '../entities/AlbumEntity'; export interface DiscoveryModelGetDiscoverResultParams { discoverParams: DiscoverParams; pageToken?: string; diff --git a/bandcamp/dist/lib/model/DiscoverModel.d.ts.map b/bandcamp/dist/lib/model/DiscoverModel.d.ts.map index eba86843a..545fb5716 100644 --- a/bandcamp/dist/lib/model/DiscoverModel.d.ts.map +++ b/bandcamp/dist/lib/model/DiscoverModel.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"DiscoverModel.d.ts","sourceRoot":"","sources":["../../../src/lib/model/DiscoverModel.ts"],"names":[],"mappings":"AAAA,OAAgB,EAAS,cAAc,EAAkB,MAAM,gBAAgB,CAAC;AAEhF,OAAO,SAAS,EAAE,EAA2B,eAAe,EAAE,MAAM,aAAa,CAAC;AAClF,OAAO,WAAW,MAAM,yBAAyB,CAAC;AAGlD,MAAM,WAAW,qCAAqC;IACpD,cAAc,EAAE,cAAc,CAAC;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;CACf;AAMD,MAAM,WAAW,uBAAwB,SAAQ,eAAe,CAAC,WAAW,CAAC;IAC3E,MAAM,EAAE,cAAc,CAAC;CACxB;AAED,MAAM,CAAC,OAAO,OAAO,aAAc,SAAQ,SAAS;;IAElD,iBAAiB,CAAC,MAAM,EAAE,qCAAqC;IAqE/D,kBAAkB;CAKnB"} \ No newline at end of file +{"version":3,"file":"DiscoverModel.d.ts","sourceRoot":"","sources":["../../../src/lib/model/DiscoverModel.ts"],"names":[],"mappings":"AAAA,OAAgB,EAAc,KAAK,cAAc,EAAwD,MAAM,gBAAgB,CAAC;AAEhI,OAAO,SAAS,EAAE,EAAgC,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AAC5F,OAAO,KAAK,WAAW,MAAM,yBAAyB,CAAC;AAGvD,MAAM,WAAW,qCAAqC;IACpD,cAAc,EAAE,cAAc,CAAC;IAC/B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;CACf;AAMD,MAAM,WAAW,uBAAwB,SAAQ,eAAe,CAAC,WAAW,CAAC;IAC3E,MAAM,EAAE,cAAc,CAAC;CACxB;AAED,MAAM,CAAC,OAAO,OAAO,aAAc,SAAQ,SAAS;;IAElD,iBAAiB,CAAC,MAAM,EAAE,qCAAqC;IAqE/D,kBAAkB;CAUnB"} \ No newline at end of file diff --git a/bandcamp/dist/lib/model/DiscoverModel.js b/bandcamp/dist/lib/model/DiscoverModel.js index 7311cfd83..291f63af5 100644 --- a/bandcamp/dist/lib/model/DiscoverModel.js +++ b/bandcamp/dist/lib/model/DiscoverModel.js @@ -32,35 +32,40 @@ class DiscoverModel extends BaseModel_1.default { }); } getDiscoverOptions() { - return BandcampContext_1.default.getCache().getOrSet(this.getCacheKeyForFetch('discoverOptions'), () => bandcamp_fetch_1.default.limiter.discovery.getAvailableOptions()); + return BandcampContext_1.default.getCache().getOrSet(this.getCacheKeyForFetch('discoverOptions'), async () => { + const opts = await bandcamp_fetch_1.default.limiter.discovery.getAvailableOptions(); + opts.categories = opts.categories.filter((cat) => cat.slug !== 'tshirt'); + return opts; + }); } } -exports.default = DiscoverModel; _DiscoverModel_instances = new WeakSet(), _DiscoverModel_getDiscoverResultFetchPromise = function _DiscoverModel_getDiscoverResultFetchPromise(params) { - let page = 0; - if (params.pageToken) { - const parsedPageToken = JSON.parse(params.pageToken); - page = parsedPageToken?.page || 0; - } - const queryParams = { - ...params.discoverParams, - page, - albumImageFormat: this.getAlbumImageFormat(), - artistImageFormat: this.getArtistImageFormat() - }; + const queryParams = (() => { + if (params.pageToken) { + const parsedPageToken = JSON.parse(params.pageToken); + const continuation = parsedPageToken?.continuation; + if (continuation) { + return continuation; + } + } + return { + ...params.discoverParams, + albumImageFormat: this.getAlbumImageFormat(), + artistImageFormat: this.getArtistImageFormat() + }; + })(); return BandcampContext_1.default.getCache().getOrSet(this.getCacheKeyForFetch('discover', queryParams), () => bandcamp_fetch_1.default.limiter.discovery.discover(queryParams)); }, _DiscoverModel_getDiscoverItemsFromFetchResult = function _DiscoverModel_getDiscoverItemsFromFetchResult(result) { - return result.items.slice(0); + return result.items.filter((value) => value.type === 'album'); }, _DiscoverModel_getNextPageTokenFromDiscoverFetchResult = function _DiscoverModel_getNextPageTokenFromDiscoverFetchResult(result, params) { - let page = 0, indexRef = 0; + let indexRef = 0; if (params.pageToken) { const parsedPageToken = JSON.parse(params.pageToken); - page = parsedPageToken?.page || 0; indexRef = parsedPageToken?.indexRef || 0; } - if (result.items.length > 0 && result.total > indexRef + result.items.length) { + if (result.continuation && result.items.length > 0 && result.total > indexRef + result.items.length) { const nextPageToken = { - page: page + 1, + continuation: result.continuation, indexRef: indexRef + result.items.length }; return JSON.stringify(nextPageToken); @@ -73,7 +78,7 @@ _DiscoverModel_instances = new WeakSet(), _DiscoverModel_getDiscoverResultFetchP ...result, params: lastFetchResult.params }; - delete r.params.page; return r; }; +exports.default = DiscoverModel; //# sourceMappingURL=DiscoverModel.js.map \ No newline at end of file diff --git a/bandcamp/dist/lib/model/DiscoverModel.js.map b/bandcamp/dist/lib/model/DiscoverModel.js.map index 60acacca9..29836ab20 100644 --- a/bandcamp/dist/lib/model/DiscoverModel.js.map +++ b/bandcamp/dist/lib/model/DiscoverModel.js.map @@ -1 +1 @@ -{"version":3,"file":"DiscoverModel.js","sourceRoot":"","sources":["../../../src/lib/model/DiscoverModel.ts"],"names":[],"mappings":"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","sourcesContent":["import bcfetch, { Album, DiscoverParams, DiscoverResult } from 'bandcamp-fetch';\nimport bandcamp from '../BandcampContext';\nimport BaseModel, { LoopFetchCallbackParams, LoopFetchResult } from './BaseModel';\nimport AlbumEntity from '../entities/AlbumEntity';\nimport EntityConverter from '../util/EntityConverter';\n\nexport interface DiscoveryModelGetDiscoverResultParams {\n discoverParams: DiscoverParams;\n pageToken?: string;\n pageOffset?: number;\n limit: number;\n}\n\ninterface GetDiscoverResultLoopFetchCallbackParams extends LoopFetchCallbackParams {\n discoverParams: DiscoverParams;\n}\n\nexport interface DiscoverLoopFetchResult extends LoopFetchResult {\n params: DiscoverParams;\n}\n\nexport default class DiscoverModel extends BaseModel {\n\n getDiscoverResult(params: DiscoveryModelGetDiscoverResultParams) {\n return this.loopFetch({\n callbackParams: { ...params },\n getFetchPromise: this.#getDiscoverResultFetchPromise.bind(this),\n getItemsFromFetchResult: this.#getDiscoverItemsFromFetchResult.bind(this),\n getNextPageTokenFromFetchResult: this.#getNextPageTokenFromDiscoverFetchResult.bind(this),\n convertToEntity: this.#convertFetchedDiscoverItemToEntity.bind(this),\n onEnd: this.#onDiscoverLoopFetchEnd.bind(this),\n pageOffset: params.pageOffset,\n pageToken: params.pageToken,\n limit: params.limit\n });\n }\n\n #getDiscoverResultFetchPromise(params: GetDiscoverResultLoopFetchCallbackParams) {\n let page = 0;\n if (params.pageToken) {\n const parsedPageToken = JSON.parse(params.pageToken);\n page = parsedPageToken?.page || 0;\n }\n\n const queryParams: DiscoverParams = {\n ...params.discoverParams,\n page,\n albumImageFormat: this.getAlbumImageFormat(),\n artistImageFormat: this.getArtistImageFormat()\n };\n\n return bandcamp.getCache().getOrSet(\n this.getCacheKeyForFetch('discover', queryParams),\n () => bcfetch.limiter.discovery.discover(queryParams));\n }\n\n #getDiscoverItemsFromFetchResult(result: DiscoverResult) {\n return result.items.slice(0);\n }\n\n #getNextPageTokenFromDiscoverFetchResult(result: DiscoverResult, params: GetDiscoverResultLoopFetchCallbackParams) {\n let page = 0, indexRef = 0;\n if (params.pageToken) {\n const parsedPageToken = JSON.parse(params.pageToken);\n page = parsedPageToken?.page || 0;\n indexRef = parsedPageToken?.indexRef || 0;\n }\n if (result.items.length > 0 && result.total > indexRef + result.items.length) {\n const nextPageToken = {\n page: page + 1,\n indexRef: indexRef + result.items.length\n };\n return JSON.stringify(nextPageToken);\n }\n\n return null;\n }\n\n #convertFetchedDiscoverItemToEntity(item: Album): AlbumEntity {\n return EntityConverter.convertAlbum(item);\n }\n\n #onDiscoverLoopFetchEnd(result: LoopFetchResult, lastFetchResult: DiscoverResult) {\n const r: DiscoverLoopFetchResult = {\n ...result,\n params: lastFetchResult.params\n };\n delete r.params.page;\n return r;\n }\n\n\n getDiscoverOptions() {\n return bandcamp.getCache().getOrSet(\n this.getCacheKeyForFetch('discoverOptions'),\n () => bcfetch.limiter.discovery.getAvailableOptions());\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"DiscoverModel.js","sourceRoot":"","sources":["../../../src/lib/model/DiscoverModel.ts"],"names":[],"mappings":"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","sourcesContent":["import bcfetch, { type Album, type DiscoverParams, type DiscoverResult, type DiscoverResultContinuation } from 'bandcamp-fetch';\nimport bandcamp from '../BandcampContext';\nimport BaseModel, { type LoopFetchCallbackParams, type LoopFetchResult } from './BaseModel';\nimport type AlbumEntity from '../entities/AlbumEntity';\nimport EntityConverter from '../util/EntityConverter';\n\nexport interface DiscoveryModelGetDiscoverResultParams {\n discoverParams: DiscoverParams;\n pageToken?: string;\n pageOffset?: number;\n limit: number;\n}\n\ninterface GetDiscoverResultLoopFetchCallbackParams extends LoopFetchCallbackParams {\n discoverParams: DiscoverParams;\n}\n\nexport interface DiscoverLoopFetchResult extends LoopFetchResult {\n params: DiscoverParams;\n}\n\nexport default class DiscoverModel extends BaseModel {\n\n getDiscoverResult(params: DiscoveryModelGetDiscoverResultParams) {\n return this.loopFetch({\n callbackParams: { ...params },\n getFetchPromise: this.#getDiscoverResultFetchPromise.bind(this),\n getItemsFromFetchResult: this.#getDiscoverItemsFromFetchResult.bind(this),\n getNextPageTokenFromFetchResult: this.#getNextPageTokenFromDiscoverFetchResult.bind(this),\n convertToEntity: this.#convertFetchedDiscoverItemToEntity.bind(this),\n onEnd: this.#onDiscoverLoopFetchEnd.bind(this),\n pageOffset: params.pageOffset,\n pageToken: params.pageToken,\n limit: params.limit\n });\n }\n\n #getDiscoverResultFetchPromise(params: GetDiscoverResultLoopFetchCallbackParams) {\n const queryParams = ((): DiscoverParams | DiscoverResultContinuation => {\n if (params.pageToken) {\n const parsedPageToken = JSON.parse(params.pageToken);\n const continuation = parsedPageToken?.continuation;\n if (continuation) {\n return continuation;\n }\n }\n return {\n ...params.discoverParams,\n albumImageFormat: this.getAlbumImageFormat(),\n artistImageFormat: this.getArtistImageFormat()\n };\n })();\n\n return bandcamp.getCache().getOrSet(\n this.getCacheKeyForFetch('discover', queryParams),\n () => bcfetch.limiter.discovery.discover(queryParams));\n }\n\n #getDiscoverItemsFromFetchResult(result: DiscoverResult) {\n return result.items.filter((value) => value.type === 'album');\n }\n\n #getNextPageTokenFromDiscoverFetchResult(result: DiscoverResult, params: GetDiscoverResultLoopFetchCallbackParams) {\n let indexRef = 0;\n if (params.pageToken) {\n const parsedPageToken = JSON.parse(params.pageToken);\n indexRef = parsedPageToken?.indexRef || 0;\n }\n if (result.continuation && result.items.length > 0 && result.total > indexRef + result.items.length) {\n const nextPageToken = {\n continuation: result.continuation,\n indexRef: indexRef + result.items.length\n };\n return JSON.stringify(nextPageToken);\n }\n\n return null;\n }\n\n #convertFetchedDiscoverItemToEntity(item: Album): AlbumEntity {\n return EntityConverter.convertAlbum(item);\n }\n\n #onDiscoverLoopFetchEnd(result: LoopFetchResult, lastFetchResult: DiscoverResult) {\n const r: DiscoverLoopFetchResult = {\n ...result,\n params: lastFetchResult.params\n };\n return r;\n }\n\n\n getDiscoverOptions() {\n return bandcamp.getCache().getOrSet(\n this.getCacheKeyForFetch('discoverOptions'),\n async () => {\n const opts = await bcfetch.limiter.discovery.getAvailableOptions();\n opts.categories = opts.categories.filter((cat) => cat.slug !== 'tshirt');\n return opts;\n }\n );\n }\n}\n"]} \ No newline at end of file diff --git a/bandcamp/dist/lib/model/FanModel.d.ts b/bandcamp/dist/lib/model/FanModel.d.ts index 9095389e7..ee25e6c4f 100644 --- a/bandcamp/dist/lib/model/FanModel.d.ts +++ b/bandcamp/dist/lib/model/FanModel.d.ts @@ -1,8 +1,8 @@ -import BaseModel, { LoopFetchResult } from './BaseModel'; -import BandEntity from '../entities/BandEntity'; -import AlbumEntity from '../entities/AlbumEntity'; -import TrackEntity from '../entities/TrackEntity'; -import TagEntity from '../entities/TagEntity'; +import BaseModel, { type LoopFetchResult } from './BaseModel'; +import type BandEntity from '../entities/BandEntity'; +import type AlbumEntity from '../entities/AlbumEntity'; +import type TrackEntity from '../entities/TrackEntity'; +import type TagEntity from '../entities/TagEntity'; export interface FanModelGetFanItemsParams { username: string; pageToken?: string; @@ -11,7 +11,7 @@ export interface FanModelGetFanItemsParams { } export default class FanModel extends BaseModel { #private; - getInfo(username?: string): Promise; + getInfo(username?: string): Promise; getCollection(params: FanModelGetFanItemsParams): Promise>; getWishlist(params: FanModelGetFanItemsParams): Promise>; getFollowingArtistsAndLabels(params: FanModelGetFanItemsParams): Promise>; diff --git a/bandcamp/dist/lib/model/FanModel.d.ts.map b/bandcamp/dist/lib/model/FanModel.d.ts.map index 17cc3e8b1..d158b1925 100644 --- a/bandcamp/dist/lib/model/FanModel.d.ts.map +++ b/bandcamp/dist/lib/model/FanModel.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"FanModel.d.ts","sourceRoot":"","sources":["../../../src/lib/model/FanModel.ts"],"names":[],"mappings":"AAEA,OAAO,SAAS,EAAE,EAA2B,eAAe,EAAE,MAAM,aAAa,CAAC;AAClF,OAAO,UAAU,MAAM,wBAAwB,CAAC;AAChD,OAAO,WAAW,MAAM,yBAAyB,CAAC;AAClD,OAAO,WAAW,MAAM,yBAAyB,CAAC;AAClD,OAAO,SAAS,MAAM,uBAAuB,CAAC;AAW9C,MAAM,WAAW,yBAAyB;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;CACf;AASD,MAAM,CAAC,OAAO,OAAO,QAAS,SAAQ,SAAS;;IAE7C,OAAO,CAAC,QAAQ,CAAC,EAAE,MAAM;IAezB,aAAa,CAAC,MAAM,EAAE,yBAAyB;IAI/C,WAAW,CAAC,MAAM,EAAE,yBAAyB;IAI7C,4BAA4B,CAAC,MAAM,EAAE,yBAAyB;IAI9D,kBAAkB,CAAC,MAAM,EAAE,yBAAyB;CAsFrD"} \ No newline at end of file +{"version":3,"file":"FanModel.d.ts","sourceRoot":"","sources":["../../../src/lib/model/FanModel.ts"],"names":[],"mappings":"AAEA,OAAO,SAAS,EAAE,EAAgC,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AAC5F,OAAO,KAAK,UAAU,MAAM,wBAAwB,CAAC;AACrD,OAAO,KAAK,WAAW,MAAM,yBAAyB,CAAC;AACvD,OAAO,KAAK,WAAW,MAAM,yBAAyB,CAAC;AACvD,OAAO,KAAK,SAAS,MAAM,uBAAuB,CAAC;AAWnD,MAAM,WAAW,yBAAyB;IACxC,QAAQ,EAAE,MAAM,CAAC;IACjB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;CACf;AASD,MAAM,CAAC,OAAO,OAAO,QAAS,SAAQ,SAAS;;IAE7C,OAAO,CAAC,QAAQ,CAAC,EAAE,MAAM;IAezB,aAAa,CAAC,MAAM,EAAE,yBAAyB;IAI/C,WAAW,CAAC,MAAM,EAAE,yBAAyB;IAI7C,4BAA4B,CAAC,MAAM,EAAE,yBAAyB;IAI9D,kBAAkB,CAAC,MAAM,EAAE,yBAAyB;CAsFrD"} \ No newline at end of file diff --git a/bandcamp/dist/lib/model/FanModel.js b/bandcamp/dist/lib/model/FanModel.js index 74d901868..7271c6b2d 100644 --- a/bandcamp/dist/lib/model/FanModel.js +++ b/bandcamp/dist/lib/model/FanModel.js @@ -51,7 +51,6 @@ class FanModel extends BaseModel_1.default { return __classPrivateFieldGet(this, _FanModel_instances, "m", _FanModel_getFanItems).call(this, params, FanItemType.FollowingGenres); } } -exports.default = FanModel; _FanModel_instances = new WeakSet(), _FanModel_getFanItems = function _FanModel_getFanItems(params, itemType) { return this.loopFetch({ callbackParams: { ...params, itemType }, @@ -111,4 +110,5 @@ _FanModel_instances = new WeakSet(), _FanModel_getFanItems = function _FanModel_ return EntityConverter_1.default.convertBand(item); } }; +exports.default = FanModel; //# sourceMappingURL=FanModel.js.map \ No newline at end of file diff --git a/bandcamp/dist/lib/model/FanModel.js.map b/bandcamp/dist/lib/model/FanModel.js.map index 28656d9ce..468077779 100644 --- a/bandcamp/dist/lib/model/FanModel.js.map +++ b/bandcamp/dist/lib/model/FanModel.js.map @@ -1 +1 @@ -{"version":3,"file":"FanModel.js","sourceRoot":"","sources":["../../../src/lib/model/FanModel.ts"],"names":[],"mappings":"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","sourcesContent":["import bcfetch, { Album, FanAPIGetInfoParams, FanContinuationItemsResult, FanPageItemsResult, Tag, Track, UserKind } from 'bandcamp-fetch';\nimport bandcamp from '../BandcampContext';\nimport BaseModel, { LoopFetchCallbackParams, LoopFetchResult } from './BaseModel';\nimport BandEntity from '../entities/BandEntity';\nimport AlbumEntity from '../entities/AlbumEntity';\nimport TrackEntity from '../entities/TrackEntity';\nimport TagEntity from '../entities/TagEntity';\nimport EntityConverter from '../util/EntityConverter';\nimport Model from '.';\n\nenum FanItemType {\n Collection = 'Collection',\n Wishlist = 'Wishlist',\n FollowingArtistsAndLabels = 'FollowingArtistsAndLabels',\n FollowingGenres = 'FollowingGenres'\n}\n\nexport interface FanModelGetFanItemsParams {\n username: string;\n pageToken?: string;\n pageOffset?: number;\n limit: number;\n}\n\ninterface GetFanItemsLoopFetchCallbackParams extends LoopFetchCallbackParams {\n username: string;\n itemType: FanItemType;\n}\n\ntype FanItem = Album | Track | UserKind | Tag;\n\nexport default class FanModel extends BaseModel {\n\n getInfo(username?: string) {\n const queryParams: FanAPIGetInfoParams = {\n imageFormat: this.getArtistImageFormat()\n };\n if (username) {\n queryParams.username = username;\n }\n else if (!Model.cookie) {\n throw Error('No cookie set');\n }\n return bandcamp.getCache().getOrSet(\n this.getCacheKeyForFetch('fanInfo', queryParams),\n () => bcfetch.limiter.fan.getInfo(queryParams));\n }\n\n getCollection(params: FanModelGetFanItemsParams) {\n return this.#getFanItems(params, FanItemType.Collection);\n }\n\n getWishlist(params: FanModelGetFanItemsParams) {\n return this.#getFanItems(params, FanItemType.Wishlist);\n }\n\n getFollowingArtistsAndLabels(params: FanModelGetFanItemsParams) {\n return this.#getFanItems(params, FanItemType.FollowingArtistsAndLabels);\n }\n\n getFollowingGenres(params: FanModelGetFanItemsParams) {\n return this.#getFanItems(params, FanItemType.FollowingGenres);\n }\n\n #getFanItems(params: FanModelGetFanItemsParams, itemType: FanItemType.Collection): Promise>;\n #getFanItems(params: FanModelGetFanItemsParams, itemType: FanItemType.Wishlist): Promise>;\n #getFanItems(params: FanModelGetFanItemsParams, itemType: FanItemType.FollowingArtistsAndLabels): Promise>;\n #getFanItems(params: FanModelGetFanItemsParams, itemType: FanItemType.FollowingGenres): Promise>;\n #getFanItems(params: FanModelGetFanItemsParams, itemType: FanItemType): Promise> {\n return this.loopFetch({\n callbackParams: { ...params, itemType },\n getFetchPromise: this.#getFanItemsFetchPromise.bind(this),\n getItemsFromFetchResult: this.#getFanItemsFromFetchResult.bind(this),\n getNextPageTokenFromFetchResult: this.#getNextPageTokenFromFanItemsFetchResult.bind(this),\n convertToEntity: this.#convertFetchedFanItemToEntity.bind(this),\n pageOffset: params.pageOffset,\n pageToken: params.pageToken,\n limit: params.limit\n });\n }\n\n #getFanItemsFetchPromise(params: GetFanItemsLoopFetchCallbackParams): Promise | FanContinuationItemsResult> {\n const continuationToken = params.pageToken ? JSON.parse(params.pageToken) : null;\n const cacheKeyParams: Record = {\n username: params.username\n };\n if (continuationToken) {\n cacheKeyParams.continuationToken = JSON.stringify(continuationToken);\n }\n const target = continuationToken || params.username;\n switch (params.itemType) {\n case FanItemType.Collection:\n return bandcamp.getCache().getOrSet(\n this.getCacheKeyForFetch('fanCollection', cacheKeyParams),\n () => bcfetch.limiter.fan.getCollection({\n target,\n imageFormat: this.getAlbumImageFormat()\n }));\n\n case FanItemType.Wishlist:\n return bandcamp.getCache().getOrSet(\n this.getCacheKeyForFetch('fanWishlist', cacheKeyParams),\n () => bcfetch.limiter.fan.getWishlist({\n target,\n imageFormat: this.getAlbumImageFormat()\n }));\n\n case FanItemType.FollowingArtistsAndLabels:\n return bandcamp.getCache().getOrSet(\n this.getCacheKeyForFetch('fanFollowingArtistsAndLabels', cacheKeyParams),\n () => bcfetch.limiter.fan.getFollowingArtistsAndLabels({\n target,\n imageFormat: this.getArtistImageFormat()\n }));\n\n default:\n case FanItemType.FollowingGenres:\n return bandcamp.getCache().getOrSet(\n this.getCacheKeyForFetch('fanFollowingGenres', cacheKeyParams),\n () => bcfetch.limiter.fan.getFollowingGenres({\n target,\n imageFormat: this.getAlbumImageFormat()\n }));\n }\n }\n\n #getFanItemsFromFetchResult(result: FanPageItemsResult | FanContinuationItemsResult) {\n return result.items.slice(0);\n }\n\n #getNextPageTokenFromFanItemsFetchResult(result: FanPageItemsResult | FanContinuationItemsResult) {\n return result.continuation ? JSON.stringify(result.continuation) : null;\n }\n\n #convertFetchedFanItemToEntity(item: FanItem): BandEntity | AlbumEntity | TrackEntity | TagEntity {\n switch ((item as any).type) {\n case 'album':\n return EntityConverter.convertAlbum(item as Album);\n case 'track':\n return EntityConverter.convertTrack(item as Track);\n case 'tag': // Following genres are tags\n return EntityConverter.convertTag(item as Tag);\n default: // UserKind (following artists / labels) does not have 'tag'\n return EntityConverter.convertBand(item as UserKind);\n }\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"FanModel.js","sourceRoot":"","sources":["../../../src/lib/model/FanModel.ts"],"names":[],"mappings":"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","sourcesContent":["import bcfetch, { type Album, type FanAPIGetInfoParams, type FanContinuationItemsResult, type FanPageItemsResult, type Tag, type Track, type UserKind } from 'bandcamp-fetch';\nimport bandcamp from '../BandcampContext';\nimport BaseModel, { type LoopFetchCallbackParams, type LoopFetchResult } from './BaseModel';\nimport type BandEntity from '../entities/BandEntity';\nimport type AlbumEntity from '../entities/AlbumEntity';\nimport type TrackEntity from '../entities/TrackEntity';\nimport type TagEntity from '../entities/TagEntity';\nimport EntityConverter from '../util/EntityConverter';\nimport Model from '.';\n\nenum FanItemType {\n Collection = 'Collection',\n Wishlist = 'Wishlist',\n FollowingArtistsAndLabels = 'FollowingArtistsAndLabels',\n FollowingGenres = 'FollowingGenres'\n}\n\nexport interface FanModelGetFanItemsParams {\n username: string;\n pageToken?: string;\n pageOffset?: number;\n limit: number;\n}\n\ninterface GetFanItemsLoopFetchCallbackParams extends LoopFetchCallbackParams {\n username: string;\n itemType: FanItemType;\n}\n\ntype FanItem = Album | Track | UserKind | Tag;\n\nexport default class FanModel extends BaseModel {\n\n getInfo(username?: string) {\n const queryParams: FanAPIGetInfoParams = {\n imageFormat: this.getArtistImageFormat()\n };\n if (username) {\n queryParams.username = username;\n }\n else if (!Model.cookie) {\n throw Error('No cookie set');\n }\n return bandcamp.getCache().getOrSet(\n this.getCacheKeyForFetch('fanInfo', queryParams),\n () => bcfetch.limiter.fan.getInfo(queryParams));\n }\n\n getCollection(params: FanModelGetFanItemsParams) {\n return this.#getFanItems(params, FanItemType.Collection);\n }\n\n getWishlist(params: FanModelGetFanItemsParams) {\n return this.#getFanItems(params, FanItemType.Wishlist);\n }\n\n getFollowingArtistsAndLabels(params: FanModelGetFanItemsParams) {\n return this.#getFanItems(params, FanItemType.FollowingArtistsAndLabels);\n }\n\n getFollowingGenres(params: FanModelGetFanItemsParams) {\n return this.#getFanItems(params, FanItemType.FollowingGenres);\n }\n\n #getFanItems(params: FanModelGetFanItemsParams, itemType: FanItemType.Collection): Promise>;\n #getFanItems(params: FanModelGetFanItemsParams, itemType: FanItemType.Wishlist): Promise>;\n #getFanItems(params: FanModelGetFanItemsParams, itemType: FanItemType.FollowingArtistsAndLabels): Promise>;\n #getFanItems(params: FanModelGetFanItemsParams, itemType: FanItemType.FollowingGenres): Promise>;\n #getFanItems(params: FanModelGetFanItemsParams, itemType: FanItemType): Promise> {\n return this.loopFetch({\n callbackParams: { ...params, itemType },\n getFetchPromise: this.#getFanItemsFetchPromise.bind(this),\n getItemsFromFetchResult: this.#getFanItemsFromFetchResult.bind(this),\n getNextPageTokenFromFetchResult: this.#getNextPageTokenFromFanItemsFetchResult.bind(this),\n convertToEntity: this.#convertFetchedFanItemToEntity.bind(this),\n pageOffset: params.pageOffset,\n pageToken: params.pageToken,\n limit: params.limit\n });\n }\n\n #getFanItemsFetchPromise(params: GetFanItemsLoopFetchCallbackParams): Promise | FanContinuationItemsResult> {\n const continuationToken = params.pageToken ? JSON.parse(params.pageToken) : null;\n const cacheKeyParams: Record = {\n username: params.username\n };\n if (continuationToken) {\n cacheKeyParams.continuationToken = JSON.stringify(continuationToken);\n }\n const target = continuationToken || params.username;\n switch (params.itemType) {\n case FanItemType.Collection:\n return bandcamp.getCache().getOrSet(\n this.getCacheKeyForFetch('fanCollection', cacheKeyParams),\n () => bcfetch.limiter.fan.getCollection({\n target,\n imageFormat: this.getAlbumImageFormat()\n }));\n\n case FanItemType.Wishlist:\n return bandcamp.getCache().getOrSet(\n this.getCacheKeyForFetch('fanWishlist', cacheKeyParams),\n () => bcfetch.limiter.fan.getWishlist({\n target,\n imageFormat: this.getAlbumImageFormat()\n }));\n\n case FanItemType.FollowingArtistsAndLabels:\n return bandcamp.getCache().getOrSet(\n this.getCacheKeyForFetch('fanFollowingArtistsAndLabels', cacheKeyParams),\n () => bcfetch.limiter.fan.getFollowingArtistsAndLabels({\n target,\n imageFormat: this.getArtistImageFormat()\n }));\n\n default:\n case FanItemType.FollowingGenres:\n return bandcamp.getCache().getOrSet(\n this.getCacheKeyForFetch('fanFollowingGenres', cacheKeyParams),\n () => bcfetch.limiter.fan.getFollowingGenres({\n target,\n imageFormat: this.getAlbumImageFormat()\n }));\n }\n }\n\n #getFanItemsFromFetchResult(result: FanPageItemsResult | FanContinuationItemsResult) {\n return result.items.slice(0);\n }\n\n #getNextPageTokenFromFanItemsFetchResult(result: FanPageItemsResult | FanContinuationItemsResult) {\n return result.continuation ? JSON.stringify(result.continuation) : null;\n }\n\n #convertFetchedFanItemToEntity(item: FanItem): BandEntity | AlbumEntity | TrackEntity | TagEntity {\n switch ((item as any).type) {\n case 'album':\n return EntityConverter.convertAlbum(item as Album);\n case 'track':\n return EntityConverter.convertTrack(item as Track);\n case 'tag': // Following genres are tags\n return EntityConverter.convertTag(item as Tag);\n default: // UserKind (following artists / labels) does not have 'tag'\n return EntityConverter.convertBand(item as UserKind);\n }\n }\n}\n"]} \ No newline at end of file diff --git a/bandcamp/dist/lib/model/SearchModel.d.ts b/bandcamp/dist/lib/model/SearchModel.d.ts index e2319c804..8cc079eeb 100644 --- a/bandcamp/dist/lib/model/SearchModel.d.ts +++ b/bandcamp/dist/lib/model/SearchModel.d.ts @@ -1,8 +1,8 @@ -import BaseModel, { LoopFetchResult } from './BaseModel'; -import ArtistEntity from '../entities/ArtistEntity'; -import LabelEntity from '../entities/LabelEntity'; -import AlbumEntity from '../entities/AlbumEntity'; -import TrackEntity from '../entities/TrackEntity'; +import BaseModel, { type LoopFetchResult } from './BaseModel'; +import type ArtistEntity from '../entities/ArtistEntity'; +import type LabelEntity from '../entities/LabelEntity'; +import type AlbumEntity from '../entities/AlbumEntity'; +import type TrackEntity from '../entities/TrackEntity'; export declare enum SearchItemType { All = "All", ArtistsAndLabels = "ArtistsAndLabels", diff --git a/bandcamp/dist/lib/model/SearchModel.d.ts.map b/bandcamp/dist/lib/model/SearchModel.d.ts.map index 6fff1649e..b376c75c8 100644 --- a/bandcamp/dist/lib/model/SearchModel.d.ts.map +++ b/bandcamp/dist/lib/model/SearchModel.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"SearchModel.d.ts","sourceRoot":"","sources":["../../../src/lib/model/SearchModel.ts"],"names":[],"mappings":"AAEA,OAAO,SAAS,EAAE,EAA2B,eAAe,EAAE,MAAM,aAAa,CAAC;AAElF,OAAO,YAAY,MAAM,0BAA0B,CAAC;AACpD,OAAO,WAAW,MAAM,yBAAyB,CAAC;AAClD,OAAO,WAAW,MAAM,yBAAyB,CAAC;AAClD,OAAO,WAAW,MAAM,yBAAyB,CAAC;AAElD,oBAAY,cAAc;IACxB,GAAG,QAAQ;IACX,gBAAgB,qBAAqB;IACrC,MAAM,WAAW;IACjB,MAAM,WAAW;CAClB;AAED,MAAM,WAAW,iCAAiC;IAChD,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,cAAc,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;CACf;AAOD,MAAM,CAAC,OAAO,OAAO,WAAY,SAAQ,SAAS;;IAEhD,gBAAgB,CAAC,MAAM,EAAE,iCAAiC,GAAG;QAAE,QAAQ,EAAE,cAAc,CAAC,GAAG,CAAA;KAAE,GAAG,OAAO,CAAC,eAAe,CAAC,YAAY,GAAG,WAAW,GAAG,WAAW,GAAG,WAAW,CAAC,CAAC;IAChL,gBAAgB,CAAC,MAAM,EAAE,iCAAiC,GAAG;QAAE,QAAQ,EAAE,cAAc,CAAC,gBAAgB,CAAA;KAAE,GAAG,OAAO,CAAC,eAAe,CAAC,YAAY,GAAG,WAAW,CAAC,CAAC;IACjK,gBAAgB,CAAC,MAAM,EAAE,iCAAiC,GAAG;QAAE,QAAQ,EAAE,cAAc,CAAC,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;IACxI,gBAAgB,CAAC,MAAM,EAAE,iCAAiC,GAAG;QAAE,QAAQ,EAAE,cAAc,CAAC,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;IACxI,gBAAgB,CAAC,MAAM,EAAE,iCAAiC,GAAG;QAAE,QAAQ,EAAE,cAAc,CAAA;KAAE,GAAG,OAAO,CAAC,eAAe,CAAC,YAAY,GAAG,WAAW,GAAG,WAAW,GAAG,WAAW,CAAC,CAAC;CAkF7K"} \ No newline at end of file +{"version":3,"file":"SearchModel.d.ts","sourceRoot":"","sources":["../../../src/lib/model/SearchModel.ts"],"names":[],"mappings":"AAEA,OAAO,SAAS,EAAE,EAAgC,KAAK,eAAe,EAAE,MAAM,aAAa,CAAC;AAE5F,OAAO,KAAK,YAAY,MAAM,0BAA0B,CAAC;AACzD,OAAO,KAAK,WAAW,MAAM,yBAAyB,CAAC;AACvD,OAAO,KAAK,WAAW,MAAM,yBAAyB,CAAC;AACvD,OAAO,KAAK,WAAW,MAAM,yBAAyB,CAAC;AAEvD,oBAAY,cAAc;IACxB,GAAG,QAAQ;IACX,gBAAgB,qBAAqB;IACrC,MAAM,WAAW;IACjB,MAAM,WAAW;CAClB;AAED,MAAM,WAAW,iCAAiC;IAChD,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,cAAc,CAAC;IACzB,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;CACf;AAOD,MAAM,CAAC,OAAO,OAAO,WAAY,SAAQ,SAAS;;IAEhD,gBAAgB,CAAC,MAAM,EAAE,iCAAiC,GAAG;QAAE,QAAQ,EAAE,cAAc,CAAC,GAAG,CAAA;KAAE,GAAG,OAAO,CAAC,eAAe,CAAC,YAAY,GAAG,WAAW,GAAG,WAAW,GAAG,WAAW,CAAC,CAAC;IAChL,gBAAgB,CAAC,MAAM,EAAE,iCAAiC,GAAG;QAAE,QAAQ,EAAE,cAAc,CAAC,gBAAgB,CAAA;KAAE,GAAG,OAAO,CAAC,eAAe,CAAC,YAAY,GAAG,WAAW,CAAC,CAAC;IACjK,gBAAgB,CAAC,MAAM,EAAE,iCAAiC,GAAG;QAAE,QAAQ,EAAE,cAAc,CAAC,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;IACxI,gBAAgB,CAAC,MAAM,EAAE,iCAAiC,GAAG;QAAE,QAAQ,EAAE,cAAc,CAAC,MAAM,CAAA;KAAE,GAAG,OAAO,CAAC,eAAe,CAAC,WAAW,CAAC,CAAC;IACxI,gBAAgB,CAAC,MAAM,EAAE,iCAAiC,GAAG;QAAE,QAAQ,EAAE,cAAc,CAAA;KAAE,GAAG,OAAO,CAAC,eAAe,CAAC,YAAY,GAAG,WAAW,GAAG,WAAW,GAAG,WAAW,CAAC,CAAC;CAkF7K"} \ No newline at end of file diff --git a/bandcamp/dist/lib/model/SearchModel.js b/bandcamp/dist/lib/model/SearchModel.js index 8ed59787c..a67e01b3c 100644 --- a/bandcamp/dist/lib/model/SearchModel.js +++ b/bandcamp/dist/lib/model/SearchModel.js @@ -20,7 +20,7 @@ var SearchItemType; SearchItemType["ArtistsAndLabels"] = "ArtistsAndLabels"; SearchItemType["Albums"] = "Albums"; SearchItemType["Tracks"] = "Tracks"; -})(SearchItemType = exports.SearchItemType || (exports.SearchItemType = {})); +})(SearchItemType || (exports.SearchItemType = SearchItemType = {})); class SearchModel extends BaseModel_1.default { constructor() { super(...arguments); @@ -40,7 +40,6 @@ class SearchModel extends BaseModel_1.default { }); } } -exports.default = SearchModel; _SearchModel_instances = new WeakSet(), _SearchModel_getSearchResultsFetchPromise = function _SearchModel_getSearchResultsFetchPromise(params) { const page = params.pageToken ? parseInt(params.pageToken, 10) : 1; const queryParams = { @@ -87,4 +86,5 @@ _SearchModel_instances = new WeakSet(), _SearchModel_getSearchResultsFetchPromis } return null; }; +exports.default = SearchModel; //# sourceMappingURL=SearchModel.js.map \ No newline at end of file diff --git a/bandcamp/dist/lib/model/SearchModel.js.map b/bandcamp/dist/lib/model/SearchModel.js.map index 3417a40db..68794b229 100644 --- a/bandcamp/dist/lib/model/SearchModel.js.map +++ b/bandcamp/dist/lib/model/SearchModel.js.map @@ -1 +1 @@ -{"version":3,"file":"SearchModel.js","sourceRoot":"","sources":["../../../src/lib/model/SearchModel.ts"],"names":[],"mappings":"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","sourcesContent":["import bcfetch, { SearchAPISearchParams, SearchResultAny, SearchResults } from 'bandcamp-fetch';\nimport bandcamp from '../BandcampContext';\nimport BaseModel, { LoopFetchCallbackParams, LoopFetchResult } from './BaseModel';\nimport EntityConverter from '../util/EntityConverter';\nimport ArtistEntity from '../entities/ArtistEntity';\nimport LabelEntity from '../entities/LabelEntity';\nimport AlbumEntity from '../entities/AlbumEntity';\nimport TrackEntity from '../entities/TrackEntity';\n\nexport enum SearchItemType {\n All = 'All',\n ArtistsAndLabels = 'ArtistsAndLabels',\n Albums = 'Albums',\n Tracks = 'Tracks'\n}\n\nexport interface SearchModelGetSearchResultsParams {\n query: string;\n itemType: SearchItemType;\n pageToken?: string;\n pageOffset?: number;\n limit: number;\n}\n\ninterface GetSearchResultsLoopFetchCallbackParams extends LoopFetchCallbackParams {\n query: string;\n itemType: SearchItemType;\n}\n\nexport default class SearchModel extends BaseModel {\n\n getSearchResults(params: SearchModelGetSearchResultsParams & { itemType: SearchItemType.All }): Promise>;\n getSearchResults(params: SearchModelGetSearchResultsParams & { itemType: SearchItemType.ArtistsAndLabels }): Promise>;\n getSearchResults(params: SearchModelGetSearchResultsParams & { itemType: SearchItemType.Albums }): Promise>;\n getSearchResults(params: SearchModelGetSearchResultsParams & { itemType: SearchItemType.Tracks }): Promise>;\n getSearchResults(params: SearchModelGetSearchResultsParams & { itemType: SearchItemType }): Promise>;\n getSearchResults(params: SearchModelGetSearchResultsParams): Promise> {\n return this.loopFetch({\n callbackParams: { ...params },\n getFetchPromise: this.#getSearchResultsFetchPromise.bind(this),\n getItemsFromFetchResult: this.#getSearchResultItemsFromFetchResult.bind(this),\n getNextPageTokenFromFetchResult: this.#getNextPageTokenFromSearchFetchResult.bind(this),\n filterFetchedItem: this.#filterSearchResultItem.bind(this),\n convertToEntity: this.#convertFetchedSearchResultItemToEntity.bind(this),\n pageOffset: params.pageOffset,\n pageToken: params.pageToken,\n limit: params.limit\n });\n }\n\n #getSearchResultsFetchPromise(params: GetSearchResultsLoopFetchCallbackParams) {\n const page = params.pageToken ? parseInt(params.pageToken, 10) : 1;\n const queryParams: SearchAPISearchParams = {\n page,\n query: params.query,\n albumImageFormat: this.getAlbumImageFormat(),\n artistImageFormat: this.getArtistImageFormat()\n };\n switch (params.itemType) {\n case SearchItemType.ArtistsAndLabels:\n return bandcamp.getCache().getOrSet(\n this.getCacheKeyForFetch('searchArtistsAndLabels', queryParams),\n () => bcfetch.limiter.search.artistsAndLabels(queryParams));\n\n case SearchItemType.Albums:\n return bandcamp.getCache().getOrSet(\n this.getCacheKeyForFetch('searchAlbums', queryParams),\n () => bcfetch.limiter.search.albums(queryParams));\n\n case SearchItemType.Tracks:\n return bandcamp.getCache().getOrSet(\n this.getCacheKeyForFetch('searchTracks', queryParams),\n () => bcfetch.limiter.search.tracks(queryParams));\n\n default:\n case SearchItemType.All:\n return bandcamp.getCache().getOrSet(\n this.getCacheKeyForFetch('searchAll', queryParams),\n () => bcfetch.limiter.search.all(queryParams));\n }\n }\n\n #getSearchResultItemsFromFetchResult(result: SearchResults) {\n return result.items.slice(0);\n }\n\n #getNextPageTokenFromSearchFetchResult(result: SearchResults, params: GetSearchResultsLoopFetchCallbackParams) {\n const page = params.pageToken ? parseInt(params.pageToken, 10) : 1;\n if (page < result.totalPages) {\n return (page + 1).toString();\n }\n\n return null;\n }\n\n #filterSearchResultItem(item: SearchResultAny, params: GetSearchResultsLoopFetchCallbackParams) {\n switch (params.itemType) {\n case SearchItemType.ArtistsAndLabels:\n return item.type === 'artist' || item.type === 'label';\n case SearchItemType.Albums:\n return item.type === 'album';\n case SearchItemType.Tracks:\n return item.type === 'track';\n case SearchItemType.All:\n return item.type === 'album' || item.type === 'artist' || item.type === 'label' || item.type === 'track';\n default:\n return false;\n }\n }\n\n #convertFetchedSearchResultItemToEntity(item: SearchResultAny) {\n if (item.type === 'album' || item.type === 'artist' || item.type === 'label' || item.type === 'track') {\n return EntityConverter.convertSearchResultItem(item);\n }\n\n return null;\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"SearchModel.js","sourceRoot":"","sources":["../../../src/lib/model/SearchModel.ts"],"names":[],"mappings":"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","sourcesContent":["import bcfetch, { type SearchAPISearchParams, type SearchResultAny, type SearchResults } from 'bandcamp-fetch';\nimport bandcamp from '../BandcampContext';\nimport BaseModel, { type LoopFetchCallbackParams, type LoopFetchResult } from './BaseModel';\nimport EntityConverter from '../util/EntityConverter';\nimport type ArtistEntity from '../entities/ArtistEntity';\nimport type LabelEntity from '../entities/LabelEntity';\nimport type AlbumEntity from '../entities/AlbumEntity';\nimport type TrackEntity from '../entities/TrackEntity';\n\nexport enum SearchItemType {\n All = 'All',\n ArtistsAndLabels = 'ArtistsAndLabels',\n Albums = 'Albums',\n Tracks = 'Tracks'\n}\n\nexport interface SearchModelGetSearchResultsParams {\n query: string;\n itemType: SearchItemType;\n pageToken?: string;\n pageOffset?: number;\n limit: number;\n}\n\ninterface GetSearchResultsLoopFetchCallbackParams extends LoopFetchCallbackParams {\n query: string;\n itemType: SearchItemType;\n}\n\nexport default class SearchModel extends BaseModel {\n\n getSearchResults(params: SearchModelGetSearchResultsParams & { itemType: SearchItemType.All }): Promise>;\n getSearchResults(params: SearchModelGetSearchResultsParams & { itemType: SearchItemType.ArtistsAndLabels }): Promise>;\n getSearchResults(params: SearchModelGetSearchResultsParams & { itemType: SearchItemType.Albums }): Promise>;\n getSearchResults(params: SearchModelGetSearchResultsParams & { itemType: SearchItemType.Tracks }): Promise>;\n getSearchResults(params: SearchModelGetSearchResultsParams & { itemType: SearchItemType }): Promise>;\n getSearchResults(params: SearchModelGetSearchResultsParams): Promise> {\n return this.loopFetch({\n callbackParams: { ...params },\n getFetchPromise: this.#getSearchResultsFetchPromise.bind(this),\n getItemsFromFetchResult: this.#getSearchResultItemsFromFetchResult.bind(this),\n getNextPageTokenFromFetchResult: this.#getNextPageTokenFromSearchFetchResult.bind(this),\n filterFetchedItem: this.#filterSearchResultItem.bind(this),\n convertToEntity: this.#convertFetchedSearchResultItemToEntity.bind(this),\n pageOffset: params.pageOffset,\n pageToken: params.pageToken,\n limit: params.limit\n });\n }\n\n #getSearchResultsFetchPromise(params: GetSearchResultsLoopFetchCallbackParams) {\n const page = params.pageToken ? parseInt(params.pageToken, 10) : 1;\n const queryParams: SearchAPISearchParams = {\n page,\n query: params.query,\n albumImageFormat: this.getAlbumImageFormat(),\n artistImageFormat: this.getArtistImageFormat()\n };\n switch (params.itemType) {\n case SearchItemType.ArtistsAndLabels:\n return bandcamp.getCache().getOrSet(\n this.getCacheKeyForFetch('searchArtistsAndLabels', queryParams),\n () => bcfetch.limiter.search.artistsAndLabels(queryParams));\n\n case SearchItemType.Albums:\n return bandcamp.getCache().getOrSet(\n this.getCacheKeyForFetch('searchAlbums', queryParams),\n () => bcfetch.limiter.search.albums(queryParams));\n\n case SearchItemType.Tracks:\n return bandcamp.getCache().getOrSet(\n this.getCacheKeyForFetch('searchTracks', queryParams),\n () => bcfetch.limiter.search.tracks(queryParams));\n\n default:\n case SearchItemType.All:\n return bandcamp.getCache().getOrSet(\n this.getCacheKeyForFetch('searchAll', queryParams),\n () => bcfetch.limiter.search.all(queryParams));\n }\n }\n\n #getSearchResultItemsFromFetchResult(result: SearchResults) {\n return result.items.slice(0);\n }\n\n #getNextPageTokenFromSearchFetchResult(result: SearchResults, params: GetSearchResultsLoopFetchCallbackParams) {\n const page = params.pageToken ? parseInt(params.pageToken, 10) : 1;\n if (page < result.totalPages) {\n return (page + 1).toString();\n }\n\n return null;\n }\n\n #filterSearchResultItem(item: SearchResultAny, params: GetSearchResultsLoopFetchCallbackParams) {\n switch (params.itemType) {\n case SearchItemType.ArtistsAndLabels:\n return item.type === 'artist' || item.type === 'label';\n case SearchItemType.Albums:\n return item.type === 'album';\n case SearchItemType.Tracks:\n return item.type === 'track';\n case SearchItemType.All:\n return item.type === 'album' || item.type === 'artist' || item.type === 'label' || item.type === 'track';\n default:\n return false;\n }\n }\n\n #convertFetchedSearchResultItemToEntity(item: SearchResultAny) {\n if (item.type === 'album' || item.type === 'artist' || item.type === 'label' || item.type === 'track') {\n return EntityConverter.convertSearchResultItem(item);\n }\n\n return null;\n }\n}\n"]} \ No newline at end of file diff --git a/bandcamp/dist/lib/model/ShowModel.js b/bandcamp/dist/lib/model/ShowModel.js index eda845e80..eec71383d 100644 --- a/bandcamp/dist/lib/model/ShowModel.js +++ b/bandcamp/dist/lib/model/ShowModel.js @@ -38,7 +38,6 @@ class ShowModel extends BaseModel_1.default { return __classPrivateFieldGet(this, _ShowModel_instances, "m", _ShowModel_convertFetchedShowToEntity).call(this, show); } } -exports.default = ShowModel; _ShowModel_instances = new WeakSet(), _ShowModel_getShowsFetchPromise = function _ShowModel_getShowsFetchPromise() { const queryParams = { imageFormat: this.getAlbumImageFormat() @@ -49,4 +48,5 @@ _ShowModel_instances = new WeakSet(), _ShowModel_getShowsFetchPromise = function }, _ShowModel_convertFetchedShowToEntity = function _ShowModel_convertFetchedShowToEntity(item) { return EntityConverter_1.default.convertShow(item); }; +exports.default = ShowModel; //# sourceMappingURL=ShowModel.js.map \ No newline at end of file diff --git a/bandcamp/dist/lib/model/ShowModel.js.map b/bandcamp/dist/lib/model/ShowModel.js.map index 6d154bab6..fbd9e38f8 100644 --- a/bandcamp/dist/lib/model/ShowModel.js.map +++ b/bandcamp/dist/lib/model/ShowModel.js.map @@ -1 +1 @@ -{"version":3,"file":"ShowModel.js","sourceRoot":"","sources":["../../../src/lib/model/ShowModel.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,oEAA+C;AAC/C,yEAA0C;AAC1C,4DAAoC;AACpC,8EAAsD;AAQtD,MAAqB,SAAU,SAAQ,mBAAS;IAAhD;;;IA2CA,CAAC;IAzCC,QAAQ,CAAC,MAA+B;QACtC,OAAO,IAAI,CAAC,SAAS,CAAC;YACpB,cAAc,EAAE,EAAE,GAAG,MAAM,EAAE;YAC7B,eAAe,EAAE,uBAAA,IAAI,6DAAsB,CAAC,IAAI,CAAC,IAAI,CAAC;YACtD,uBAAuB,EAAE,uBAAA,IAAI,gEAAyB,CAAC,IAAI,CAAC,IAAI,CAAC;YACjE,eAAe,EAAE,uBAAA,IAAI,mEAA4B,CAAC,IAAI,CAAC,IAAI,CAAC;YAC5D,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,KAAK,EAAE,MAAM,CAAC,KAAK;SACpB,CAAC,CAAC;IACL,CAAC;IAeD,KAAK,CAAC,OAAO,CAAC,OAAe;QAC3B,MAAM,WAAW,GAAG;YAClB,OAAO;YACP,WAAW,EAAE,IAAI,CAAC,mBAAmB,EAAE;SACxC,CAAC;QAEF,MAAM,IAAI,GAAG,MAAM,yBAAQ,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAC7C,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,WAAW,CAAC,EAC7C,GAAG,EAAE,CAAC,wBAAO,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC;QAEnD,OAAO,uBAAA,IAAI,mEAA4B,MAAhC,IAAI,EAA6B,IAAI,CAAC,CAAC;IAChD,CAAC;CAKF;AA3CD,4BA2CC;;IA5BG,MAAM,WAAW,GAAG;QAClB,WAAW,EAAE,IAAI,CAAC,mBAAmB,EAAE;KACxC,CAAC;IACF,OAAO,yBAAQ,CAAC,QAAQ,EAAE,CAAC,QAAQ,CACjC,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,WAAW,CAAC,EAC9C,GAAG,EAAE,CAAC,wBAAO,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;AAClD,CAAC,mFAEwB,MAAc;IACrC,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACzB,CAAC,yFAe2B,IAAU;IACpC,OAAO,yBAAe,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;AAC3C,CAAC","sourcesContent":["import bcfetch, { Show } from 'bandcamp-fetch';\nimport bandcamp from '../BandcampContext';\nimport BaseModel from './BaseModel';\nimport EntityConverter from '../util/EntityConverter';\n\nexport interface ShowModelGetShowsParams {\n pageToken?: string;\n pageOffset?: number;\n limit: number;\n}\n\nexport default class ShowModel extends BaseModel {\n\n getShows(params: ShowModelGetShowsParams) {\n return this.loopFetch({\n callbackParams: { ...params },\n getFetchPromise: this.#getShowsFetchPromise.bind(this),\n getItemsFromFetchResult: this.#getShowsFromFetchResult.bind(this),\n convertToEntity: this.#convertFetchedShowToEntity.bind(this),\n pageOffset: params.pageOffset,\n pageToken: params.pageToken,\n limit: params.limit\n });\n }\n\n #getShowsFetchPromise() {\n const queryParams = {\n imageFormat: this.getAlbumImageFormat()\n };\n return bandcamp.getCache().getOrSet(\n this.getCacheKeyForFetch('shows', queryParams),\n () => bcfetch.limiter.show.list(queryParams));\n }\n\n #getShowsFromFetchResult(result: Show[]) {\n return result.slice(0);\n }\n\n async getShow(showUrl: string) {\n const queryParams = {\n showUrl,\n imageFormat: this.getAlbumImageFormat()\n };\n\n const show = await bandcamp.getCache().getOrSet(\n this.getCacheKeyForFetch('show', queryParams),\n () => bcfetch.limiter.show.getShow(queryParams));\n\n return this.#convertFetchedShowToEntity(show);\n }\n\n #convertFetchedShowToEntity(item: Show) {\n return EntityConverter.convertShow(item);\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"ShowModel.js","sourceRoot":"","sources":["../../../src/lib/model/ShowModel.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,oEAAoD;AACpD,yEAA0C;AAC1C,4DAAoC;AACpC,8EAAsD;AAQtD,MAAqB,SAAU,SAAQ,mBAAS;IAAhD;;;IA2CA,CAAC;IAzCC,QAAQ,CAAC,MAA+B;QACtC,OAAO,IAAI,CAAC,SAAS,CAAC;YACpB,cAAc,EAAE,EAAE,GAAG,MAAM,EAAE;YAC7B,eAAe,EAAE,uBAAA,IAAI,6DAAsB,CAAC,IAAI,CAAC,IAAI,CAAC;YACtD,uBAAuB,EAAE,uBAAA,IAAI,gEAAyB,CAAC,IAAI,CAAC,IAAI,CAAC;YACjE,eAAe,EAAE,uBAAA,IAAI,mEAA4B,CAAC,IAAI,CAAC,IAAI,CAAC;YAC5D,UAAU,EAAE,MAAM,CAAC,UAAU;YAC7B,SAAS,EAAE,MAAM,CAAC,SAAS;YAC3B,KAAK,EAAE,MAAM,CAAC,KAAK;SACpB,CAAC,CAAC;IACL,CAAC;IAeD,KAAK,CAAC,OAAO,CAAC,OAAe;QAC3B,MAAM,WAAW,GAAG;YAClB,OAAO;YACP,WAAW,EAAE,IAAI,CAAC,mBAAmB,EAAE;SACxC,CAAC;QAEF,MAAM,IAAI,GAAG,MAAM,yBAAQ,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAC7C,IAAI,CAAC,mBAAmB,CAAC,MAAM,EAAE,WAAW,CAAC,EAC7C,GAAG,EAAE,CAAC,wBAAO,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC;QAEnD,OAAO,uBAAA,IAAI,mEAA4B,MAAhC,IAAI,EAA6B,IAAI,CAAC,CAAC;IAChD,CAAC;CAKF;;IA5BG,MAAM,WAAW,GAAG;QAClB,WAAW,EAAE,IAAI,CAAC,mBAAmB,EAAE;KACxC,CAAC;IACF,OAAO,yBAAQ,CAAC,QAAQ,EAAE,CAAC,QAAQ,CACjC,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,WAAW,CAAC,EAC9C,GAAG,EAAE,CAAC,wBAAO,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,CAAC;AAClD,CAAC,mFAEwB,MAAc;IACrC,OAAO,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;AACzB,CAAC,yFAe2B,IAAU;IACpC,OAAO,yBAAe,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;AAC3C,CAAC;kBA1CkB,SAAS","sourcesContent":["import bcfetch, { type Show } from 'bandcamp-fetch';\nimport bandcamp from '../BandcampContext';\nimport BaseModel from './BaseModel';\nimport EntityConverter from '../util/EntityConverter';\n\nexport interface ShowModelGetShowsParams {\n pageToken?: string;\n pageOffset?: number;\n limit: number;\n}\n\nexport default class ShowModel extends BaseModel {\n\n getShows(params: ShowModelGetShowsParams) {\n return this.loopFetch({\n callbackParams: { ...params },\n getFetchPromise: this.#getShowsFetchPromise.bind(this),\n getItemsFromFetchResult: this.#getShowsFromFetchResult.bind(this),\n convertToEntity: this.#convertFetchedShowToEntity.bind(this),\n pageOffset: params.pageOffset,\n pageToken: params.pageToken,\n limit: params.limit\n });\n }\n\n #getShowsFetchPromise() {\n const queryParams = {\n imageFormat: this.getAlbumImageFormat()\n };\n return bandcamp.getCache().getOrSet(\n this.getCacheKeyForFetch('shows', queryParams),\n () => bcfetch.limiter.show.list(queryParams));\n }\n\n #getShowsFromFetchResult(result: Show[]) {\n return result.slice(0);\n }\n\n async getShow(showUrl: string) {\n const queryParams = {\n showUrl,\n imageFormat: this.getAlbumImageFormat()\n };\n\n const show = await bandcamp.getCache().getOrSet(\n this.getCacheKeyForFetch('show', queryParams),\n () => bcfetch.limiter.show.getShow(queryParams));\n\n return this.#convertFetchedShowToEntity(show);\n }\n\n #convertFetchedShowToEntity(item: Show) {\n return EntityConverter.convertShow(item);\n }\n}\n"]} \ No newline at end of file diff --git a/bandcamp/dist/lib/model/TagModel.d.ts b/bandcamp/dist/lib/model/TagModel.d.ts index 8affbae53..48114854c 100644 --- a/bandcamp/dist/lib/model/TagModel.d.ts +++ b/bandcamp/dist/lib/model/TagModel.d.ts @@ -1,25 +1,9 @@ -import { ReleasesByTag, TagAPIGetReleasesParams } from 'bandcamp-fetch'; -import BaseModel, { LoopFetchResult } from './BaseModel'; -import AlbumEntity from '../entities/AlbumEntity'; -import TrackEntity from '../entities/TrackEntity'; -export interface TagModelGetReleasesParams { - tagUrl: string; - filters: TagAPIGetReleasesParams['filters']; - pageToken?: string; - pageOffset?: number; - limit: number; -} -export interface ReleasesLoopFetchResult extends LoopFetchResult { - filters: ReleasesByTag['filters']; -} +import BaseModel from './BaseModel'; export default class TagModel extends BaseModel { - #private; - getReleases(params: TagModelGetReleasesParams): Promise; - getTag(tagUrl: string): Promise; getTags(): Promise<{ tags: import("../entities/TagEntity").default[]; locations: import("../entities/TagEntity").default[]; }>; - getReleasesAvailableFilters(tagUrl: string): Promise; + getRelatedTags(tags: string[]): Promise; } //# sourceMappingURL=TagModel.d.ts.map \ No newline at end of file diff --git a/bandcamp/dist/lib/model/TagModel.d.ts.map b/bandcamp/dist/lib/model/TagModel.d.ts.map index 66e8f9573..8c18f4246 100644 --- a/bandcamp/dist/lib/model/TagModel.d.ts.map +++ b/bandcamp/dist/lib/model/TagModel.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"TagModel.d.ts","sourceRoot":"","sources":["../../../src/lib/model/TagModel.ts"],"names":[],"mappings":"AAAA,OAAgB,EAAS,aAAa,EAAE,uBAAuB,EAAS,MAAM,gBAAgB,CAAC;AAE/F,OAAO,SAAS,EAAE,EAA2B,eAAe,EAAE,MAAM,aAAa,CAAC;AAElF,OAAO,WAAW,MAAM,yBAAyB,CAAC;AAClD,OAAO,WAAW,MAAM,yBAAyB,CAAC;AAElD,MAAM,WAAW,yBAAyB;IACxC,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,uBAAuB,CAAC,SAAS,CAAC,CAAC;IAC5C,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,EAAE,MAAM,CAAC;CACf;AAOD,MAAM,WAAW,uBAAwB,SAAQ,eAAe,CAAC,WAAW,GAAG,WAAW,CAAC;IACzF,OAAO,EAAE,aAAa,CAAC,SAAS,CAAC,CAAC;CACnC;AAED,MAAM,CAAC,OAAO,OAAO,QAAS,SAAQ,SAAS;;IAE7C,WAAW,CAAC,MAAM,EAAE,yBAAyB;IAyDvC,MAAM,CAAC,MAAM,EAAE,MAAM;IAQrB,OAAO;;;;IAWb,2BAA2B,CAAC,MAAM,EAAE,MAAM;CAK3C"} \ No newline at end of file +{"version":3,"file":"TagModel.d.ts","sourceRoot":"","sources":["../../../src/lib/model/TagModel.ts"],"names":[],"mappings":"AAEA,OAAO,SAAS,MAAM,aAAa,CAAC;AAGpC,MAAM,CAAC,OAAO,OAAO,QAAS,SAAQ,SAAS;IAEvC,OAAO;;;;IAWP,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE;CAkBpC"} \ No newline at end of file diff --git a/bandcamp/dist/lib/model/TagModel.js b/bandcamp/dist/lib/model/TagModel.js index 5d0f07924..2d5c14c8d 100644 --- a/bandcamp/dist/lib/model/TagModel.js +++ b/bandcamp/dist/lib/model/TagModel.js @@ -1,79 +1,34 @@ "use strict"; -var __classPrivateFieldGet = (this && this.__classPrivateFieldGet) || function (receiver, state, kind, f) { - if (kind === "a" && !f) throw new TypeError("Private accessor was defined without a getter"); - if (typeof state === "function" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError("Cannot read private member from an object whose class did not declare it"); - return kind === "m" ? f : kind === "a" ? f.call(receiver) : f ? f.value : state.get(receiver); -}; var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; -var _TagModel_instances, _TagModel_getReleasesFetchPromise, _TagModel_getReleasesFromFetchResult, _TagModel_getNextPageTokenFromReleasesFetchResult, _TagModel_convertFetchedReleaseToEntity, _TagModel_onGetReleasesLoopFetchEnd; Object.defineProperty(exports, "__esModule", { value: true }); const bandcamp_fetch_1 = __importDefault(require("bandcamp-fetch")); const BandcampContext_1 = __importDefault(require("../BandcampContext")); const BaseModel_1 = __importDefault(require("./BaseModel")); const EntityConverter_1 = __importDefault(require("../util/EntityConverter")); class TagModel extends BaseModel_1.default { - constructor() { - super(...arguments); - _TagModel_instances.add(this); - } - getReleases(params) { - return this.loopFetch({ - callbackParams: { ...params }, - getFetchPromise: __classPrivateFieldGet(this, _TagModel_instances, "m", _TagModel_getReleasesFetchPromise).bind(this), - getItemsFromFetchResult: __classPrivateFieldGet(this, _TagModel_instances, "m", _TagModel_getReleasesFromFetchResult).bind(this), - getNextPageTokenFromFetchResult: __classPrivateFieldGet(this, _TagModel_instances, "m", _TagModel_getNextPageTokenFromReleasesFetchResult).bind(this), - convertToEntity: __classPrivateFieldGet(this, _TagModel_instances, "m", _TagModel_convertFetchedReleaseToEntity).bind(this), - onEnd: __classPrivateFieldGet(this, _TagModel_instances, "m", _TagModel_onGetReleasesLoopFetchEnd).bind(this), - pageOffset: params.pageOffset, - pageToken: params.pageToken, - limit: params.limit - }); - } - async getTag(tagUrl) { - const tag = await BandcampContext_1.default.getCache().getOrSet(this.getCacheKeyForFetch('tag', { tagUrl }), () => bandcamp_fetch_1.default.limiter.tag.getInfo(tagUrl)); - return EntityConverter_1.default.convertTag(tag); - } async getTags() { const tags = await BandcampContext_1.default.getCache().getOrSet(this.getCacheKeyForFetch('tags'), () => bandcamp_fetch_1.default.limiter.tag.list()); return { - tags: tags.tags.map((tag) => EntityConverter_1.default.convertTag({ ...tag, type: 'tag' })), - locations: tags.locations.map((tag) => EntityConverter_1.default.convertTag({ ...tag, type: 'tag' })) + tags: tags.tags.map((tag) => EntityConverter_1.default.convertTag(tag)), + locations: tags.locations.map((tag) => EntityConverter_1.default.convertTag(tag)) }; } - getReleasesAvailableFilters(tagUrl) { - return BandcampContext_1.default.getCache().getOrSet(this.getCacheKeyForFetch('releasesByTagFilterOptions', { tagUrl }), () => bandcamp_fetch_1.default.limiter.tag.getReleasesAvailableFilters(tagUrl)); + async getRelatedTags(tags) { + const related = await BandcampContext_1.default.getCache().getOrSet(this.getCacheKeyForFetch('relatedTags', tags), () => bandcamp_fetch_1.default.limiter.tag.getRelated({ tags })); + let tagsArr; + if (related.combo && related.combo.length > 0) { + tagsArr = related.combo; + } + else { + tagsArr = related.single.find((row) => row.related.length > 0)?.related; + } + if (tagsArr && tagsArr.length > 0) { + return tagsArr.map((tag) => EntityConverter_1.default.convertTag(tag)); + } + return []; } } exports.default = TagModel; -_TagModel_instances = new WeakSet(), _TagModel_getReleasesFetchPromise = function _TagModel_getReleasesFetchPromise(params) { - const page = params.pageToken ? parseInt(params.pageToken, 10) : 1; - const queryParams = { - tagUrl: params.tagUrl, - page, - filters: params.filters, - imageFormat: this.getAlbumImageFormat() - }; - return BandcampContext_1.default.getCache().getOrSet(this.getCacheKeyForFetch('releasesByTag', queryParams), () => bandcamp_fetch_1.default.limiter.tag.getReleases(queryParams)); -}, _TagModel_getReleasesFromFetchResult = function _TagModel_getReleasesFromFetchResult(result) { - return result.items.slice(0); -}, _TagModel_getNextPageTokenFromReleasesFetchResult = function _TagModel_getNextPageTokenFromReleasesFetchResult(result, params) { - const page = params.pageToken ? parseInt(params.pageToken) : 1; - if (result.items.length > 0 && result.hasMore) { - return (page + 1).toString(); - } - return null; -}, _TagModel_convertFetchedReleaseToEntity = function _TagModel_convertFetchedReleaseToEntity(item) { - if (item.type === 'album') { - return EntityConverter_1.default.convertAlbum(item); - } - return EntityConverter_1.default.convertTrack(item); -}, _TagModel_onGetReleasesLoopFetchEnd = function _TagModel_onGetReleasesLoopFetchEnd(result, lastFetchResult) { - const r = { - ...result, - filters: lastFetchResult.filters - }; - return r; -}; //# sourceMappingURL=TagModel.js.map \ No newline at end of file diff --git a/bandcamp/dist/lib/model/TagModel.js.map b/bandcamp/dist/lib/model/TagModel.js.map index 18485f03a..54661a04b 100644 --- a/bandcamp/dist/lib/model/TagModel.js.map +++ b/bandcamp/dist/lib/model/TagModel.js.map @@ -1 +1 @@ -{"version":3,"file":"TagModel.js","sourceRoot":"","sources":["../../../src/lib/model/TagModel.ts"],"names":[],"mappings":"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","sourcesContent":["import bcfetch, { Album, ReleasesByTag, TagAPIGetReleasesParams, Track } from 'bandcamp-fetch';\nimport bandcamp from '../BandcampContext';\nimport BaseModel, { LoopFetchCallbackParams, LoopFetchResult } from './BaseModel';\nimport EntityConverter from '../util/EntityConverter';\nimport AlbumEntity from '../entities/AlbumEntity';\nimport TrackEntity from '../entities/TrackEntity';\n\nexport interface TagModelGetReleasesParams {\n tagUrl: string;\n filters: TagAPIGetReleasesParams['filters'];\n pageToken?: string;\n pageOffset?: number;\n limit: number;\n}\n\ninterface GetReleasesLoopFetchCallbackParams extends LoopFetchCallbackParams {\n tagUrl: string;\n filters: TagAPIGetReleasesParams['filters'];\n}\n\nexport interface ReleasesLoopFetchResult extends LoopFetchResult {\n filters: ReleasesByTag['filters'];\n}\n\nexport default class TagModel extends BaseModel {\n\n getReleases(params: TagModelGetReleasesParams) {\n return this.loopFetch({\n callbackParams: { ...params },\n getFetchPromise: this.#getReleasesFetchPromise.bind(this),\n getItemsFromFetchResult: this.#getReleasesFromFetchResult.bind(this),\n getNextPageTokenFromFetchResult: this.#getNextPageTokenFromReleasesFetchResult.bind(this),\n convertToEntity: this.#convertFetchedReleaseToEntity.bind(this),\n onEnd: this.#onGetReleasesLoopFetchEnd.bind(this),\n pageOffset: params.pageOffset,\n pageToken: params.pageToken,\n limit: params.limit\n });\n }\n\n #getReleasesFetchPromise(params: GetReleasesLoopFetchCallbackParams) {\n const page = params.pageToken ? parseInt(params.pageToken, 10) : 1;\n const queryParams = {\n tagUrl: params.tagUrl,\n page,\n filters: params.filters,\n imageFormat: this.getAlbumImageFormat()\n };\n return bandcamp.getCache().getOrSet(\n this.getCacheKeyForFetch('releasesByTag', queryParams),\n () => bcfetch.limiter.tag.getReleases(queryParams));\n }\n\n #getReleasesFromFetchResult(result: ReleasesByTag) {\n return result.items.slice(0);\n }\n\n #getNextPageTokenFromReleasesFetchResult(result: ReleasesByTag, params: GetReleasesLoopFetchCallbackParams) {\n const page = params.pageToken ? parseInt(params.pageToken) : 1;\n if (result.items.length > 0 && result.hasMore) {\n return (page + 1).toString();\n }\n\n return null;\n\n }\n\n #convertFetchedReleaseToEntity(item: Album | Track): AlbumEntity | TrackEntity {\n if (item.type === 'album') {\n return EntityConverter.convertAlbum(item);\n }\n\n return EntityConverter.convertTrack(item);\n }\n\n #onGetReleasesLoopFetchEnd(result: LoopFetchResult, lastFetchResult: ReleasesByTag) {\n const r: ReleasesLoopFetchResult = {\n ...result,\n filters: lastFetchResult.filters\n };\n return r;\n }\n\n async getTag(tagUrl: string) {\n const tag = await bandcamp.getCache().getOrSet(\n this.getCacheKeyForFetch('tag', { tagUrl }),\n () => bcfetch.limiter.tag.getInfo(tagUrl));\n\n return EntityConverter.convertTag(tag);\n }\n\n async getTags() {\n const tags = await bandcamp.getCache().getOrSet(\n this.getCacheKeyForFetch('tags'),\n () => bcfetch.limiter.tag.list());\n\n return {\n tags: tags.tags.map((tag) => EntityConverter.convertTag({ ...tag, type: 'tag' })),\n locations: tags.locations.map((tag) => EntityConverter.convertTag({ ...tag, type: 'tag' }))\n };\n }\n\n getReleasesAvailableFilters(tagUrl: string) {\n return bandcamp.getCache().getOrSet(\n this.getCacheKeyForFetch('releasesByTagFilterOptions', { tagUrl }),\n () => bcfetch.limiter.tag.getReleasesAvailableFilters(tagUrl));\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"TagModel.js","sourceRoot":"","sources":["../../../src/lib/model/TagModel.ts"],"names":[],"mappings":";;;;;AAAA,oEAAqC;AACrC,yEAA0C;AAC1C,4DAAoC;AACpC,8EAAsD;AAEtD,MAAqB,QAAS,SAAQ,mBAAS;IAE7C,KAAK,CAAC,OAAO;QACX,MAAM,IAAI,GAAG,MAAM,yBAAQ,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAC7C,IAAI,CAAC,mBAAmB,CAAC,MAAM,CAAC,EAChC,GAAG,EAAE,CAAC,wBAAO,CAAC,OAAO,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;QAEpC,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,yBAAe,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;YAC7D,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,yBAAe,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC;SACxE,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,IAAc;QACjC,MAAM,OAAO,GAAG,MAAM,yBAAQ,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAChD,IAAI,CAAC,mBAAmB,CAAC,aAAa,EAAE,IAAI,CAAC,EAC7C,GAAG,EAAE,CAAC,wBAAO,CAAC,OAAO,CAAC,GAAG,CAAC,UAAU,CAAC,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC;QAElD,IAAI,OAAO,CAAC;QACZ,IAAI,OAAO,CAAC,KAAK,IAAI,OAAO,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAC9C,OAAO,GAAG,OAAO,CAAC,KAAK,CAAC;QAC1B,CAAC;aACI,CAAC;YACJ,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,OAAO,CAAC,MAAM,GAAG,CAAC,CAAC,EAAE,OAAO,CAAC;QAC1E,CAAC;QAED,IAAI,OAAO,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YAClC,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,yBAAe,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC;QAC/D,CAAC;QACD,OAAO,EAAE,CAAC;IACZ,CAAC;CACF;AA/BD,2BA+BC","sourcesContent":["import bcfetch from 'bandcamp-fetch';\nimport bandcamp from '../BandcampContext';\nimport BaseModel from './BaseModel';\nimport EntityConverter from '../util/EntityConverter';\n\nexport default class TagModel extends BaseModel {\n\n async getTags() {\n const tags = await bandcamp.getCache().getOrSet(\n this.getCacheKeyForFetch('tags'),\n () => bcfetch.limiter.tag.list());\n\n return {\n tags: tags.tags.map((tag) => EntityConverter.convertTag(tag)),\n locations: tags.locations.map((tag) => EntityConverter.convertTag(tag))\n };\n }\n\n async getRelatedTags(tags: string[]) {\n const related = await bandcamp.getCache().getOrSet(\n this.getCacheKeyForFetch('relatedTags', tags),\n () => bcfetch.limiter.tag.getRelated({ tags }));\n\n let tagsArr;\n if (related.combo && related.combo.length > 0) {\n tagsArr = related.combo;\n }\n else {\n tagsArr = related.single.find((row) => row.related.length > 0)?.related;\n }\n\n if (tagsArr && tagsArr.length > 0) {\n return tagsArr.map((tag) => EntityConverter.convertTag(tag));\n }\n return [];\n }\n}\n"]} \ No newline at end of file diff --git a/bandcamp/dist/lib/model/TrackModel.d.ts b/bandcamp/dist/lib/model/TrackModel.d.ts index 5f3a80f78..705ebb974 100644 --- a/bandcamp/dist/lib/model/TrackModel.d.ts +++ b/bandcamp/dist/lib/model/TrackModel.d.ts @@ -1,5 +1,5 @@ import BaseModel from './BaseModel'; -import TrackEntity from '../entities/TrackEntity'; +import type TrackEntity from '../entities/TrackEntity'; export default class TrackModel extends BaseModel { #private; getTrack(trackUrl: string): Promise; diff --git a/bandcamp/dist/lib/model/TrackModel.d.ts.map b/bandcamp/dist/lib/model/TrackModel.d.ts.map index 0c5e7ff0c..62307cf34 100644 --- a/bandcamp/dist/lib/model/TrackModel.d.ts.map +++ b/bandcamp/dist/lib/model/TrackModel.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"TrackModel.d.ts","sourceRoot":"","sources":["../../../src/lib/model/TrackModel.ts"],"names":[],"mappings":"AAEA,OAAO,SAAS,MAAM,aAAa,CAAC;AACpC,OAAO,WAAW,MAAM,yBAAyB,CAAC;AAGlD,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,SAAS;;IAE/C,QAAQ,CAAC,QAAQ,EAAE,MAAM;CAwB1B"} \ No newline at end of file +{"version":3,"file":"TrackModel.d.ts","sourceRoot":"","sources":["../../../src/lib/model/TrackModel.ts"],"names":[],"mappings":"AAEA,OAAO,SAAS,MAAM,aAAa,CAAC;AACpC,OAAO,KAAK,WAAW,MAAM,yBAAyB,CAAC;AAGvD,MAAM,CAAC,OAAO,OAAO,UAAW,SAAQ,SAAS;;IAE/C,QAAQ,CAAC,QAAQ,EAAE,MAAM;CAwB1B"} \ No newline at end of file diff --git a/bandcamp/dist/lib/model/TrackModel.js b/bandcamp/dist/lib/model/TrackModel.js index cafc3a29a..a1c12c906 100644 --- a/bandcamp/dist/lib/model/TrackModel.js +++ b/bandcamp/dist/lib/model/TrackModel.js @@ -25,7 +25,6 @@ class TrackModel extends BaseModel_1.default { return BandcampContext_1.default.getCache().getOrSet(this.getCacheKeyForFetch('track', { trackUrl }), () => __classPrivateFieldGet(this, _TrackModel_instances, "m", _TrackModel_doGetTrack).call(this, trackUrl)); } } -exports.default = TrackModel; _TrackModel_instances = new WeakSet(), _TrackModel_doGetTrack = async function _TrackModel_doGetTrack(trackUrl) { const queryParams = { trackUrl, @@ -38,4 +37,5 @@ _TrackModel_instances = new WeakSet(), _TrackModel_doGetTrack = async function _ }, _TrackModel_convertFetchedTrackToEntity = function _TrackModel_convertFetchedTrackToEntity(item) { return EntityConverter_1.default.convertTrack(item); }; +exports.default = TrackModel; //# sourceMappingURL=TrackModel.js.map \ No newline at end of file diff --git a/bandcamp/dist/lib/model/TrackModel.js.map b/bandcamp/dist/lib/model/TrackModel.js.map index be74ecba1..cd8aca7b0 100644 --- a/bandcamp/dist/lib/model/TrackModel.js.map +++ b/bandcamp/dist/lib/model/TrackModel.js.map @@ -1 +1 @@ -{"version":3,"file":"TrackModel.js","sourceRoot":"","sources":["../../../src/lib/model/TrackModel.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,oEAAgD;AAChD,yEAA0C;AAC1C,4DAAoC;AAEpC,8EAAsD;AAEtD,MAAqB,UAAW,SAAQ,mBAAS;IAAjD;;;IA0BA,CAAC;IAxBC,QAAQ,CAAC,QAAgB;QACvB,+DAA+D;QAC/D,gEAAgE;QAChE,gEAAgE;QAChE,OAAO,yBAAQ,CAAC,QAAQ,EAAE,CAAC,QAAQ,CACjC,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,CAAC,EAC/C,GAAG,EAAE,CAAC,uBAAA,IAAI,qDAAY,MAAhB,IAAI,EAAa,QAAQ,CAAC,CAAC,CAAC;IACtC,CAAC;CAiBF;AA1BD,6BA0BC;gEAfC,KAAK,iCAAa,QAAgB;IAChC,MAAM,WAAW,GAAG;QAClB,QAAQ;QACR,gBAAgB,EAAE,IAAI,CAAC,mBAAmB,EAAE;QAC5C,iBAAiB,EAAE,IAAI,CAAC,oBAAoB,EAAE;QAC9C,cAAc,EAAE,KAAK;KACtB,CAAC;IACF,MAAM,SAAS,GAAG,MAAM,wBAAO,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAEnE,OAAO,uBAAA,IAAI,sEAA6B,MAAjC,IAAI,EAA8B,SAAS,CAAC,CAAC;AACtD,CAAC,6FAE4B,IAAW;IACtC,OAAO,yBAAe,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;AAC5C,CAAC","sourcesContent":["import bcfetch, { Track } from 'bandcamp-fetch';\nimport bandcamp from '../BandcampContext';\nimport BaseModel from './BaseModel';\nimport TrackEntity from '../entities/TrackEntity';\nimport EntityConverter from '../util/EntityConverter';\n\nexport default class TrackModel extends BaseModel {\n\n getTrack(trackUrl: string) {\n // Unlike other resources, tracks are converted to TrackEntitys\n // Before being cached. See also AlbumModel#getAlbum(), where we\n // Cache an album's tracks that have been converted to entities.\n return bandcamp.getCache().getOrSet(\n this.getCacheKeyForFetch('track', { trackUrl }),\n () => this.#doGetTrack(trackUrl));\n }\n\n async #doGetTrack(trackUrl: string) {\n const queryParams = {\n trackUrl,\n albumImageFormat: this.getAlbumImageFormat(),\n artistImageFormat: this.getArtistImageFormat(),\n includeRawData: false\n };\n const trackInfo = await bcfetch.limiter.track.getInfo(queryParams);\n\n return this.#convertFetchedTrackToEntity(trackInfo);\n }\n\n #convertFetchedTrackToEntity(item: Track): TrackEntity {\n return EntityConverter.convertTrack(item);\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"TrackModel.js","sourceRoot":"","sources":["../../../src/lib/model/TrackModel.ts"],"names":[],"mappings":";;;;;;;;;;;AAAA,oEAAqD;AACrD,yEAA0C;AAC1C,4DAAoC;AAEpC,8EAAsD;AAEtD,MAAqB,UAAW,SAAQ,mBAAS;IAAjD;;;IA0BA,CAAC;IAxBC,QAAQ,CAAC,QAAgB;QACvB,+DAA+D;QAC/D,gEAAgE;QAChE,gEAAgE;QAChE,OAAO,yBAAQ,CAAC,QAAQ,EAAE,CAAC,QAAQ,CACjC,IAAI,CAAC,mBAAmB,CAAC,OAAO,EAAE,EAAE,QAAQ,EAAE,CAAC,EAC/C,GAAG,EAAE,CAAC,uBAAA,IAAI,qDAAY,MAAhB,IAAI,EAAa,QAAQ,CAAC,CAAC,CAAC;IACtC,CAAC;CAiBF;gEAfC,KAAK,iCAAa,QAAgB;IAChC,MAAM,WAAW,GAAG;QAClB,QAAQ;QACR,gBAAgB,EAAE,IAAI,CAAC,mBAAmB,EAAE;QAC5C,iBAAiB,EAAE,IAAI,CAAC,oBAAoB,EAAE;QAC9C,cAAc,EAAE,KAAK;KACtB,CAAC;IACF,MAAM,SAAS,GAAG,MAAM,wBAAO,CAAC,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,WAAW,CAAC,CAAC;IAEnE,OAAO,uBAAA,IAAI,sEAA6B,MAAjC,IAAI,EAA8B,SAAS,CAAC,CAAC;AACtD,CAAC,6FAE4B,IAAW;IACtC,OAAO,yBAAe,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;AAC5C,CAAC;kBAzBkB,UAAU","sourcesContent":["import bcfetch, { type Track } from 'bandcamp-fetch';\nimport bandcamp from '../BandcampContext';\nimport BaseModel from './BaseModel';\nimport type TrackEntity from '../entities/TrackEntity';\nimport EntityConverter from '../util/EntityConverter';\n\nexport default class TrackModel extends BaseModel {\n\n getTrack(trackUrl: string) {\n // Unlike other resources, tracks are converted to TrackEntitys\n // Before being cached. See also AlbumModel#getAlbum(), where we\n // Cache an album's tracks that have been converted to entities.\n return bandcamp.getCache().getOrSet(\n this.getCacheKeyForFetch('track', { trackUrl }),\n () => this.#doGetTrack(trackUrl));\n }\n\n async #doGetTrack(trackUrl: string) {\n const queryParams = {\n trackUrl,\n albumImageFormat: this.getAlbumImageFormat(),\n artistImageFormat: this.getArtistImageFormat(),\n includeRawData: false\n };\n const trackInfo = await bcfetch.limiter.track.getInfo(queryParams);\n\n return this.#convertFetchedTrackToEntity(trackInfo);\n }\n\n #convertFetchedTrackToEntity(item: Track): TrackEntity {\n return EntityConverter.convertTrack(item);\n }\n}\n"]} \ No newline at end of file diff --git a/bandcamp/dist/lib/model/index.js b/bandcamp/dist/lib/model/index.js index b90a32d83..e0e718e1b 100644 --- a/bandcamp/dist/lib/model/index.js +++ b/bandcamp/dist/lib/model/index.js @@ -25,7 +25,7 @@ var ModelType; ModelType["Show"] = "Show"; ModelType["Tag"] = "Tag"; ModelType["Track"] = "Track"; -})(ModelType = exports.ModelType || (exports.ModelType = {})); +})(ModelType || (exports.ModelType = ModelType = {})); const MODEL_TYPE_TO_CLASS = { [ModelType.Album]: AlbumModel_1.default, [ModelType.Article]: ArticleModel_1.default, @@ -42,7 +42,7 @@ class Model { if (MODEL_TYPE_TO_CLASS[type]) { return new MODEL_TYPE_TO_CLASS[type](); } - throw Error(`Model not found for type ${ModelType}`); + throw Error(`Model not found for type ${String(type)}`); } static setCookie(value) { bandcamp_fetch_1.default.setCookie(value); diff --git a/bandcamp/dist/lib/model/index.js.map b/bandcamp/dist/lib/model/index.js.map index ecf877e3b..be379b509 100644 --- a/bandcamp/dist/lib/model/index.js.map +++ b/bandcamp/dist/lib/model/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/model/index.ts"],"names":[],"mappings":";;;;;;AAAA,oEAAqC;AACrC,8DAAsC;AACtC,kEAA0C;AAC1C,4DAAoC;AACpC,oEAA4C;AAC5C,0DAAkC;AAClC,gEAAwC;AACxC,4DAAoC;AACpC,0DAAkC;AAClC,8DAAsC;AAEtC,IAAY,SAUX;AAVD,WAAY,SAAS;IACnB,4BAAe,CAAA;IACf,gCAAmB,CAAA;IACnB,0BAAa,CAAA;IACb,kCAAqB,CAAA;IACrB,wBAAW,CAAA;IACX,8BAAiB,CAAA;IACjB,0BAAa,CAAA;IACb,wBAAW,CAAA;IACX,4BAAe,CAAA;AACjB,CAAC,EAVW,SAAS,GAAT,iBAAS,KAAT,iBAAS,QAUpB;AAED,MAAM,mBAAmB,GAAqB;IAC5C,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,oBAAU;IAC7B,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,sBAAY;IACjC,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,mBAAS;IAC3B,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,uBAAa;IACnC,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,kBAAQ;IACzB,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,qBAAW;IAC/B,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,mBAAS;IAC3B,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,kBAAQ;IACzB,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,oBAAU;CAC9B,CAAC;AAEF,MAAqB,KAAK;IAWxB,MAAM,CAAC,WAAW,CAAC,IAAe;QAChC,IAAI,mBAAmB,CAAC,IAAI,CAAC,EAAE;YAC7B,OAAO,IAAI,mBAAmB,CAAC,IAAI,CAAC,EAAE,CAAC;SACxC;QACD,MAAM,KAAK,CAAC,4BAA4B,SAAS,EAAE,CAAC,CAAC;IACvD,CAAC;IAED,MAAM,CAAC,SAAS,CAAC,KAAqB;QACpC,wBAAO,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC;IAED,MAAM,KAAK,MAAM;QACf,OAAO,wBAAO,CAAC,MAAM,CAAC;IACxB,CAAC;IAED,MAAM,CAAC,KAAK;QACV,wBAAO,CAAC,SAAS,EAAE,CAAC;QACpB,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;IAED,MAAM,CAAC,aAAa;QAClB,wBAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,GAAW;QACtC,MAAM,UAAU,GAAG,MAAM,wBAAO,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAClD,IAAI,UAAU,CAAC,EAAE,EAAE;YACjB,OAAO,GAAG,CAAC;SACZ;QACD,OAAO,MAAM,wBAAO,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC3C,CAAC;CACF;AA1CD,wBA0CC","sourcesContent":["import bcfetch from 'bandcamp-fetch';\nimport AlbumModel from './AlbumModel';\nimport ArticleModel from './ArticleModel';\nimport BandModel from './BandModel';\nimport DiscoverModel from './DiscoverModel';\nimport FanModel from './FanModel';\nimport SearchModel from './SearchModel';\nimport ShowModel from './ShowModel';\nimport TagModel from './TagModel';\nimport TrackModel from './TrackModel';\n\nexport enum ModelType {\n Album = 'Album',\n Article = 'Article',\n Band = 'Band',\n Discover = 'Discover',\n Fan = 'Fan',\n Search = 'Search',\n Show = 'Show',\n Tag = 'Tag',\n Track = 'Track'\n}\n\nconst MODEL_TYPE_TO_CLASS: Record = {\n [ModelType.Album]: AlbumModel,\n [ModelType.Article]: ArticleModel,\n [ModelType.Band]: BandModel,\n [ModelType.Discover]: DiscoverModel,\n [ModelType.Fan]: FanModel,\n [ModelType.Search]: SearchModel,\n [ModelType.Show]: ShowModel,\n [ModelType.Tag]: TagModel,\n [ModelType.Track]: TrackModel\n};\n\nexport default class Model {\n\n static getInstance(type: ModelType.Album): AlbumModel;\n static getInstance(type: ModelType.Article): ArticleModel;\n static getInstance(type: ModelType.Band): BandModel;\n static getInstance(type: ModelType.Discover): DiscoverModel;\n static getInstance(type: ModelType.Fan): FanModel;\n static getInstance(type: ModelType.Search): SearchModel;\n static getInstance(type: ModelType.Show): ShowModel;\n static getInstance(type: ModelType.Tag): TagModel;\n static getInstance(type: ModelType.Track): TrackModel;\n static getInstance(type: ModelType) {\n if (MODEL_TYPE_TO_CLASS[type]) {\n return new MODEL_TYPE_TO_CLASS[type]();\n }\n throw Error(`Model not found for type ${ModelType}`);\n }\n\n static setCookie(value?: string | null) {\n bcfetch.setCookie(value);\n }\n\n static get cookie() {\n return bcfetch.cookie;\n }\n\n static reset() {\n bcfetch.setCookie();\n this.clearLibCache();\n }\n\n static clearLibCache() {\n bcfetch.cache.clear();\n }\n\n static async ensureStreamURL(url: string) {\n const testResult = await bcfetch.stream.test(url);\n if (testResult.ok) {\n return url;\n }\n return await bcfetch.stream.refresh(url);\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/model/index.ts"],"names":[],"mappings":";;;;;;AAAA,oEAAqC;AACrC,8DAAsC;AACtC,kEAA0C;AAC1C,4DAAoC;AACpC,oEAA4C;AAC5C,0DAAkC;AAClC,gEAAwC;AACxC,4DAAoC;AACpC,0DAAkC;AAClC,8DAAsC;AAEtC,IAAY,SAUX;AAVD,WAAY,SAAS;IACnB,4BAAe,CAAA;IACf,gCAAmB,CAAA;IACnB,0BAAa,CAAA;IACb,kCAAqB,CAAA;IACrB,wBAAW,CAAA;IACX,8BAAiB,CAAA;IACjB,0BAAa,CAAA;IACb,wBAAW,CAAA;IACX,4BAAe,CAAA;AACjB,CAAC,EAVW,SAAS,yBAAT,SAAS,QAUpB;AAED,MAAM,mBAAmB,GAAqB;IAC5C,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,oBAAU;IAC7B,CAAC,SAAS,CAAC,OAAO,CAAC,EAAE,sBAAY;IACjC,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,mBAAS;IAC3B,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,uBAAa;IACnC,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,kBAAQ;IACzB,CAAC,SAAS,CAAC,MAAM,CAAC,EAAE,qBAAW;IAC/B,CAAC,SAAS,CAAC,IAAI,CAAC,EAAE,mBAAS;IAC3B,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,kBAAQ;IACzB,CAAC,SAAS,CAAC,KAAK,CAAC,EAAE,oBAAU;CAC9B,CAAC;AAEF,MAAqB,KAAK;IAWxB,MAAM,CAAC,WAAW,CAAC,IAAe;QAChC,IAAI,mBAAmB,CAAC,IAAI,CAAC,EAAE,CAAC;YAC9B,OAAO,IAAI,mBAAmB,CAAC,IAAI,CAAC,EAAE,CAAC;QACzC,CAAC;QACD,MAAM,KAAK,CAAC,4BAA4B,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAC1D,CAAC;IAED,MAAM,CAAC,SAAS,CAAC,KAAqB;QACpC,wBAAO,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC;IAC3B,CAAC;IAED,MAAM,KAAK,MAAM;QACf,OAAO,wBAAO,CAAC,MAAM,CAAC;IACxB,CAAC;IAED,MAAM,CAAC,KAAK;QACV,wBAAO,CAAC,SAAS,EAAE,CAAC;QACpB,IAAI,CAAC,aAAa,EAAE,CAAC;IACvB,CAAC;IAED,MAAM,CAAC,aAAa;QAClB,wBAAO,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;IACxB,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,eAAe,CAAC,GAAW;QACtC,MAAM,UAAU,GAAG,MAAM,wBAAO,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;QAClD,IAAI,UAAU,CAAC,EAAE,EAAE,CAAC;YAClB,OAAO,GAAG,CAAC;QACb,CAAC;QACD,OAAO,MAAM,wBAAO,CAAC,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAC3C,CAAC;CACF;AA1CD,wBA0CC","sourcesContent":["import bcfetch from 'bandcamp-fetch';\nimport AlbumModel from './AlbumModel';\nimport ArticleModel from './ArticleModel';\nimport BandModel from './BandModel';\nimport DiscoverModel from './DiscoverModel';\nimport FanModel from './FanModel';\nimport SearchModel from './SearchModel';\nimport ShowModel from './ShowModel';\nimport TagModel from './TagModel';\nimport TrackModel from './TrackModel';\n\nexport enum ModelType {\n Album = 'Album',\n Article = 'Article',\n Band = 'Band',\n Discover = 'Discover',\n Fan = 'Fan',\n Search = 'Search',\n Show = 'Show',\n Tag = 'Tag',\n Track = 'Track'\n}\n\nconst MODEL_TYPE_TO_CLASS: Record = {\n [ModelType.Album]: AlbumModel,\n [ModelType.Article]: ArticleModel,\n [ModelType.Band]: BandModel,\n [ModelType.Discover]: DiscoverModel,\n [ModelType.Fan]: FanModel,\n [ModelType.Search]: SearchModel,\n [ModelType.Show]: ShowModel,\n [ModelType.Tag]: TagModel,\n [ModelType.Track]: TrackModel\n};\n\nexport default class Model {\n\n static getInstance(type: ModelType.Album): AlbumModel;\n static getInstance(type: ModelType.Article): ArticleModel;\n static getInstance(type: ModelType.Band): BandModel;\n static getInstance(type: ModelType.Discover): DiscoverModel;\n static getInstance(type: ModelType.Fan): FanModel;\n static getInstance(type: ModelType.Search): SearchModel;\n static getInstance(type: ModelType.Show): ShowModel;\n static getInstance(type: ModelType.Tag): TagModel;\n static getInstance(type: ModelType.Track): TrackModel;\n static getInstance(type: ModelType) {\n if (MODEL_TYPE_TO_CLASS[type]) {\n return new MODEL_TYPE_TO_CLASS[type]();\n }\n throw Error(`Model not found for type ${String(type)}`);\n }\n\n static setCookie(value?: string | null) {\n bcfetch.setCookie(value);\n }\n\n static get cookie() {\n return bcfetch.cookie;\n }\n\n static reset() {\n bcfetch.setCookie();\n this.clearLibCache();\n }\n\n static clearLibCache() {\n bcfetch.cache.clear();\n }\n\n static async ensureStreamURL(url: string) {\n const testResult = await bcfetch.stream.test(url);\n if (testResult.ok) {\n return url;\n }\n return await bcfetch.stream.refresh(url);\n }\n}\n"]} \ No newline at end of file diff --git a/bandcamp/dist/lib/util/Cache.d.ts.map b/bandcamp/dist/lib/util/Cache.d.ts.map index af4a4192e..06c84336b 100644 --- a/bandcamp/dist/lib/util/Cache.d.ts.map +++ b/bandcamp/dist/lib/util/Cache.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"Cache.d.ts","sourceRoot":"","sources":["../../../src/lib/util/Cache.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,OAAO,OAAO,KAAK;;gBAKZ,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM;IAQ3C,MAAM,CAAC,GAAG,EAAE,MAAM;IAUlB,aAAa,CAAC,UAAU,EAAE,MAAM;IAWhC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;IAIlC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IAQ5B,KAAK;IAKL,KAAK;IAIL,aAAa;IAIb,kBAAkB;IAIZ,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;CAS9E"} \ No newline at end of file +{"version":3,"file":"Cache.d.ts","sourceRoot":"","sources":["../../../src/lib/util/Cache.ts"],"names":[],"mappings":"AAGA,MAAM,CAAC,OAAO,OAAO,KAAK;;gBAKZ,GAAG,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM;IAQ3C,MAAM,CAAC,GAAG,EAAE,MAAM;IAUlB,aAAa,CAAC,UAAU,EAAE,MAAM;IAYhC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,GAAG,CAAC,GAAG,SAAS;IAKlC,GAAG,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,KAAK,EAAE,CAAC;IAQ5B,KAAK;IAKL,KAAK;IAIL,aAAa;IAIb,kBAAkB;IAIZ,QAAQ,CAAC,CAAC,EAAE,GAAG,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,OAAO,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC;CAS9E"} \ No newline at end of file diff --git a/bandcamp/dist/lib/util/Cache.js b/bandcamp/dist/lib/util/Cache.js index 95d860b5f..4be54faba 100644 --- a/bandcamp/dist/lib/util/Cache.js +++ b/bandcamp/dist/lib/util/Cache.js @@ -47,9 +47,11 @@ class Cache { } __classPrivateFieldSet(this, _Cache_maxEntries, maxEntries, "f"); } + // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters get(key) { return __classPrivateFieldGet(this, _Cache_cache, "f").get(key); } + // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters put(key, value) { const keys = __classPrivateFieldGet(this, _Cache_cache, "f").keys(); if (keys.length === __classPrivateFieldGet(this, _Cache_maxEntries, "f")) { @@ -80,6 +82,6 @@ class Cache { return value; } } -exports.default = Cache; _Cache_ttl = new WeakMap(), _Cache_maxEntries = new WeakMap(), _Cache_cache = new WeakMap(); +exports.default = Cache; //# sourceMappingURL=Cache.js.map \ No newline at end of file diff --git a/bandcamp/dist/lib/util/Cache.js.map b/bandcamp/dist/lib/util/Cache.js.map index 28b0c8c03..ead7e9461 100644 --- a/bandcamp/dist/lib/util/Cache.js.map +++ b/bandcamp/dist/lib/util/Cache.js.map @@ -1 +1 @@ -{"version":3,"file":"Cache.js","sourceRoot":"","sources":["../../../src/lib/util/Cache.ts"],"names":[],"mappings":"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","sourcesContent":["import NodeCache from 'node-cache';\nimport bcfetch from 'bandcamp-fetch';\n\nexport default class Cache {\n #ttl: number;\n #maxEntries: number;\n #cache: NodeCache;\n\n constructor(ttl: number, maxEntries: number) {\n this.#ttl = ttl;\n this.#maxEntries = maxEntries;\n this.#cache = new NodeCache({\n checkperiod: 600\n });\n }\n\n setTTL(ttl: number) {\n if (this.#ttl != ttl) {\n const keys = this.#cache.keys();\n keys.forEach((key) => {\n this.#cache.ttl(key, ttl);\n });\n }\n this.#ttl = ttl;\n }\n\n setMaxEntries(maxEntries: number) {\n const keyCount = this.#cache.keys().length;\n if (keyCount > maxEntries) {\n const keys = this.#cache.keys();\n for (let i = 0; i < keyCount - maxEntries; i++) {\n this.#cache.del(keys[i]);\n }\n }\n this.#maxEntries = maxEntries;\n }\n\n get(key: string): T | undefined {\n return this.#cache.get(key);\n }\n\n put(key: string, value: T) {\n const keys = this.#cache.keys();\n if (keys.length === this.#maxEntries) {\n this.#cache.del(keys[0]);\n }\n return this.#cache.set(key, value, this.#ttl);\n }\n\n clear() {\n this.#cache.flushAll();\n bcfetch.cache.clear();\n }\n\n close() {\n this.#cache.close();\n }\n\n getEntryCount() {\n return this.#cache.getStats().keys;\n }\n\n getMemoryUsageInKB() {\n return (this.#cache.getStats().vsize + this.#cache.getStats().ksize) / 1000;\n }\n\n async getOrSet(key: string, promiseCallback: () => Promise): Promise {\n const cachedValue = this.get(key);\n if (cachedValue !== undefined) {\n return cachedValue;\n }\n const value = await promiseCallback();\n this.put(key, value);\n return value;\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"Cache.js","sourceRoot":"","sources":["../../../src/lib/util/Cache.ts"],"names":[],"mappings":"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","sourcesContent":["import NodeCache from 'node-cache';\nimport bcfetch from 'bandcamp-fetch';\n\nexport default class Cache {\n #ttl: number;\n #maxEntries: number;\n #cache: NodeCache;\n\n constructor(ttl: number, maxEntries: number) {\n this.#ttl = ttl;\n this.#maxEntries = maxEntries;\n this.#cache = new NodeCache({\n checkperiod: 600\n });\n }\n\n setTTL(ttl: number) {\n if (this.#ttl != ttl) {\n const keys = this.#cache.keys();\n keys.forEach((key) => {\n this.#cache.ttl(key, ttl);\n });\n }\n this.#ttl = ttl;\n }\n\n setMaxEntries(maxEntries: number) {\n const keyCount = this.#cache.keys().length;\n if (keyCount > maxEntries) {\n const keys = this.#cache.keys();\n for (let i = 0; i < keyCount - maxEntries; i++) {\n this.#cache.del(keys[i]);\n }\n }\n this.#maxEntries = maxEntries;\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters\n get(key: string): T | undefined {\n return this.#cache.get(key);\n }\n\n // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters\n put(key: string, value: T) {\n const keys = this.#cache.keys();\n if (keys.length === this.#maxEntries) {\n this.#cache.del(keys[0]);\n }\n return this.#cache.set(key, value, this.#ttl);\n }\n\n clear() {\n this.#cache.flushAll();\n bcfetch.cache.clear();\n }\n\n close() {\n this.#cache.close();\n }\n\n getEntryCount() {\n return this.#cache.getStats().keys;\n }\n\n getMemoryUsageInKB() {\n return (this.#cache.getStats().vsize + this.#cache.getStats().ksize) / 1000;\n }\n\n async getOrSet(key: string, promiseCallback: () => Promise): Promise {\n const cachedValue = this.get(key);\n if (cachedValue !== undefined) {\n return cachedValue;\n }\n const value = await promiseCallback();\n this.put(key, value);\n return value;\n }\n}\n"]} \ No newline at end of file diff --git a/bandcamp/dist/lib/util/EntityConverter.d.ts b/bandcamp/dist/lib/util/EntityConverter.d.ts index 6c0ffa7ee..e990b6914 100644 --- a/bandcamp/dist/lib/util/EntityConverter.d.ts +++ b/bandcamp/dist/lib/util/EntityConverter.d.ts @@ -1,12 +1,12 @@ -import { Album, Article, ArticleListItem, Artist, Label, LabelArtist, SearchResultAlbum, SearchResultArtist, SearchResultLabel, SearchResultTrack, Show, Tag, Track, UserKind } from 'bandcamp-fetch'; -import AlbumEntity from '../entities/AlbumEntity'; -import ArtistEntity from '../entities/ArtistEntity'; -import BandEntity from '../entities/BandEntity'; -import LabelEntity from '../entities/LabelEntity'; -import TrackEntity from '../entities/TrackEntity'; -import TagEntity from '../entities/TagEntity'; -import ShowEntity from '../entities/ShowEntity'; -import ArticleEntity from '../entities/ArticleEntity'; +import { type Album, type Article, type ArticleListItem, type Artist, type Label, type LabelArtist, type SearchResultAlbum, type SearchResultArtist, type SearchResultLabel, type SearchResultTrack, type Show, type Tag, type Track, type UserKind } from 'bandcamp-fetch'; +import type AlbumEntity from '../entities/AlbumEntity'; +import type ArtistEntity from '../entities/ArtistEntity'; +import type BandEntity from '../entities/BandEntity'; +import type LabelEntity from '../entities/LabelEntity'; +import type TrackEntity from '../entities/TrackEntity'; +import type TagEntity from '../entities/TagEntity'; +import type ShowEntity from '../entities/ShowEntity'; +import type ArticleEntity from '../entities/ArticleEntity'; export default class EntityConverter { static convertAlbum(data: Album): AlbumEntity; static convertArtist(data: Artist | LabelArtist): ArtistEntity; diff --git a/bandcamp/dist/lib/util/EntityConverter.d.ts.map b/bandcamp/dist/lib/util/EntityConverter.d.ts.map index 1b24c2504..ce1e628cc 100644 --- a/bandcamp/dist/lib/util/EntityConverter.d.ts.map +++ b/bandcamp/dist/lib/util/EntityConverter.d.ts.map @@ -1 +1 @@ -{"version":3,"file":"EntityConverter.d.ts","sourceRoot":"","sources":["../../../src/lib/util/EntityConverter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,eAAe,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,EAAE,iBAAiB,EAAE,kBAAkB,EAAE,iBAAiB,EAAE,iBAAiB,EAAE,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AACtM,OAAO,WAAW,MAAM,yBAAyB,CAAC;AAClD,OAAO,YAAY,MAAM,0BAA0B,CAAC;AACpD,OAAO,UAAU,MAAM,wBAAwB,CAAC;AAChD,OAAO,WAAW,MAAM,yBAAyB,CAAC;AAClD,OAAO,WAAW,MAAM,yBAAyB,CAAC;AAClD,OAAO,SAAS,MAAM,uBAAuB,CAAC;AAC9C,OAAO,UAAU,MAAM,wBAAwB,CAAC;AAChD,OAAO,aAA+D,MAAM,2BAA2B,CAAC;AAExG,MAAM,CAAC,OAAO,OAAO,eAAe;IAClC,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,GAAG,WAAW;IA8C7C,MAAM,CAAC,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAI,YAAY;IAY/D,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,GAAG,WAAW;IAS7C,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,GAAG,WAAW;IA0C7C,MAAM,CAAC,uBAAuB,CAAC,IAAI,EAAE,kBAAkB,GAAG,iBAAiB,GAAG,iBAAiB,GAAG,iBAAiB,GAAG,YAAY,GAAG,WAAW,GAAG,WAAW,GAAG,WAAW;IAoB5K,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,GAAG,UAAU;IAyB1C,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,UAAU;IA6B/D,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,GAAG,SAAS;IAcvC,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,OAAO,GAAG,aAAa;IA8DnD,MAAM,CAAC,sBAAsB,CAAC,IAAI,EAAE,eAAe,GAAG,aAAa;CAqBpE"} \ No newline at end of file +{"version":3,"file":"EntityConverter.d.ts","sourceRoot":"","sources":["../../../src/lib/util/EntityConverter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,KAAK,EAAE,KAAK,OAAO,EAAE,KAAK,eAAe,EAAE,KAAK,MAAM,EAAE,KAAK,KAAK,EAAE,KAAK,WAAW,EAAE,KAAK,iBAAiB,EAAE,KAAK,kBAAkB,EAAE,KAAK,iBAAiB,EAAE,KAAK,iBAAiB,EAAE,KAAK,IAAI,EAAE,KAAK,GAAG,EAAE,KAAK,KAAK,EAAE,KAAK,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC5Q,OAAO,KAAK,WAAW,MAAM,yBAAyB,CAAC;AACvD,OAAO,KAAK,YAAY,MAAM,0BAA0B,CAAC;AACzD,OAAO,KAAK,UAAU,MAAM,wBAAwB,CAAC;AACrD,OAAO,KAAK,WAAW,MAAM,yBAAyB,CAAC;AACvD,OAAO,KAAK,WAAW,MAAM,yBAAyB,CAAC;AACvD,OAAO,KAAK,SAAS,MAAM,uBAAuB,CAAC;AACnD,OAAO,KAAK,UAAU,MAAM,wBAAwB,CAAC;AAErD,OAAO,KAAK,aAAa,MAAM,2BAA2B,CAAC;AAE3D,MAAM,CAAC,OAAO,OAAO,eAAe;IAClC,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,GAAG,WAAW;IA8C7C,MAAM,CAAC,aAAa,CAAC,IAAI,EAAE,MAAM,GAAG,WAAW,GAAI,YAAY;IAY/D,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,GAAG,WAAW;IAS7C,MAAM,CAAC,YAAY,CAAC,IAAI,EAAE,KAAK,GAAG,WAAW;IA6C7C,MAAM,CAAC,uBAAuB,CAAC,IAAI,EAAE,kBAAkB,GAAG,iBAAiB,GAAG,iBAAiB,GAAG,iBAAiB,GAAG,YAAY,GAAG,WAAW,GAAG,WAAW,GAAG,WAAW;IAsB5K,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,IAAI,GAAG,UAAU;IAyB1C,MAAM,CAAC,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,KAAK,GAAG,QAAQ,GAAG,UAAU;IA6B/D,MAAM,CAAC,UAAU,CAAC,IAAI,EAAE,GAAG,GAAG,SAAS;IAcvC,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,OAAO,GAAG,aAAa;IA8DnD,MAAM,CAAC,sBAAsB,CAAC,IAAI,EAAE,eAAe,GAAG,aAAa;CAqBpE"} \ No newline at end of file diff --git a/bandcamp/dist/lib/util/EntityConverter.js b/bandcamp/dist/lib/util/EntityConverter.js index 5b4edc21d..142630d23 100644 --- a/bandcamp/dist/lib/util/EntityConverter.js +++ b/bandcamp/dist/lib/util/EntityConverter.js @@ -66,6 +66,9 @@ class EntityConverter { type: 'track', name: data.name }; + if (data.id) { + result.id = data.id; + } if (data.url) { result.url = data.url; } @@ -106,10 +109,11 @@ class EntityConverter { return this.convertArtist(item); case 'label': return this.convertLabel(item); - case 'album': + case 'album': { const albumArtist = item.artist ? { name: item.artist } : undefined; return this.convertAlbum({ ...item, artist: albumArtist }); - case 'track': + } + case 'track': { const trackArtist = item.artist ? { name: item.artist } : undefined; const trackAlbum = item.album ? { name: item.album } : undefined; return this.convertTrack({ @@ -117,6 +121,7 @@ class EntityConverter { artist: trackArtist, album: trackAlbum }); + } } } static convertShow(data) { @@ -172,7 +177,7 @@ class EntityConverter { const result = { type: 'tag', name: data.name, - url: data.url + value: data.value }; if (data.imageUrls?.[0]) { result.thumbnail = data.imageUrls[0]; diff --git a/bandcamp/dist/lib/util/EntityConverter.js.map b/bandcamp/dist/lib/util/EntityConverter.js.map index 6640245c2..e6d10b012 100644 --- a/bandcamp/dist/lib/util/EntityConverter.js.map +++ b/bandcamp/dist/lib/util/EntityConverter.js.map @@ -1 +1 @@ -{"version":3,"file":"EntityConverter.js","sourceRoot":"","sources":["../../../src/lib/util/EntityConverter.ts"],"names":[],"mappings":"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","sourcesContent":["import { Album, Article, ArticleListItem, Artist, Label, LabelArtist, SearchResultAlbum, SearchResultArtist, SearchResultLabel, SearchResultTrack, Show, Tag, Track, UserKind } from 'bandcamp-fetch';\nimport AlbumEntity from '../entities/AlbumEntity';\nimport ArtistEntity from '../entities/ArtistEntity';\nimport BandEntity from '../entities/BandEntity';\nimport LabelEntity from '../entities/LabelEntity';\nimport TrackEntity from '../entities/TrackEntity';\nimport TagEntity from '../entities/TagEntity';\nimport ShowEntity from '../entities/ShowEntity';\nimport ArticleEntity, { ArticleEntityMediaItem, ArticleEntitySection } from '../entities/ArticleEntity';\n\nexport default class EntityConverter {\n static convertAlbum(data: Album): AlbumEntity {\n const result: AlbumEntity = {\n type: 'album',\n name: data.name\n };\n if (data.url) {\n result.url = data.url;\n }\n if (data.imageUrl) {\n result.thumbnail = data.imageUrl;\n }\n if (data.artist) {\n result.artist = this.convertArtist({ ...data.artist, type: 'artist' });\n }\n if (data.tracks) {\n result.tracks = data.tracks.map((track) => this.convertTrack({ ...track, type: 'track', album: undefined }));\n }\n if (data.featuredTrack) {\n result.featuredTrack = this.convertTrack({ ...data.featuredTrack, type: 'track' });\n }\n if (data.releaseDate) {\n result.releaseDate = data.releaseDate;\n }\n\n result.tracks?.forEach((track) => {\n track.album = {\n type: 'album',\n name: data.name\n };\n if (data.url) {\n track.album.url = data.url;\n }\n if (data.imageUrl) {\n track.album.thumbnail = data.imageUrl;\n if (!track.thumbnail) {\n track.thumbnail = data.imageUrl;\n }\n }\n if (!track.artist && result.artist) {\n track.artist = result.artist;\n }\n });\n\n return result;\n }\n\n static convertArtist(data: Artist | LabelArtist) : ArtistEntity {\n const result: ArtistEntity = {\n ...this.convertBand({ ...data, type: 'artist' }),\n type: 'artist'\n };\n if (data.label) {\n result.label = this.convertLabel(data.label);\n }\n\n return result;\n }\n\n static convertLabel(data: Label): LabelEntity {\n const result: LabelEntity = {\n ...this.convertBand(data),\n type: 'label'\n };\n\n return result;\n }\n\n static convertTrack(data: Track): TrackEntity {\n const result: TrackEntity = {\n type: 'track',\n name: data.name\n };\n if (data.url) {\n result.url = data.url;\n }\n if (data.duration) {\n result.duration = data.duration;\n }\n if (data.imageUrl) {\n result.thumbnail = data.imageUrl;\n }\n if (data.streamUrlHQ) {\n result.streamUrl = data.streamUrlHQ;\n }\n else if (data.streamUrl) {\n result.streamUrl = data.streamUrl;\n }\n if (data.album) {\n result.album = this.convertAlbum({ ...data.album, type: 'album', tracks: undefined });\n }\n if (data.artist) {\n result.artist = this.convertArtist({ ...data.artist, type: 'artist' });\n }\n if (data.position) {\n result.position = data.position;\n }\n\n if (result.album) {\n if (!result.album.thumbnail && data.imageUrl) {\n result.album.thumbnail = data.imageUrl;\n }\n if (!result.album.artist && result.artist) {\n result.album.artist = result.artist;\n }\n }\n\n return result;\n }\n\n static convertSearchResultItem(item: SearchResultArtist | SearchResultLabel | SearchResultAlbum | SearchResultTrack): ArtistEntity | LabelEntity | AlbumEntity | TrackEntity {\n switch (item.type) {\n case 'artist':\n return this.convertArtist(item);\n case 'label':\n return this.convertLabel(item);\n case 'album':\n const albumArtist = item.artist ? { name: item.artist } : undefined;\n return this.convertAlbum({ ...item, artist: albumArtist });\n case 'track':\n const trackArtist = item.artist ? { name: item.artist } : undefined;\n const trackAlbum = item.album ? { name: item.album } : undefined;\n return this.convertTrack({\n ...item,\n artist: trackArtist,\n album: trackAlbum\n });\n }\n }\n\n static convertShow(data: Show): ShowEntity {\n const result: ShowEntity = {\n type: 'show',\n name: data.name,\n url: data.url,\n description: data.description,\n date: data.publishedDate\n };\n\n if (data.imageUrl) {\n result.thumbnail = data.imageUrl;\n }\n if (data.streamUrl?.['mp3-128']) {\n result.streamUrl = data.streamUrl['mp3-128'];\n }\n if (data.duration) {\n result.duration = data.duration;\n }\n if (data.tracks) {\n result.tracks = data.tracks.map((track) => this.convertTrack({ ...track, type: 'track' }));\n }\n\n return result;\n }\n\n static convertBand(data: Artist | Label | UserKind): BandEntity {\n let type: BandEntity['type'];\n switch ((data as any).type) {\n case 'artist':\n type = 'artist';\n break;\n case 'label':\n type = 'label';\n break;\n default: // UserKind does not have 'type'\n type = 'artistOrLabel';\n }\n const result: BandEntity = {\n type,\n name: data.name\n };\n if (data.url) {\n result.url = data.url;\n }\n if (data.imageUrl) {\n result.thumbnail = data.imageUrl;\n }\n if (data.location) {\n result.location = data.location;\n }\n\n return result;\n }\n\n static convertTag(data: Tag): TagEntity {\n const result: TagEntity = {\n type: 'tag',\n name: data.name,\n url: data.url\n };\n\n if (data.imageUrls?.[0]) {\n result.thumbnail = data.imageUrls[0];\n }\n\n return result;\n }\n\n static convertArticle(data: Article): ArticleEntity {\n const result: ArticleEntity = {\n type: 'article',\n url: data.url,\n title: data.title,\n description: data.description,\n thumbnail: data.imageUrl,\n date: data.date,\n category: {\n name: data.category.name\n },\n author: {\n name: data.author.name,\n url: data.author.url\n },\n mediaItems: [],\n sections: []\n };\n\n if (data.category.url && result.category) {\n result.category.url = data.category.url;\n }\n\n result.mediaItems = data.mediaItems.map((item) => {\n let entityMediaItem;\n if (item.type === 'album') {\n entityMediaItem = {\n ...this.convertAlbum(item),\n featuredTrackPosition: item.featuredTrackPosition\n } as ArticleEntityMediaItem;\n }\n else {\n entityMediaItem = {\n ...this.convertTrack(item),\n featuredTrackPosition: item.featuredTrackPosition\n } as ArticleEntityMediaItem;\n }\n if (item.mediaItemRef) {\n entityMediaItem.mediaItemRef = item.mediaItemRef;\n }\n return entityMediaItem;\n });\n\n result.sections = data.sections.map((section) => {\n const entitySection: ArticleEntitySection = {\n text: section.text\n };\n\n if (section.mediaItemRef) {\n entitySection.mediaItemRef = section.mediaItemRef;\n }\n if (section.heading) {\n entitySection.heading = {\n text: section.heading.text\n };\n }\n return entitySection;\n });\n\n return result;\n }\n\n static convertArticleListItem(data: ArticleListItem): ArticleEntity {\n const result: ArticleEntity = {\n type: 'article',\n url: data.url,\n title: data.title,\n date: data.date\n };\n if (data.category) {\n result.category = {\n name: data.category.name\n };\n if (data.category.url) {\n result.category.url = data.category.url;\n }\n }\n if (data.imageUrl) {\n result.thumbnail = data.imageUrl;\n }\n\n return result;\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"EntityConverter.js","sourceRoot":"","sources":["../../../src/lib/util/EntityConverter.ts"],"names":[],"mappings":";;AAWA,MAAqB,eAAe;IAClC,MAAM,CAAC,YAAY,CAAC,IAAW;QAC7B,MAAM,MAAM,GAAgB;YAC1B,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,IAAI,CAAC,IAAI;SAChB,CAAC;QACF,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;QACxB,CAAC;QACD,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC;QACnC,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;QACzE,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,KAAK,EAAE,SAAS,EAAE,CAAC,CAAC,CAAC;QAC/G,CAAC;QACD,IAAI,IAAI,CAAC,aAAa,EAAE,CAAC;YACvB,MAAM,CAAC,aAAa,GAAG,IAAI,CAAC,YAAY,CAAC,EAAE,GAAG,IAAI,CAAC,aAAa,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC;QACrF,CAAC;QACD,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,MAAM,CAAC,WAAW,GAAG,IAAI,CAAC,WAAW,CAAC;QACxC,CAAC;QAED,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,KAAK,EAAE,EAAE;YAC/B,KAAK,CAAC,KAAK,GAAG;gBACZ,IAAI,EAAE,OAAO;gBACb,IAAI,EAAE,IAAI,CAAC,IAAI;aAChB,CAAC;YACF,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;gBACb,KAAK,CAAC,KAAK,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;YAC7B,CAAC;YACD,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAClB,KAAK,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC;gBACtC,IAAI,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;oBACrB,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC;gBAClC,CAAC;YACH,CAAC;YACD,IAAI,CAAC,KAAK,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;gBACnC,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;YAC/B,CAAC;QACH,CAAC,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,CAAC,aAAa,CAAC,IAA0B;QAC7C,MAAM,MAAM,GAAiB;YAC3B,GAAG,IAAI,CAAC,WAAW,CAAC,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC;YAChD,IAAI,EAAE,QAAQ;SACf,CAAC;QACF,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC/C,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,CAAC,YAAY,CAAC,IAAW;QAC7B,MAAM,MAAM,GAAgB;YAC1B,GAAG,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC;YACzB,IAAI,EAAE,OAAO;SACd,CAAC;QAEF,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,CAAC,YAAY,CAAC,IAAW;QAC7B,MAAM,MAAM,GAAgB;YAC1B,IAAI,EAAE,OAAO;YACb,IAAI,EAAE,IAAI,CAAC,IAAI;SAChB,CAAC;QACF,IAAI,IAAI,CAAC,EAAE,EAAE,CAAC;YACZ,MAAM,CAAC,EAAE,GAAG,IAAI,CAAC,EAAE,CAAC;QACtB,CAAC;QACD,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;QACxB,CAAC;QACD,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAClC,CAAC;QACD,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC;QACnC,CAAC;QACD,IAAI,IAAI,CAAC,WAAW,EAAE,CAAC;YACrB,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,WAAW,CAAC;QACtC,CAAC;aACI,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC;YACxB,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC;QACpC,CAAC;QACD,IAAI,IAAI,CAAC,KAAK,EAAE,CAAC;YACf,MAAM,CAAC,KAAK,GAAG,IAAI,CAAC,YAAY,CAAC,EAAE,GAAG,IAAI,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,CAAC,CAAC;QACxF,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,aAAa,CAAC,EAAE,GAAG,IAAI,CAAC,MAAM,EAAE,IAAI,EAAE,QAAQ,EAAE,CAAC,CAAC;QACzE,CAAC;QACD,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAClC,CAAC;QAED,IAAI,MAAM,CAAC,KAAK,EAAE,CAAC;YACjB,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,SAAS,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;gBAC7C,MAAM,CAAC,KAAK,CAAC,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC;YACzC,CAAC;YACD,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;gBAC1C,MAAM,CAAC,KAAK,CAAC,MAAM,GAAG,MAAM,CAAC,MAAM,CAAC;YACtC,CAAC;QACH,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,CAAC,uBAAuB,CAAC,IAAoF;QACjH,QAAQ,IAAI,CAAC,IAAI,EAAE,CAAC;YAClB,KAAK,QAAQ;gBACX,OAAO,IAAI,CAAC,aAAa,CAAC,IAAI,CAAC,CAAC;YAClC,KAAK,OAAO;gBACV,OAAO,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;YACjC,KAAK,OAAO,CAAC,CAAC,CAAC;gBACb,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;gBACpE,OAAO,IAAI,CAAC,YAAY,CAAC,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,WAAW,EAAE,CAAC,CAAC;YAC7D,CAAC;YACD,KAAK,OAAO,CAAC,CAAC,CAAC;gBACb,MAAM,WAAW,GAAG,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;gBACpE,MAAM,UAAU,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,SAAS,CAAC;gBACjE,OAAO,IAAI,CAAC,YAAY,CAAC;oBACvB,GAAG,IAAI;oBACP,MAAM,EAAE,WAAW;oBACnB,KAAK,EAAE,UAAU;iBAClB,CAAC,CAAC;YACL,CAAC;QACH,CAAC;IACH,CAAC;IAED,MAAM,CAAC,WAAW,CAAC,IAAU;QAC3B,MAAM,MAAM,GAAe;YACzB,IAAI,EAAE,MAAM;YACZ,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,IAAI,EAAE,IAAI,CAAC,aAAa;SACzB,CAAC;QAEF,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC;QACnC,CAAC;QACD,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC,SAAS,CAAC,EAAE,CAAC;YAChC,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,SAAS,CAAC,CAAC;QAC/C,CAAC;QACD,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAClC,CAAC;QACD,IAAI,IAAI,CAAC,MAAM,EAAE,CAAC;YAChB,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,CAAC,YAAY,CAAC,EAAE,GAAG,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,CAAC,CAAC,CAAC;QAC7F,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,CAAC,WAAW,CAAC,IAA+B;QAChD,IAAI,IAAwB,CAAC;QAC7B,QAAS,IAAY,CAAC,IAAI,EAAE,CAAC;YAC3B,KAAK,QAAQ;gBACX,IAAI,GAAG,QAAQ,CAAC;gBAChB,MAAM;YACR,KAAK,OAAO;gBACV,IAAI,GAAG,OAAO,CAAC;gBACf,MAAM;YACR,SAAS,gCAAgC;gBACvC,IAAI,GAAG,eAAe,CAAC;QAC3B,CAAC;QACD,MAAM,MAAM,GAAe;YACzB,IAAI;YACJ,IAAI,EAAE,IAAI,CAAC,IAAI;SAChB,CAAC;QACF,IAAI,IAAI,CAAC,GAAG,EAAE,CAAC;YACb,MAAM,CAAC,GAAG,GAAG,IAAI,CAAC,GAAG,CAAC;QACxB,CAAC;QACD,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC;QACnC,CAAC;QACD,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC;QAClC,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,CAAC,UAAU,CAAC,IAAS;QACzB,MAAM,MAAM,GAAc;YACxB,IAAI,EAAE,KAAK;YACX,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,KAAK,EAAE,IAAI,CAAC,KAAK;SAClB,CAAC;QAEF,IAAI,IAAI,CAAC,SAAS,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;YACxB,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QACvC,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,CAAC,cAAc,CAAC,IAAa;QACjC,MAAM,MAAM,GAAkB;YAC5B,IAAI,EAAE,SAAS;YACf,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,WAAW,EAAE,IAAI,CAAC,WAAW;YAC7B,SAAS,EAAE,IAAI,CAAC,QAAQ;YACxB,IAAI,EAAE,IAAI,CAAC,IAAI;YACf,QAAQ,EAAE;gBACR,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI;aACzB;YACD,MAAM,EAAE;gBACN,IAAI,EAAE,IAAI,CAAC,MAAM,CAAC,IAAI;gBACtB,GAAG,EAAE,IAAI,CAAC,MAAM,CAAC,GAAG;aACrB;YACD,UAAU,EAAE,EAAE;YACd,QAAQ,EAAE,EAAE;SACb,CAAC;QAEF,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;YACzC,MAAM,CAAC,QAAQ,CAAC,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;QAC1C,CAAC;QAED,MAAM,CAAC,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE;YAC/C,IAAI,eAAe,CAAC;YACpB,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,EAAE,CAAC;gBAC1B,eAAe,GAAG;oBAChB,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;oBAC1B,qBAAqB,EAAE,IAAI,CAAC,qBAAqB;iBACX,CAAC;YAC3C,CAAC;iBACI,CAAC;gBACJ,eAAe,GAAG;oBAChB,GAAG,IAAI,CAAC,YAAY,CAAC,IAAI,CAAC;oBAC1B,qBAAqB,EAAE,IAAI,CAAC,qBAAqB;iBACX,CAAC;YAC3C,CAAC;YACD,IAAI,IAAI,CAAC,YAAY,EAAE,CAAC;gBACtB,eAAe,CAAC,YAAY,GAAG,IAAI,CAAC,YAAY,CAAC;YACnD,CAAC;YACD,OAAO,eAAe,CAAC;QACzB,CAAC,CAAC,CAAC;QAEH,MAAM,CAAC,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,OAAO,EAAE,EAAE;YAC9C,MAAM,aAAa,GAAyB;gBAC1C,IAAI,EAAE,OAAO,CAAC,IAAI;aACnB,CAAC;YAEF,IAAI,OAAO,CAAC,YAAY,EAAE,CAAC;gBACzB,aAAa,CAAC,YAAY,GAAG,OAAO,CAAC,YAAY,CAAC;YACpD,CAAC;YACD,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC;gBACpB,aAAa,CAAC,OAAO,GAAG;oBACtB,IAAI,EAAE,OAAO,CAAC,OAAO,CAAC,IAAI;iBAC3B,CAAC;YACJ,CAAC;YACD,OAAO,aAAa,CAAC;QACvB,CAAC,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,MAAM,CAAC,sBAAsB,CAAC,IAAqB;QACjD,MAAM,MAAM,GAAkB;YAC5B,IAAI,EAAE,SAAS;YACf,GAAG,EAAE,IAAI,CAAC,GAAG;YACb,KAAK,EAAE,IAAI,CAAC,KAAK;YACjB,IAAI,EAAE,IAAI,CAAC,IAAI;SAChB,CAAC;QACF,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,MAAM,CAAC,QAAQ,GAAG;gBAChB,IAAI,EAAE,IAAI,CAAC,QAAQ,CAAC,IAAI;aACzB,CAAC;YACF,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,EAAE,CAAC;gBACtB,MAAM,CAAC,QAAQ,CAAC,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC;YAC1C,CAAC;QACH,CAAC;QACD,IAAI,IAAI,CAAC,QAAQ,EAAE,CAAC;YAClB,MAAM,CAAC,SAAS,GAAG,IAAI,CAAC,QAAQ,CAAC;QACnC,CAAC;QAED,OAAO,MAAM,CAAC;IAChB,CAAC;CACF;AA9RD,kCA8RC","sourcesContent":["import { type Album, type Article, type ArticleListItem, type Artist, type Label, type LabelArtist, type SearchResultAlbum, type SearchResultArtist, type SearchResultLabel, type SearchResultTrack, type Show, type Tag, type Track, type UserKind } from 'bandcamp-fetch';\nimport type AlbumEntity from '../entities/AlbumEntity';\nimport type ArtistEntity from '../entities/ArtistEntity';\nimport type BandEntity from '../entities/BandEntity';\nimport type LabelEntity from '../entities/LabelEntity';\nimport type TrackEntity from '../entities/TrackEntity';\nimport type TagEntity from '../entities/TagEntity';\nimport type ShowEntity from '../entities/ShowEntity';\nimport {type ArticleEntityMediaItem, type ArticleEntitySection} from '../entities/ArticleEntity';\nimport type ArticleEntity from '../entities/ArticleEntity';\n\nexport default class EntityConverter {\n static convertAlbum(data: Album): AlbumEntity {\n const result: AlbumEntity = {\n type: 'album',\n name: data.name\n };\n if (data.url) {\n result.url = data.url;\n }\n if (data.imageUrl) {\n result.thumbnail = data.imageUrl;\n }\n if (data.artist) {\n result.artist = this.convertArtist({ ...data.artist, type: 'artist' });\n }\n if (data.tracks) {\n result.tracks = data.tracks.map((track) => this.convertTrack({ ...track, type: 'track', album: undefined }));\n }\n if (data.featuredTrack) {\n result.featuredTrack = this.convertTrack({ ...data.featuredTrack, type: 'track' });\n }\n if (data.releaseDate) {\n result.releaseDate = data.releaseDate;\n }\n\n result.tracks?.forEach((track) => {\n track.album = {\n type: 'album',\n name: data.name\n };\n if (data.url) {\n track.album.url = data.url;\n }\n if (data.imageUrl) {\n track.album.thumbnail = data.imageUrl;\n if (!track.thumbnail) {\n track.thumbnail = data.imageUrl;\n }\n }\n if (!track.artist && result.artist) {\n track.artist = result.artist;\n }\n });\n\n return result;\n }\n\n static convertArtist(data: Artist | LabelArtist) : ArtistEntity {\n const result: ArtistEntity = {\n ...this.convertBand({ ...data, type: 'artist' }),\n type: 'artist'\n };\n if (data.label) {\n result.label = this.convertLabel(data.label);\n }\n\n return result;\n }\n\n static convertLabel(data: Label): LabelEntity {\n const result: LabelEntity = {\n ...this.convertBand(data),\n type: 'label'\n };\n\n return result;\n }\n\n static convertTrack(data: Track): TrackEntity {\n const result: TrackEntity = {\n type: 'track',\n name: data.name\n };\n if (data.id) {\n result.id = data.id;\n }\n if (data.url) {\n result.url = data.url;\n }\n if (data.duration) {\n result.duration = data.duration;\n }\n if (data.imageUrl) {\n result.thumbnail = data.imageUrl;\n }\n if (data.streamUrlHQ) {\n result.streamUrl = data.streamUrlHQ;\n }\n else if (data.streamUrl) {\n result.streamUrl = data.streamUrl;\n }\n if (data.album) {\n result.album = this.convertAlbum({ ...data.album, type: 'album', tracks: undefined });\n }\n if (data.artist) {\n result.artist = this.convertArtist({ ...data.artist, type: 'artist' });\n }\n if (data.position) {\n result.position = data.position;\n }\n\n if (result.album) {\n if (!result.album.thumbnail && data.imageUrl) {\n result.album.thumbnail = data.imageUrl;\n }\n if (!result.album.artist && result.artist) {\n result.album.artist = result.artist;\n }\n }\n\n return result;\n }\n\n static convertSearchResultItem(item: SearchResultArtist | SearchResultLabel | SearchResultAlbum | SearchResultTrack): ArtistEntity | LabelEntity | AlbumEntity | TrackEntity {\n switch (item.type) {\n case 'artist':\n return this.convertArtist(item);\n case 'label':\n return this.convertLabel(item);\n case 'album': {\n const albumArtist = item.artist ? { name: item.artist } : undefined;\n return this.convertAlbum({ ...item, artist: albumArtist });\n }\n case 'track': {\n const trackArtist = item.artist ? { name: item.artist } : undefined;\n const trackAlbum = item.album ? { name: item.album } : undefined;\n return this.convertTrack({\n ...item,\n artist: trackArtist,\n album: trackAlbum\n });\n }\n }\n }\n\n static convertShow(data: Show): ShowEntity {\n const result: ShowEntity = {\n type: 'show',\n name: data.name,\n url: data.url,\n description: data.description,\n date: data.publishedDate\n };\n\n if (data.imageUrl) {\n result.thumbnail = data.imageUrl;\n }\n if (data.streamUrl?.['mp3-128']) {\n result.streamUrl = data.streamUrl['mp3-128'];\n }\n if (data.duration) {\n result.duration = data.duration;\n }\n if (data.tracks) {\n result.tracks = data.tracks.map((track) => this.convertTrack({ ...track, type: 'track' }));\n }\n\n return result;\n }\n\n static convertBand(data: Artist | Label | UserKind): BandEntity {\n let type: BandEntity['type'];\n switch ((data as any).type) {\n case 'artist':\n type = 'artist';\n break;\n case 'label':\n type = 'label';\n break;\n default: // UserKind does not have 'type'\n type = 'artistOrLabel';\n }\n const result: BandEntity = {\n type,\n name: data.name\n };\n if (data.url) {\n result.url = data.url;\n }\n if (data.imageUrl) {\n result.thumbnail = data.imageUrl;\n }\n if (data.location) {\n result.location = data.location;\n }\n\n return result;\n }\n\n static convertTag(data: Tag): TagEntity {\n const result: TagEntity = {\n type: 'tag',\n name: data.name,\n value: data.value\n };\n\n if (data.imageUrls?.[0]) {\n result.thumbnail = data.imageUrls[0];\n }\n\n return result;\n }\n\n static convertArticle(data: Article): ArticleEntity {\n const result: ArticleEntity = {\n type: 'article',\n url: data.url,\n title: data.title,\n description: data.description,\n thumbnail: data.imageUrl,\n date: data.date,\n category: {\n name: data.category.name\n },\n author: {\n name: data.author.name,\n url: data.author.url\n },\n mediaItems: [],\n sections: []\n };\n\n if (data.category.url && result.category) {\n result.category.url = data.category.url;\n }\n\n result.mediaItems = data.mediaItems.map((item) => {\n let entityMediaItem;\n if (item.type === 'album') {\n entityMediaItem = {\n ...this.convertAlbum(item),\n featuredTrackPosition: item.featuredTrackPosition\n } as ArticleEntityMediaItem;\n }\n else {\n entityMediaItem = {\n ...this.convertTrack(item),\n featuredTrackPosition: item.featuredTrackPosition\n } as ArticleEntityMediaItem;\n }\n if (item.mediaItemRef) {\n entityMediaItem.mediaItemRef = item.mediaItemRef;\n }\n return entityMediaItem;\n });\n\n result.sections = data.sections.map((section) => {\n const entitySection: ArticleEntitySection = {\n text: section.text\n };\n\n if (section.mediaItemRef) {\n entitySection.mediaItemRef = section.mediaItemRef;\n }\n if (section.heading) {\n entitySection.heading = {\n text: section.heading.text\n };\n }\n return entitySection;\n });\n\n return result;\n }\n\n static convertArticleListItem(data: ArticleListItem): ArticleEntity {\n const result: ArticleEntity = {\n type: 'article',\n url: data.url,\n title: data.title,\n date: data.date\n };\n if (data.category) {\n result.category = {\n name: data.category.name\n };\n if (data.category.url) {\n result.category.url = data.category.url;\n }\n }\n if (data.imageUrl) {\n result.thumbnail = data.imageUrl;\n }\n\n return result;\n }\n}\n"]} \ No newline at end of file diff --git a/bandcamp/dist/lib/util/UIHelper.js b/bandcamp/dist/lib/util/UIHelper.js index 7af7b53ac..436549832 100644 --- a/bandcamp/dist/lib/util/UIHelper.js +++ b/bandcamp/dist/lib/util/UIHelper.js @@ -108,7 +108,6 @@ class UIHelper { return (0, fs_1.existsSync)(volumioManifestUIDir) && !(0, fs_1.existsSync)(volumioManifestUIDisabledFile); } } -exports.default = UIHelper; _a = UIHelper, _UIHelper_constructLinkItem = function _UIHelper_constructLinkItem(link) { let html = ''; if (link.icon) { @@ -127,4 +126,5 @@ _a = UIHelper, _UIHelper_constructLinkItem = function _UIHelper_constructLinkIte } return html; }; +exports.default = UIHelper; //# sourceMappingURL=UIHelper.js.map \ No newline at end of file diff --git a/bandcamp/dist/lib/util/UIHelper.js.map b/bandcamp/dist/lib/util/UIHelper.js.map index 59eb59cbc..74f6ad6da 100644 --- a/bandcamp/dist/lib/util/UIHelper.js.map +++ b/bandcamp/dist/lib/util/UIHelper.js.map @@ -1 +1 @@ -{"version":3,"file":"UIHelper.js","sourceRoot":"","sources":["../../../src/lib/util/UIHelper.ts"],"names":[],"mappings":"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","sourcesContent":["import { existsSync } from 'fs';\nimport bandcamp from '../BandcampContext';\n\nexport interface UILink {\n icon?: {\n type: 'fa' | 'bandcamp',\n float?: string,\n color?: string,\n class?: string\n };\n target?: string;\n text: string;\n url: string;\n onclick?: string;\n}\n\nexport interface UIDoubleLine {\n imgSrc?: string;\n title: string;\n secondaryTitle: string;\n link: UILink;\n}\n\nexport const UI_STYLES = {\n NON_PLAYABLE: 'color: #b38536; font-size: 10px; padding-right: 8px;',\n NEXT_PAGE: 'color: #7a848e;',\n LIST_ITEM_SELECTED: 'color: #54c688; font-weight: bold;',\n RESOURCE_TYPE: 'color: #999; font-size: 10px; padding-right: 8px;',\n ARTICLE_SECTION: {\n TEXT: 'color: #ddd; font-size: 16px; line-height: 24px; padding: 16px 0px 48px 0px; text-align: justify;',\n MEDIA_ITEM_NAME: 'font-size: 16px; font-weight: bold; font-style: italic;',\n MEDIA_ITEM_ARTIST: 'font-size: 16px; font-weight: bold;'\n }\n};\n\nexport default class UIHelper {\n\n static getBandcampIcon() {\n return ``;\n }\n static addBandcampIconToListTitle(s: string) {\n if (!this.supportsEnhancedTitles()) {\n return s;\n }\n return `${this.getBandcampIcon()}${s}`;\n }\n\n static addIconToListTitle(faClass: string, s: string) {\n if (!this.supportsEnhancedTitles()) {\n return s;\n }\n return `${s}`;\n }\n\n static styleText(s: string, style?: string) {\n return `${s}`;\n }\n\n static wrapInDiv(s: string, style?: string) {\n return `${s}`;\n }\n\n static addTextBefore(s: string, textToAdd: string, style?: string) {\n return this.styleText(textToAdd, style) + s;\n }\n\n static addNonPlayableText(s: string) {\n return this.addTextBefore(s, bandcamp.getI18n('BANDCAMP_NON_PLAYABLE'), UI_STYLES.NON_PLAYABLE);\n }\n\n static getMoreText() {\n return this.styleText(bandcamp.getI18n('BANDCAMP_MORE'), UI_STYLES.NEXT_PAGE);\n }\n\n static constructListTitleWithLink(title: string, links: UILink | UILink[], isFirstList: boolean) {\n if (!this.supportsEnhancedTitles()) {\n return title;\n }\n let html = `
\n
${title}
\n
`;\n\n if (Array.isArray(links)) {\n links.forEach((link, index) => {\n html += this.#constructLinkItem(link);\n if (index < links.length - 1) {\n html += '|';\n }\n });\n }\n else {\n html += this.#constructLinkItem(links);\n }\n\n html += '
';\n\n return html;\n }\n\n static #constructLinkItem(link: UILink) {\n let html = '';\n if (link.icon) {\n if (link.icon.type === 'fa' && link.icon.float !== 'right') {\n html += ``;\n }\n else if (link.icon.type === 'bandcamp') {\n html += ``;\n }\n }\n html += `\n ${link.text}\n
`;\n if (link.icon && link.icon.type === 'fa' && link.icon.float === 'right') {\n html += ``;\n }\n\n return html;\n }\n\n static constructDoubleLineTitleWithImageAndLink(params: UIDoubleLine) {\n if (!this.supportsEnhancedTitles()) {\n return params.title;\n }\n const { imgSrc, title, secondaryTitle, link } = params;\n const imgHtml = imgSrc ? `
\n
`\n : '';\n\n return `\n
\n ${imgHtml}\n
\n
${title}
\n
${secondaryTitle}
\n
\n
\n ${this.#constructLinkItem(link)}\n
\n
\n `;\n }\n\n static reformatDate(date: string) {\n return new Date(Date.parse(date)).toLocaleDateString();\n }\n\n static supportsEnhancedTitles() {\n return !this.isManifestUI();\n }\n\n static isManifestUI() {\n const volumioManifestUIDir = '/volumio/http/www4';\n const volumioManifestUIDisabledFile = '/data/disableManifestUI';\n return existsSync(volumioManifestUIDir) && !existsSync(volumioManifestUIDisabledFile);\n }\n}\n"]} \ No newline at end of file +{"version":3,"file":"UIHelper.js","sourceRoot":"","sources":["../../../src/lib/util/UIHelper.ts"],"names":[],"mappings":";;;;;;;;;;;;AAAA,2BAAgC;AAChC,yEAA0C;AAsB7B,QAAA,SAAS,GAAG;IACvB,YAAY,EAAE,sDAAsD;IACpE,SAAS,EAAE,iBAAiB;IAC5B,kBAAkB,EAAE,oCAAoC;IACxD,aAAa,EAAE,mDAAmD;IAClE,eAAe,EAAE;QACf,IAAI,EAAE,mGAAmG;QACzG,eAAe,EAAE,yDAAyD;QAC1E,iBAAiB,EAAE,qCAAqC;KACzD;CACF,CAAC;AAEF,MAAqB,QAAQ;IAE3B,MAAM,CAAC,eAAe;QACpB,OAAO,kCAAkC,kBAAkB,CAAC,wDAAwD,CAAC,8EAA8E,CAAC;IACtM,CAAC;IACD,MAAM,CAAC,0BAA0B,CAAC,CAAS;QACzC,IAAI,CAAC,IAAI,CAAC,sBAAsB,EAAE,EAAE,CAAC;YACnC,OAAO,CAAC,CAAC;QACX,CAAC;QACD,OAAO,GAAG,IAAI,CAAC,eAAe,EAAE,GAAG,CAAC,EAAE,CAAC;IACzC,CAAC;IAED,MAAM,CAAC,kBAAkB,CAAC,OAAe,EAAE,CAAS;QAClD,IAAI,CAAC,IAAI,CAAC,sBAAsB,EAAE,EAAE,CAAC;YACnC,OAAO,CAAC,CAAC;QACX,CAAC;QACD,OAAO,aAAa,OAAO,sCAAsC,CAAC,EAAE,CAAC;IACvE,CAAC;IAED,MAAM,CAAC,SAAS,CAAC,CAAS,EAAE,KAAc;QACxC,OAAO,QAAQ,KAAK,CAAC,CAAC,CAAC,WAAW,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,SAAS,CAAC;IAChE,CAAC;IAED,MAAM,CAAC,SAAS,CAAC,CAAS,EAAE,KAAc;QACxC,OAAO,OAAO,KAAK,CAAC,CAAC,CAAC,WAAW,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,QAAQ,CAAC;IAC9D,CAAC;IAED,MAAM,CAAC,aAAa,CAAC,CAAS,EAAE,SAAiB,EAAE,KAAc;QAC/D,OAAO,IAAI,CAAC,SAAS,CAAC,SAAS,EAAE,KAAK,CAAC,GAAG,CAAC,CAAC;IAC9C,CAAC;IAED,MAAM,CAAC,kBAAkB,CAAC,CAAS;QACjC,OAAO,IAAI,CAAC,aAAa,CAAC,CAAC,EAAE,yBAAQ,CAAC,OAAO,CAAC,uBAAuB,CAAC,EAAE,iBAAS,CAAC,YAAY,CAAC,CAAC;IAClG,CAAC;IAED,MAAM,CAAC,WAAW;QAChB,OAAO,IAAI,CAAC,SAAS,CAAC,yBAAQ,CAAC,OAAO,CAAC,eAAe,CAAC,EAAE,iBAAS,CAAC,SAAS,CAAC,CAAC;IAChF,CAAC;IAED,MAAM,CAAC,0BAA0B,CAAC,KAAa,EAAE,KAAwB,EAAE,WAAoB;QAC7F,IAAI,CAAC,IAAI,CAAC,sBAAsB,EAAE,EAAE,CAAC;YACnC,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,IAAI,GAAG,iEAAiE,WAAW,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,qBAAqB;2BAC7F,KAAK;qFACqD,CAAC;QAElF,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;YACzB,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,EAAE,KAAK,EAAE,EAAE;gBAC5B,IAAI,IAAI,uBAAA,IAAI,uCAAmB,MAAvB,IAAI,EAAoB,IAAI,CAAC,CAAC;gBACtC,IAAI,KAAK,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;oBAC7B,IAAI,IAAI,0CAA0C,CAAC;gBACrD,CAAC;YACH,CAAC,CAAC,CAAC;QACL,CAAC;aACI,CAAC;YACJ,IAAI,IAAI,uBAAA,IAAI,uCAAmB,MAAvB,IAAI,EAAoB,KAAK,CAAC,CAAC;QACzC,CAAC;QAED,IAAI,IAAI,cAAc,CAAC;QAEvB,OAAO,IAAI,CAAC;IACd,CAAC;IAsBD,MAAM,CAAC,wCAAwC,CAAC,MAAoB;QAClE,IAAI,CAAC,IAAI,CAAC,sBAAsB,EAAE,EAAE,CAAC;YACnC,OAAO,MAAM,CAAC,KAAK,CAAC;QACtB,CAAC;QACD,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc,EAAE,IAAI,EAAE,GAAG,MAAM,CAAC;QACvD,MAAM,OAAO,GAAG,MAAM,CAAC,CAAC,CAAC;wBACL,MAAM,uGAAuG;YAC/H,CAAC,CAAC,EAAE,CAAC;QAEP,OAAO;;cAEG,OAAO;;uBAEE,KAAK;kFACsD,cAAc;;;kBAG9E,uBAAA,IAAI,uCAAmB,MAAvB,IAAI,EAAoB,IAAI,CAAC;;;SAGtC,CAAC;IACR,CAAC;IAED,MAAM,CAAC,YAAY,CAAC,IAAY;QAC9B,OAAO,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,kBAAkB,EAAE,CAAC;IACzD,CAAC;IAED,MAAM,CAAC,sBAAsB;QAC3B,OAAO,CAAC,IAAI,CAAC,YAAY,EAAE,CAAC;IAC9B,CAAC;IAED,MAAM,CAAC,YAAY;QACjB,MAAM,oBAAoB,GAAG,oBAAoB,CAAC;QAClD,MAAM,6BAA6B,GAAG,yBAAyB,CAAC;QAChE,OAAO,IAAA,eAAU,EAAC,oBAAoB,CAAC,IAAI,CAAC,IAAA,eAAU,EAAC,6BAA6B,CAAC,CAAC;IACxF,CAAC;CACF;kFAxD2B,IAAY;IACpC,IAAI,IAAI,GAAG,EAAE,CAAC;IACd,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;QACd,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,KAAK,OAAO,EAAE,CAAC;YAC3D,IAAI,IAAI,aAAa,IAAI,CAAC,IAAI,CAAC,KAAK,6EAA6E,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC;QAChL,CAAC;aACI,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;YACvC,IAAI,IAAI,kCAAkC,kBAAkB,CAAC,wDAAwD,CAAC,2DAA2D,CAAC;QACpL,CAAC;IACH,CAAC;IACD,IAAI,IAAI,KAAK,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,YAAY,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,EAAE,UAAU,IAAI,CAAC,GAAG,IAAI,IAAI,CAAC,OAAO,CAAC,CAAC,CAAC,aAAa,IAAI,CAAC,OAAO,GAAG,CAAC,CAAC,CAAC,EAAE;sBAC9G,IAAI,CAAC,IAAI;qBACV,CAAC;IAClB,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,IAAI,KAAK,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,KAAK,KAAK,OAAO,EAAE,CAAC;QACxE,IAAI,IAAI,aAAa,IAAI,CAAC,IAAI,CAAC,KAAK,4EAA4E,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,WAAW,IAAI,CAAC,IAAI,CAAC,KAAK,GAAG,CAAC,CAAC,CAAC,EAAE,QAAQ,CAAC;IAC/K,CAAC;IAED,OAAO,IAAI,CAAC;AACd,CAAC;kBAlFkB,QAAQ","sourcesContent":["import { existsSync } from 'fs';\nimport bandcamp from '../BandcampContext';\n\nexport interface UILink {\n icon?: {\n type: 'fa' | 'bandcamp',\n float?: string,\n color?: string,\n class?: string\n };\n target?: string;\n text: string;\n url: string;\n onclick?: string;\n}\n\nexport interface UIDoubleLine {\n imgSrc?: string;\n title: string;\n secondaryTitle: string;\n link: UILink;\n}\n\nexport const UI_STYLES = {\n NON_PLAYABLE: 'color: #b38536; font-size: 10px; padding-right: 8px;',\n NEXT_PAGE: 'color: #7a848e;',\n LIST_ITEM_SELECTED: 'color: #54c688; font-weight: bold;',\n RESOURCE_TYPE: 'color: #999; font-size: 10px; padding-right: 8px;',\n ARTICLE_SECTION: {\n TEXT: 'color: #ddd; font-size: 16px; line-height: 24px; padding: 16px 0px 48px 0px; text-align: justify;',\n MEDIA_ITEM_NAME: 'font-size: 16px; font-weight: bold; font-style: italic;',\n MEDIA_ITEM_ARTIST: 'font-size: 16px; font-weight: bold;'\n }\n};\n\nexport default class UIHelper {\n\n static getBandcampIcon() {\n return ``;\n }\n static addBandcampIconToListTitle(s: string) {\n if (!this.supportsEnhancedTitles()) {\n return s;\n }\n return `${this.getBandcampIcon()}${s}`;\n }\n\n static addIconToListTitle(faClass: string, s: string) {\n if (!this.supportsEnhancedTitles()) {\n return s;\n }\n return `${s}`;\n }\n\n static styleText(s: string, style?: string) {\n return `${s}`;\n }\n\n static wrapInDiv(s: string, style?: string) {\n return `${s}`;\n }\n\n static addTextBefore(s: string, textToAdd: string, style?: string) {\n return this.styleText(textToAdd, style) + s;\n }\n\n static addNonPlayableText(s: string) {\n return this.addTextBefore(s, bandcamp.getI18n('BANDCAMP_NON_PLAYABLE'), UI_STYLES.NON_PLAYABLE);\n }\n\n static getMoreText() {\n return this.styleText(bandcamp.getI18n('BANDCAMP_MORE'), UI_STYLES.NEXT_PAGE);\n }\n\n static constructListTitleWithLink(title: string, links: UILink | UILink[], isFirstList: boolean) {\n if (!this.supportsEnhancedTitles()) {\n return title;\n }\n let html = `
\n
${title}
\n
`;\n\n if (Array.isArray(links)) {\n links.forEach((link, index) => {\n html += this.#constructLinkItem(link);\n if (index < links.length - 1) {\n html += '|';\n }\n });\n }\n else {\n html += this.#constructLinkItem(links);\n }\n\n html += '
';\n\n return html;\n }\n\n static #constructLinkItem(link: UILink) {\n let html = '';\n if (link.icon) {\n if (link.icon.type === 'fa' && link.icon.float !== 'right') {\n html += ``;\n }\n else if (link.icon.type === 'bandcamp') {\n html += ``;\n }\n }\n html += `\n ${link.text}\n `;\n if (link.icon && link.icon.type === 'fa' && link.icon.float === 'right') {\n html += ``;\n }\n\n return html;\n }\n\n static constructDoubleLineTitleWithImageAndLink(params: UIDoubleLine) {\n if (!this.supportsEnhancedTitles()) {\n return params.title;\n }\n const { imgSrc, title, secondaryTitle, link } = params;\n const imgHtml = imgSrc ? `
\n
`\n : '';\n\n return `\n
\n ${imgHtml}\n
\n
${title}
\n
${secondaryTitle}
\n
\n
\n ${this.#constructLinkItem(link)}\n
\n
\n `;\n }\n\n static reformatDate(date: string) {\n return new Date(Date.parse(date)).toLocaleDateString();\n }\n\n static supportsEnhancedTitles() {\n return !this.isManifestUI();\n }\n\n static isManifestUI() {\n const volumioManifestUIDir = '/volumio/http/www4';\n const volumioManifestUIDisabledFile = '/data/disableManifestUI';\n return existsSync(volumioManifestUIDir) && !existsSync(volumioManifestUIDisabledFile);\n }\n}\n"]} \ No newline at end of file diff --git a/bandcamp/dist/lib/util/index.js b/bandcamp/dist/lib/util/index.js index c1768d993..5ea4e1bcf 100644 --- a/bandcamp/dist/lib/util/index.js +++ b/bandcamp/dist/lib/util/index.js @@ -3,7 +3,8 @@ var __importDefault = (this && this.__importDefault) || function (mod) { return (mod && mod.__esModule) ? mod : { "default": mod }; }; Object.defineProperty(exports, "__esModule", { value: true }); -exports.kewToJSPromise = exports.jsPromiseToKew = void 0; +exports.jsPromiseToKew = jsPromiseToKew; +exports.kewToJSPromise = kewToJSPromise; // eslint-disable-next-line @typescript-eslint/ban-ts-comment // @ts-ignore const kew_1 = __importDefault(require("kew")); @@ -13,14 +14,13 @@ function jsPromiseToKew(promise) { defer.resolve(result); }) .catch((error) => { - defer.reject(error); + defer.reject(error instanceof Error ? error : Error(String(error))); }); return defer.promise; } -exports.jsPromiseToKew = jsPromiseToKew; function kewToJSPromise(promise) { // Guard against a JS promise from being passed to this function. - if (typeof promise.catch === 'function' && typeof promise.fail === undefined) { + if (typeof promise.catch === 'function' && typeof promise.fail === 'undefined') { // JS promise - return as is return promise; } @@ -29,9 +29,8 @@ function kewToJSPromise(promise) { resolve(result); }) .fail((error) => { - reject(error); + reject(error instanceof Error ? error : Error(String(error))); }); }); } -exports.kewToJSPromise = kewToJSPromise; //# sourceMappingURL=index.js.map \ No newline at end of file diff --git a/bandcamp/dist/lib/util/index.js.map b/bandcamp/dist/lib/util/index.js.map index cd940c204..fc2c95f10 100644 --- a/bandcamp/dist/lib/util/index.js.map +++ b/bandcamp/dist/lib/util/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/util/index.ts"],"names":[],"mappings":";;;;;;AAAA,6DAA6D;AAC7D,aAAa;AACb,8CAAuB;AAEvB,SAAgB,cAAc,CAAI,OAAmB;IACnD,MAAM,KAAK,GAAG,aAAI,CAAC,KAAK,EAAE,CAAC;IAE3B,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;QACtB,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACxB,CAAC,CAAC;SACC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;QACf,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC;IACtB,CAAC,CAAC,CAAC;IAEL,OAAO,KAAK,CAAC,OAAO,CAAC;AACvB,CAAC;AAXD,wCAWC;AAED,SAAgB,cAAc,CAAC,OAAY;IACzC,iEAAiE;IACjE,IAAI,OAAO,OAAO,CAAC,KAAK,KAAK,UAAU,IAAI,OAAO,OAAO,CAAC,IAAI,KAAK,SAAS,EAAE;QAC5E,4BAA4B;QAC5B,OAAO,OAAO,CAAC;KAChB;IACD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAW,EAAE,EAAE;YAC3B,OAAO,CAAC,MAAM,CAAC,CAAC;QAClB,CAAC,CAAC;aACC,IAAI,CAAC,CAAC,KAAU,EAAE,EAAE;YACnB,MAAM,CAAC,KAAK,CAAC,CAAC;QAChB,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;AACL,CAAC;AAdD,wCAcC","sourcesContent":["// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nimport libQ from 'kew';\n\nexport function jsPromiseToKew(promise: Promise): any {\n const defer = libQ.defer();\n\n promise.then((result) => {\n defer.resolve(result);\n })\n .catch((error) => {\n defer.reject(error);\n });\n\n return defer.promise;\n}\n\nexport function kewToJSPromise(promise: any): Promise {\n // Guard against a JS promise from being passed to this function.\n if (typeof promise.catch === 'function' && typeof promise.fail === undefined) {\n // JS promise - return as is\n return promise;\n }\n return new Promise((resolve, reject) => {\n promise.then((result: any) => {\n resolve(result);\n })\n .fail((error: any) => {\n reject(error);\n });\n });\n}\n"]} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/util/index.ts"],"names":[],"mappings":";;;;;AAIA,wCAWC;AAED,wCAcC;AA/BD,6DAA6D;AAC7D,aAAa;AACb,8CAAuB;AAEvB,SAAgB,cAAc,CAAI,OAAmB;IACnD,MAAM,KAAK,GAAG,aAAI,CAAC,KAAK,EAAE,CAAC;IAE3B,OAAO,CAAC,IAAI,CAAC,CAAC,MAAM,EAAE,EAAE;QACtB,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC;IACxB,CAAC,CAAC;SACC,KAAK,CAAC,CAAC,KAAc,EAAE,EAAE;QACxB,KAAK,CAAC,MAAM,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;IACtE,CAAC,CAAC,CAAC;IAEL,OAAO,KAAK,CAAC,OAAO,CAAC;AACvB,CAAC;AAED,SAAgB,cAAc,CAAC,OAAY;IACzC,iEAAiE;IACjE,IAAI,OAAO,OAAO,CAAC,KAAK,KAAK,UAAU,IAAI,OAAO,OAAO,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;QAC/E,4BAA4B;QAC5B,OAAO,OAAO,CAAC;IACjB,CAAC;IACD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACrC,OAAO,CAAC,IAAI,CAAC,CAAC,MAAW,EAAE,EAAE;YAC3B,OAAO,CAAC,MAAM,CAAC,CAAC;QAClB,CAAC,CAAC;aACC,IAAI,CAAC,CAAC,KAAU,EAAE,EAAE;YACnB,MAAM,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;QAChE,CAAC,CAAC,CAAC;IACP,CAAC,CAAC,CAAC;AACL,CAAC","sourcesContent":["// eslint-disable-next-line @typescript-eslint/ban-ts-comment\n// @ts-ignore\nimport libQ from 'kew';\n\nexport function jsPromiseToKew(promise: Promise): any {\n const defer = libQ.defer();\n\n promise.then((result) => {\n defer.resolve(result);\n })\n .catch((error: unknown) => {\n defer.reject(error instanceof Error ? error : Error(String(error)));\n });\n\n return defer.promise;\n}\n\nexport function kewToJSPromise(promise: any): Promise {\n // Guard against a JS promise from being passed to this function.\n if (typeof promise.catch === 'function' && typeof promise.fail === 'undefined') {\n // JS promise - return as is\n return promise;\n }\n return new Promise((resolve, reject) => {\n promise.then((result: any) => {\n resolve(result);\n })\n .fail((error: any) => {\n reject(error instanceof Error ? error : Error(String(error)));\n });\n });\n}\n"]} \ No newline at end of file diff --git a/bandcamp/dist/tsconfig.tsbuildinfo b/bandcamp/dist/tsconfig.tsbuildinfo new file mode 100644 index 000000000..d480650ce --- /dev/null +++ b/bandcamp/dist/tsconfig.tsbuildinfo @@ -0,0 +1 @@ +{"root":["../src/index.ts","../src/lib/BandcampContext.ts","../src/lib/controller/browse/index.ts","../src/lib/controller/browse/view-handlers/AlbumViewHandler.ts","../src/lib/controller/browse/view-handlers/ArticleViewHandler.ts","../src/lib/controller/browse/view-handlers/BandViewHandler.ts","../src/lib/controller/browse/view-handlers/BaseViewHandler.ts","../src/lib/controller/browse/view-handlers/DiscoverViewHandler.ts","../src/lib/controller/browse/view-handlers/ExplodableViewHandler.ts","../src/lib/controller/browse/view-handlers/FanViewHandler.ts","../src/lib/controller/browse/view-handlers/RootViewHandler.ts","../src/lib/controller/browse/view-handlers/SearchViewHandler.ts","../src/lib/controller/browse/view-handlers/ShowViewHandler.ts","../src/lib/controller/browse/view-handlers/TagViewHandler.ts","../src/lib/controller/browse/view-handlers/TrackViewHandler.ts","../src/lib/controller/browse/view-handlers/View.ts","../src/lib/controller/browse/view-handlers/ViewHandler.ts","../src/lib/controller/browse/view-handlers/ViewHandlerFactory.ts","../src/lib/controller/browse/view-handlers/ViewHelper.ts","../src/lib/controller/browse/view-handlers/renderers/AlbumRenderer.ts","../src/lib/controller/browse/view-handlers/renderers/ArticleRenderer.ts","../src/lib/controller/browse/view-handlers/renderers/BandRenderer.ts","../src/lib/controller/browse/view-handlers/renderers/BaseRenderer.ts","../src/lib/controller/browse/view-handlers/renderers/SearchResultParser.ts","../src/lib/controller/browse/view-handlers/renderers/ShowRenderer.ts","../src/lib/controller/browse/view-handlers/renderers/TagRenderer.ts","../src/lib/controller/browse/view-handlers/renderers/TrackRenderer.ts","../src/lib/controller/browse/view-handlers/renderers/index.ts","../src/lib/controller/play/PlayController.ts","../src/lib/controller/search/SearchController.ts","../src/lib/entities/AlbumEntity.ts","../src/lib/entities/ArticleEntity.ts","../src/lib/entities/ArtistEntity.ts","../src/lib/entities/BandEntity.ts","../src/lib/entities/LabelEntity.ts","../src/lib/entities/ShowEntity.ts","../src/lib/entities/TagEntity.ts","../src/lib/entities/TrackEntity.ts","../src/lib/model/AlbumModel.ts","../src/lib/model/ArticleModel.ts","../src/lib/model/BandModel.ts","../src/lib/model/BaseModel.ts","../src/lib/model/DiscoverModel.ts","../src/lib/model/FanModel.ts","../src/lib/model/SearchModel.ts","../src/lib/model/ShowModel.ts","../src/lib/model/TagModel.ts","../src/lib/model/TrackModel.ts","../src/lib/model/index.ts","../src/lib/util/Cache.ts","../src/lib/util/EntityConverter.ts","../src/lib/util/UIHelper.ts","../src/lib/util/index.ts"],"version":"5.7.2"} \ No newline at end of file diff --git a/bandcamp/package-lock.json b/bandcamp/package-lock.json index 138a8bbb0..c8b7c1b05 100644 --- a/bandcamp/package-lock.json +++ b/bandcamp/package-lock.json @@ -1,2562 +1,15 @@ { "name": "bandcamp", - "version": "1.1.1", - "lockfileVersion": 2, + "version": "1.2.0", + "lockfileVersion": 1, "requires": true, - "packages": { - "": { - "name": "bandcamp", - "version": "1.1.1", - "license": "MIT", - "dependencies": { - "bandcamp-fetch": "^1.2.0", - "kew": "^0.7.0", - "md5": "^2.3.0", - "node-cache": "^5.1.2", - "string-format": "^2.0.0", - "v-conf": "^1.4.2" - }, - "devDependencies": { - "@types/fs-extra": "^8.1.2", - "@types/md5": "^2.3.2", - "@types/node": "^14.18.38", - "@types/string-format": "^2.0.0", - "@typescript-eslint/eslint-plugin": "^5.56.0", - "@typescript-eslint/parser": "^5.56.0", - "eslint": "^8.36.0", - "ts-node": "^10.9.1", - "typescript": "^4.9.5", - "winston": "^3.8.2" - }, - "engines": { - "node": ">=14", - "volumio": ">=3" - } - }, - "node_modules/@babel/runtime": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.5.tgz", - "integrity": "sha512-ecjvYlnAaZ/KVneE/OdKYBYfgXV3Ptu6zQWmgEF7vwKhQnvVS6bjMD2XYgj+SNvQ1GfK/pjgokfPkC/2CO8CuA==", - "dependencies": { - "regenerator-runtime": "^0.13.11" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", - "dev": true, - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@dabh/diagnostics": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", - "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==", - "dev": true, - "dependencies": { - "colorspace": "1.1.x", - "enabled": "2.0.x", - "kuler": "^2.0.0" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, - "dependencies": { - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.1.tgz", - "integrity": "sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==", - "dev": true, - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.3.tgz", - "integrity": "sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==", - "dev": true, - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.5.2", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/js": { - "version": "8.42.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.42.0.tgz", - "integrity": "sha512-6SWlXpWU5AvId8Ac7zjzmIOqMOba/JWY8XZ4A7q7Gn1Vlfg/SFFIlrtHXt9nPn4op9ZPAkl91Jao+QQv3r/ukw==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - } - }, - "node_modules/@humanwhocodes/config-array": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", - "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", - "dev": true, - "dependencies": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" - }, - "engines": { - "node": ">=10.10.0" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", - "dev": true, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "dependencies": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/@tsconfig/node10": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "dev": true - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "dev": true - }, - "node_modules/@types/acorn": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@types/acorn/-/acorn-4.0.6.tgz", - "integrity": "sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==", - "dependencies": { - "@types/estree": "*" - } - }, - "node_modules/@types/estree": { - "version": "0.0.41", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.41.tgz", - "integrity": "sha512-rIAmXyJlqw4KEBO7+u9gxZZSQHaCNnIzYrnNmYVpgfJhxTqO0brCX0SYpqUTkVI5mwwUwzmtspLBGBKroMeynA==" - }, - "node_modules/@types/fs-extra": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.1.2.tgz", - "integrity": "sha512-SvSrYXfWSc7R4eqnOzbQF4TZmfpNSM9FrSWLU3EUnWBuyZqNBOrv1B1JA3byUDPUl9z4Ab3jeZG2eDdySlgNMg==", - "dev": true, - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/json-schema": { - "version": "7.0.12", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", - "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", - "dev": true - }, - "node_modules/@types/md5": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/@types/md5/-/md5-2.3.2.tgz", - "integrity": "sha512-v+JFDu96+UYJ3/UWzB0mEglIS//MZXgRaJ4ubUPwOM0gvLc/kcQ3TWNYwENEK7/EcXGQVrW8h/XqednSjBd/Og==", - "dev": true - }, - "node_modules/@types/node": { - "version": "14.18.49", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.49.tgz", - "integrity": "sha512-bJhkIh+GsIpLIJ/QlMYI30O1ZGDeUq+8S9uCq2fR3EYPvpnXtU0KsDJcljONyvyowjmYCQ3BxJje2CMXzCCvSg==", - "dev": true - }, - "node_modules/@types/semver": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", - "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", - "dev": true - }, - "node_modules/@types/string-format": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@types/string-format/-/string-format-2.0.0.tgz", - "integrity": "sha512-mMwtmgN0ureESnJ3SuMM4W9lsi4CgOxs43YxNo14SDHgzJ+OPYO3yM7nOTJTh8x5YICseBdtrySUbvxnpb+NYQ==", - "dev": true - }, - "node_modules/@types/triple-beam": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.2.tgz", - "integrity": "sha512-txGIh+0eDFzKGC25zORnswy+br1Ha7hj5cMVwKIU7+s0U2AxxJru/jZSMU6OC9MJWP6+pc/hc6ZjyZShpsyY2g==", - "dev": true - }, - "node_modules/@typescript-eslint/eslint-plugin": { - "version": "5.59.9", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.9.tgz", - "integrity": "sha512-4uQIBq1ffXd2YvF7MAvehWKW3zVv/w+mSfRAu+8cKbfj3nwzyqJLNcZJpQ/WZ1HLbJDiowwmQ6NO+63nCA+fqA==", - "dev": true, - "dependencies": { - "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.59.9", - "@typescript-eslint/type-utils": "5.59.9", - "@typescript-eslint/utils": "5.59.9", - "debug": "^4.3.4", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "natural-compare-lite": "^1.4.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "@typescript-eslint/parser": "^5.0.0", - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/eslint-plugin/node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/@typescript-eslint/parser": { - "version": "5.59.9", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.9.tgz", - "integrity": "sha512-FsPkRvBtcLQ/eVK1ivDiNYBjn3TGJdXy2fhXX+rc7czWl4ARwnpArwbihSOHI2Peg9WbtGHrbThfBUkZZGTtvQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/scope-manager": "5.59.9", - "@typescript-eslint/types": "5.59.9", - "@typescript-eslint/typescript-estree": "5.59.9", - "debug": "^4.3.4" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/scope-manager": { - "version": "5.59.9", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.9.tgz", - "integrity": "sha512-8RA+E+w78z1+2dzvK/tGZ2cpGigBZ58VMEHDZtpE1v+LLjzrYGc8mMaTONSxKyEkz3IuXFM0IqYiGHlCsmlZxQ==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.59.9", - "@typescript-eslint/visitor-keys": "5.59.9" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/type-utils": { - "version": "5.59.9", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.9.tgz", - "integrity": "sha512-ksEsT0/mEHg9e3qZu98AlSrONAQtrSTljL3ow9CGej8eRo7pe+yaC/mvTjptp23Xo/xIf2mLZKC6KPv4Sji26Q==", - "dev": true, - "dependencies": { - "@typescript-eslint/typescript-estree": "5.59.9", - "@typescript-eslint/utils": "5.59.9", - "debug": "^4.3.4", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "*" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/type-utils/node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/@typescript-eslint/types": { - "version": "5.59.9", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.9.tgz", - "integrity": "sha512-uW8H5NRgTVneSVTfiCVffBb8AbwWSKg7qcA4Ot3JI3MPCJGsB4Db4BhvAODIIYE5mNj7Q+VJkK7JxmRhk2Lyjw==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/@typescript-eslint/typescript-estree": { - "version": "5.59.9", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.9.tgz", - "integrity": "sha512-pmM0/VQ7kUhd1QyIxgS+aRvMgw+ZljB3eDb+jYyp6d2bC0mQWLzUDF+DLwCTkQ3tlNyVsvZRXjFyV0LkU/aXjA==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.59.9", - "@typescript-eslint/visitor-keys": "5.59.9", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "dependencies": { - "tslib": "^1.8.1" - }, - "engines": { - "node": ">= 6" - }, - "peerDependencies": { - "typescript": ">=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta" - } - }, - "node_modules/@typescript-eslint/utils": { - "version": "5.59.9", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.9.tgz", - "integrity": "sha512-1PuMYsju/38I5Ggblaeb98TOoUvjhRvLpLa1DoTOFaLWqaXl/1iQ1eGurTXgBY58NUdtfTXKP5xBq7q9NDaLKg==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.59.9", - "@typescript-eslint/types": "5.59.9", - "@typescript-eslint/typescript-estree": "5.59.9", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/@typescript-eslint/visitor-keys": { - "version": "5.59.9", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.9.tgz", - "integrity": "sha512-bT7s0td97KMaLwpEBckbzj/YohnvXtqbe2XgqNvTl6RJVakY5mvENOTPvw5u66nljfZxthESpDozs86U+oLY8Q==", - "dev": true, - "dependencies": { - "@typescript-eslint/types": "5.59.9", - "eslint-visitor-keys": "^3.3.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/typescript-eslint" - } - }, - "node_modules/acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true - }, - "node_modules/array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/async": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", - "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", - "dev": true - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true - }, - "node_modules/bandcamp-fetch": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/bandcamp-fetch/-/bandcamp-fetch-1.2.0.tgz", - "integrity": "sha512-Q/PwxYL74P1oiN7Bb/JKhiJhtM5tKWaeSIMMqLRgIIofS7DLTj/qVW3pRQe6Mk0hfWOy8swCsUEoqV5Iw8OElg==", - "dependencies": { - "bottleneck": "^2.19.5", - "cheerio": "^1.0.0-rc.5", - "cookie": "^0.5.0", - "eval5": "^1.4.7", - "html-entities": "^2.4.0", - "node-cache": "^5.1.2", - "node-fetch": "^2.6.9" - }, - "engines": { - "node": ">=14" - } - }, - "node_modules/boolbase": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", - "integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww==" - }, - "node_modules/bottleneck": { - "version": "2.19.5", - "resolved": "https://registry.npmjs.org/bottleneck/-/bottleneck-2.19.5.tgz", - "integrity": "sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==" - }, - "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "dependencies": { - "fill-range": "^7.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/charenc": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", - "integrity": "sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA==", - "engines": { - "node": "*" - } - }, - "node_modules/cheerio": { - "version": "1.0.0-rc.12", - "resolved": "https://registry.npmjs.org/cheerio/-/cheerio-1.0.0-rc.12.tgz", - "integrity": "sha512-VqR8m68vM46BNnuZ5NtnGBKIE/DfN0cRIzg9n40EIq9NOv90ayxLBXA8fXC5gquFRGJSTRqBq25Jt2ECLR431Q==", - "dependencies": { - "cheerio-select": "^2.1.0", - "dom-serializer": "^2.0.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "htmlparser2": "^8.0.1", - "parse5": "^7.0.0", - "parse5-htmlparser2-tree-adapter": "^7.0.0" - }, - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/cheeriojs/cheerio?sponsor=1" - } - }, - "node_modules/cheerio-select": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cheerio-select/-/cheerio-select-2.1.0.tgz", - "integrity": "sha512-9v9kG0LvzrlcungtnJtpGNxY+fzECQKhK4EGJX2vByejiMX84MFNQw4UxPJl3bFbTMw+Dfs37XaIkCwTZfLh4g==", - "dependencies": { - "boolbase": "^1.0.0", - "css-select": "^5.1.0", - "css-what": "^6.1.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/clone": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", - "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", - "engines": { - "node": ">=0.8" - } - }, - "node_modules/color": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", - "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.3", - "color-string": "^1.6.0" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true - }, - "node_modules/color-string": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", - "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", - "dev": true, - "dependencies": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, - "node_modules/color/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/colorspace": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz", - "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==", - "dev": true, - "dependencies": { - "color": "^3.1.3", - "text-hex": "1.0.x" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "node_modules/cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "node_modules/cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/crypt": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", - "integrity": "sha512-mCxBlsHFYh9C+HVpiEacem8FEBnMXgU9gy4zmNC+SXAZNB/1idgp/aulFJ4FgCi7GPEVbfyng092GqL2k2rmow==", - "engines": { - "node": "*" - } - }, - "node_modules/css-select": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/css-select/-/css-select-5.1.0.tgz", - "integrity": "sha512-nwoRF1rvRRnnCqqY7updORDsuqKzqYJ28+oSMaJMMgOauh3fvwHqMS7EZpIPqK8GL+g9mKxF1vP/ZjSeNjEVHg==", - "dependencies": { - "boolbase": "^1.0.0", - "css-what": "^6.1.0", - "domhandler": "^5.0.2", - "domutils": "^3.0.1", - "nth-check": "^2.0.1" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/css-what": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", - "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==", - "engines": { - "node": ">= 6" - }, - "funding": { - "url": "https://github.com/sponsors/fb55" - } - }, - "node_modules/debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "dependencies": { - "ms": "2.1.2" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true, - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "dependencies": { - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/dom-serializer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", - "integrity": "sha512-wIkAryiqt/nV5EQKqQpo3SToSOV9J0DnbJqwK7Wv/Trc92zIAYZ4FlMu+JPFW1DfGFt81ZTCGgDEabffXeLyJg==", - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.2", - "entities": "^4.2.0" - }, - "funding": { - "url": "https://github.com/cheeriojs/dom-serializer?sponsor=1" - } - }, - "node_modules/domelementtype": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.3.0.tgz", - "integrity": "sha512-OLETBj6w0OsagBwdXnPdN0cnMfF9opN69co+7ZrbfPGrdpPVNBUj02spi6B1N7wChLQiPn4CSH/zJvXw56gmHw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ] - }, - "node_modules/domhandler": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-5.0.3.tgz", - "integrity": "sha512-cgwlv/1iFQiFnU96XXgROh8xTeetsnJiDsTc7TYCLFd9+/WNkIqPTxiM/8pSd8VIrhXGTf1Ny1q1hquVqDJB5w==", - "dependencies": { - "domelementtype": "^2.3.0" - }, - "engines": { - "node": ">= 4" - }, - "funding": { - "url": "https://github.com/fb55/domhandler?sponsor=1" - } - }, - "node_modules/domutils": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/domutils/-/domutils-3.1.0.tgz", - "integrity": "sha512-H78uMmQtI2AhgDJjWeQmHwJJ2bLPD3GMmO7Zja/ZZh84wkm+4ut+IUnUdRa8uCGX88DiVx1j6FRe1XfxEgjEZA==", - "dependencies": { - "dom-serializer": "^2.0.0", - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3" - }, - "funding": { - "url": "https://github.com/fb55/domutils?sponsor=1" - } - }, - "node_modules/enabled": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", - "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==", - "dev": true - }, - "node_modules/entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==", - "engines": { - "node": ">=0.12" - }, - "funding": { - "url": "https://github.com/fb55/entities?sponsor=1" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "8.42.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.42.0.tgz", - "integrity": "sha512-ulg9Ms6E1WPf67PHaEY4/6E2tEn5/f7FXGzr3t9cBMugOmf1INYvuUwwh1aXQN4MfJ6a5K2iNwP3w4AColvI9A==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.0.3", - "@eslint/js": "8.42.0", - "@humanwhocodes/config-array": "^0.11.10", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.0", - "eslint-visitor-keys": "^3.4.1", - "espree": "^9.5.2", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", - "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", - "dev": true, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/eslint-scope": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", - "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/espree": { - "version": "9.5.2", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.2.tgz", - "integrity": "sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==", - "dev": true, - "dependencies": { - "acorn": "^8.8.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dev": true, - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esquery/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esrecurse/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/eval5": { - "version": "1.4.7", - "resolved": "https://registry.npmjs.org/eval5/-/eval5-1.4.7.tgz", - "integrity": "sha512-GtNl5TyxeIE1VkZ8p4vgzeLkdh7UEn9qzLnSIh/aXKYiJc31i1tNGB0CZhPaXReIZIE59xTV39IsAdWY7P93UA==", - "dependencies": { - "@babel/runtime": "^7.8.4", - "@types/acorn": "^4.0.5", - "@types/estree": "0.0.41", - "acorn": "^7.1.0" - } - }, - "node_modules/eval5/node_modules/acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "node_modules/fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", - "dev": true, - "dependencies": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "engines": { - "node": ">=8.6.0" - } - }, - "node_modules/fast-glob/node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true - }, - "node_modules/fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "dev": true, - "dependencies": { - "reusify": "^1.0.4" - } - }, - "node_modules/fecha": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", - "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==", - "dev": true - }, - "node_modules/file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "dependencies": { - "flat-cache": "^3.0.4" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "dependencies": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - }, - "engines": { - "node": "^10.12.0 || >=12.0.0" - } - }, - "node_modules/flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", - "dev": true - }, - "node_modules/fn.name": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", - "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==", - "dev": true - }, - "node_modules/fs-extra": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-3.0.1.tgz", - "integrity": "sha512-V3Z3WZWVUYd8hoCL5xfXJCaHWYzmtwW5XWYSlLgERi8PWd8bx1kUHUk8L1BT57e49oKnDDD180mjfrHc1yA9rg==", - "dependencies": { - "graceful-fs": "^4.1.2", - "jsonfile": "^3.0.0", - "universalify": "^0.1.0" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", - "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "dependencies": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" - }, - "node_modules/grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "dev": true - }, - "node_modules/graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/html-entities": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.4.0.tgz", - "integrity": "sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/mdevils" - }, - { - "type": "patreon", - "url": "https://patreon.com/mdevils" - } - ] - }, - "node_modules/htmlparser2": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-8.0.2.tgz", - "integrity": "sha512-GYdjWKDkbRLkZ5geuHs5NY1puJ+PXwP7+fHPRz06Eirsb9ugf6d8kkXav6ADhcODhFFPMIXyxkxSuMf3D6NCFA==", - "funding": [ - "https://github.com/fb55/htmlparser2?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/fb55" - } - ], - "dependencies": { - "domelementtype": "^2.3.0", - "domhandler": "^5.0.3", - "domutils": "^3.0.1", - "entities": "^4.4.0" - } - }, - "node_modules/ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "dev": true, - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true - }, - "node_modules/is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", - "dev": true - }, - "node_modules/is-buffer": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", - "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, - "node_modules/jsonfile": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz", - "integrity": "sha512-oBko6ZHlubVB5mRFkur5vgYR1UyqX+S6Y/oCfLhqNdcc2fYFlDpIoNc7AfKS1KOGcnNAkvsr0grLck9ANM815w==", - "optionalDependencies": { - "graceful-fs": "^4.1.6" - } - }, - "node_modules/kew": { - "version": "0.7.0", - "resolved": "https://registry.npmjs.org/kew/-/kew-0.7.0.tgz", - "integrity": "sha512-IG6nm0+QtAMdXt9KvbgbGdvY50RSrw+U4sGZg+KlrSKPJEwVE5JVoI3d7RWfSMdBQneRheeAOj3lIjX5VL/9RQ==" - }, - "node_modules/kuler": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", - "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==", - "dev": true - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, - "node_modules/logform": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/logform/-/logform-2.5.1.tgz", - "integrity": "sha512-9FyqAm9o9NKKfiAKfZoYo9bGXXuwMkxQiQttkT4YjjVtQVIQtK6LmVtlxmCaFswo6N4AfEkHqZTV0taDtPotNg==", - "dev": true, - "dependencies": { - "@colors/colors": "1.5.0", - "@types/triple-beam": "^1.3.2", - "fecha": "^4.2.0", - "ms": "^2.1.1", - "safe-stable-stringify": "^2.3.1", - "triple-beam": "^1.3.0" - } - }, - "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, - "node_modules/md5": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", - "integrity": "sha512-T1GITYmFaKuO91vxyoQMFETst+O71VUPEU3ze5GNzDm0OWdP8v1ziTaAEPUr/3kLsY3Sftgz242A1SetQiDL7g==", - "dependencies": { - "charenc": "0.0.2", - "crypt": "0.0.2", - "is-buffer": "~1.1.6" - } - }, - "node_modules/merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, - "engines": { - "node": ">= 8" - } - }, - "node_modules/micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "dependencies": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", - "dev": true - }, - "node_modules/multimap": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/multimap/-/multimap-1.0.1.tgz", - "integrity": "sha512-3BA0yy/HC53U1emi32s5Kk78bwDG70Hdx4TkPFSCFTNXqsDR10VoX3zJb2Kn+L6U4X929q8WChzEy2HeI7l1Bg==" - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "node_modules/natural-compare-lite": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", - "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", - "dev": true - }, - "node_modules/node-cache": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/node-cache/-/node-cache-5.1.2.tgz", - "integrity": "sha512-t1QzWwnk4sjLWaQAS8CHgOJ+RAfmHpxFWmc36IWTiWHQfs0w5JDMBS1b1ZxQteo0vVVuWJvIUKHDkkeK7vIGCg==", - "dependencies": { - "clone": "2.x" - }, - "engines": { - "node": ">= 8.0.0" - } - }, - "node_modules/node-fetch": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.11.tgz", - "integrity": "sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==", - "dependencies": { - "whatwg-url": "^5.0.0" - }, - "engines": { - "node": "4.x || >=6.0.0" - }, - "peerDependencies": { - "encoding": "^0.1.0" - }, - "peerDependenciesMeta": { - "encoding": { - "optional": true - } - } - }, - "node_modules/nth-check": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-2.1.1.tgz", - "integrity": "sha512-lqjrjmaOoAnWfMmBPL+XNnynZh2+swxiX3WUE0s4yEHI6m+AwrK2UZOimIRl3X/4QctVqS8AiZjFqyOGrMXb/w==", - "dependencies": { - "boolbase": "^1.0.0" - }, - "funding": { - "url": "https://github.com/fb55/nth-check?sponsor=1" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/one-time": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", - "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", - "dev": true, - "dependencies": { - "fn.name": "1.x.x" - } - }, - "node_modules/optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/parse5": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", - "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", - "dependencies": { - "entities": "^4.4.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/parse5-htmlparser2-tree-adapter": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", - "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", - "dependencies": { - "domhandler": "^5.0.2", - "parse5": "^7.0.0" - }, - "funding": { - "url": "https://github.com/inikulin/parse5?sponsor=1" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "dev": true, - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, - "engines": { - "iojs": ">=1.0.0", - "node": ">=0.10.0" - } - }, - "node_modules/rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "dependencies": { - "queue-microtask": "^1.2.2" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ] - }, - "node_modules/safe-stable-stringify": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", - "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==", - "dev": true, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dev": true, - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", - "dev": true, - "dependencies": { - "is-arrayish": "^0.3.1" - } - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/slide": { - "version": "1.1.6", - "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", - "integrity": "sha512-NwrtjCg+lZoqhFU8fOwl4ay2ei8PaqCBOUV3/ektPY9trO1yQ1oXEfmHAhKArUVUr/hOHvy5f6AdP17dCM0zMw==", - "engines": { - "node": "*" - } - }, - "node_modules/stack-trace": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", - "dev": true, - "engines": { - "node": "*" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-format": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/string-format/-/string-format-2.0.0.tgz", - "integrity": "sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==" - }, - "node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/text-hex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", - "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==", - "dev": true - }, - "node_modules/text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/tr46": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", - "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" - }, - "node_modules/triple-beam": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz", - "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==", - "dev": true - }, - "node_modules/ts-node": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", - "dev": true, - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, - "node_modules/tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", - "dev": true - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", - "dev": true, - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=4.2.0" - } - }, - "node_modules/universalify": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", - "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", - "engines": { - "node": ">= 4.0.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "dev": true - }, - "node_modules/v-conf": { - "version": "1.4.3", - "resolved": "https://registry.npmjs.org/v-conf/-/v-conf-1.4.3.tgz", - "integrity": "sha512-jhnAhXDbzorq3pkoqrOzbiLP0yO4rxlfmWUvUuffDM6Dz6YZRN/LfzS1WmvJOFeq8CWapLRyO2std/U2VsOpBg==", - "dependencies": { - "fs-extra": "^3.0.1", - "multimap": "1.0.1", - "write-file-atomic": "1.3.1" - } - }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true - }, - "node_modules/webidl-conversions": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", - "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==" - }, - "node_modules/whatwg-url": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", - "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", - "dependencies": { - "tr46": "~0.0.3", - "webidl-conversions": "^3.0.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/winston": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/winston/-/winston-3.9.0.tgz", - "integrity": "sha512-jW51iW/X95BCW6MMtZWr2jKQBP4hV5bIDq9QrIjfDk6Q9QuxvTKEAlpUNAzP+HYHFFCeENhph16s0zEunu4uuQ==", - "dev": true, - "dependencies": { - "@colors/colors": "1.5.0", - "@dabh/diagnostics": "^2.0.2", - "async": "^3.2.3", - "is-stream": "^2.0.0", - "logform": "^2.4.0", - "one-time": "^1.0.0", - "readable-stream": "^3.4.0", - "safe-stable-stringify": "^2.3.1", - "stack-trace": "0.0.x", - "triple-beam": "^1.3.0", - "winston-transport": "^4.5.0" - }, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/winston-transport": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.5.0.tgz", - "integrity": "sha512-YpZzcUzBedhlTAfJg6vJDlyEai/IFMIVcaEZZyl3UXIl4gmqRpU7AE89AHLkbzLUsv0NVmw7ts+iztqKxxPW1Q==", - "dev": true, - "dependencies": { - "logform": "^2.3.2", - "readable-stream": "^3.6.0", - "triple-beam": "^1.3.0" - }, - "engines": { - "node": ">= 6.4.0" - } - }, - "node_modules/word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dev": true, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, - "node_modules/write-file-atomic": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.1.tgz", - "integrity": "sha512-RCTmbZJFENrUmJVmdaf3SiIDlP1YQGFub6P/WbrTxKHKLWmhnSgaM/cYsjxDwnzD0gVE2tlTUpX6Zr/9V4+DQg==", - "dependencies": { - "graceful-fs": "^4.1.11", - "imurmurhash": "^0.1.4", - "slide": "^1.1.5" - } - }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true, - "engines": { - "node": ">=6" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - }, "dependencies": { - "@babel/runtime": { - "version": "7.22.5", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.22.5.tgz", - "integrity": "sha512-ecjvYlnAaZ/KVneE/OdKYBYfgXV3Ptu6zQWmgEF7vwKhQnvVS6bjMD2XYgj+SNvQ1GfK/pjgokfPkC/2CO8CuA==", - "requires": { - "regenerator-runtime": "^0.13.11" - } - }, "@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", + "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", "dev": true }, - "@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "dev": true, - "requires": { - "@jridgewell/trace-mapping": "0.3.9" - } - }, "@dabh/diagnostics": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", @@ -2568,415 +21,55 @@ "kuler": "^2.0.0" } }, - "@eslint-community/eslint-utils": { - "version": "4.4.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", - "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, - "requires": { - "eslint-visitor-keys": "^3.3.0" - } - }, - "@eslint-community/regexpp": { - "version": "4.5.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.1.tgz", - "integrity": "sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==", - "dev": true - }, - "@eslint/eslintrc": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.0.3.tgz", - "integrity": "sha512-+5gy6OQfk+xx3q0d6jGZZC3f3KzAkXc/IanVxd1is/VIIziRqqt3ongQz0FiTUXqTk0c7aDB3OaFuKnuSoJicQ==", - "dev": true, - "requires": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^9.5.2", - "globals": "^13.19.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - } - }, - "@eslint/js": { - "version": "8.42.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.42.0.tgz", - "integrity": "sha512-6SWlXpWU5AvId8Ac7zjzmIOqMOba/JWY8XZ4A7q7Gn1Vlfg/SFFIlrtHXt9nPn4op9ZPAkl91Jao+QQv3r/ukw==", - "dev": true - }, - "@humanwhocodes/config-array": { - "version": "0.11.10", - "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.10.tgz", - "integrity": "sha512-KVVjQmNUepDVGXNuoRRdmmEjruj0KfiGSbS8LVc12LMsWDQzRXJ0qdhN8L8uUigKpfEHRhlaQFY0ib1tnUbNeQ==", - "dev": true, - "requires": { - "@humanwhocodes/object-schema": "^1.2.1", - "debug": "^4.1.1", - "minimatch": "^3.0.5" - } - }, - "@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true - }, - "@humanwhocodes/object-schema": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-1.2.1.tgz", - "integrity": "sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==", - "dev": true - }, - "@jridgewell/resolve-uri": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.1.tgz", - "integrity": "sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==", - "dev": true - }, - "@jridgewell/sourcemap-codec": { - "version": "1.4.15", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.4.15.tgz", - "integrity": "sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==", - "dev": true - }, - "@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "dev": true, - "requires": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "@nodelib/fs.scandir": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", - "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "2.0.5", - "run-parallel": "^1.1.9" - } - }, - "@nodelib/fs.stat": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", - "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true - }, - "@nodelib/fs.walk": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", - "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, - "requires": { - "@nodelib/fs.scandir": "2.1.5", - "fastq": "^1.6.0" - } - }, - "@tsconfig/node10": { - "version": "1.0.9", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", - "dev": true - }, - "@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "dev": true - }, - "@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "dev": true - }, - "@tsconfig/node16": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "dev": true - }, - "@types/acorn": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/@types/acorn/-/acorn-4.0.6.tgz", - "integrity": "sha512-veQTnWP+1D/xbxVrPC3zHnCZRjSrKfhbMUlEA43iMZLu7EsnTtkJklIuwrCPbOi8YkvDQAiW05VQQFvvz9oieQ==", - "requires": { - "@types/estree": "*" - } - }, - "@types/estree": { - "version": "0.0.41", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-0.0.41.tgz", - "integrity": "sha512-rIAmXyJlqw4KEBO7+u9gxZZSQHaCNnIzYrnNmYVpgfJhxTqO0brCX0SYpqUTkVI5mwwUwzmtspLBGBKroMeynA==" - }, "@types/fs-extra": { - "version": "8.1.2", - "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.1.2.tgz", - "integrity": "sha512-SvSrYXfWSc7R4eqnOzbQF4TZmfpNSM9FrSWLU3EUnWBuyZqNBOrv1B1JA3byUDPUl9z4Ab3jeZG2eDdySlgNMg==", + "version": "8.1.5", + "resolved": "https://registry.npmjs.org/@types/fs-extra/-/fs-extra-8.1.5.tgz", + "integrity": "sha512-0dzKcwO+S8s2kuF5Z9oUWatQJj5Uq/iqphEtE3GQJVRRYm/tD1LglU2UnXi2A8jLq5umkGouOXOR9y0n613ZwQ==", "dev": true, "requires": { "@types/node": "*" } }, - "@types/json-schema": { - "version": "7.0.12", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.12.tgz", - "integrity": "sha512-Hr5Jfhc9eYOQNPYO5WLDq/n4jqijdHNlDXjuAQkkt+mWdQR+XJToOHrsD4cPaMXpn6KO7y2+wM8AZEs8VpBLVA==", - "dev": true - }, "@types/md5": { - "version": "2.3.2", - "resolved": "https://registry.npmjs.org/@types/md5/-/md5-2.3.2.tgz", - "integrity": "sha512-v+JFDu96+UYJ3/UWzB0mEglIS//MZXgRaJ4ubUPwOM0gvLc/kcQ3TWNYwENEK7/EcXGQVrW8h/XqednSjBd/Og==", + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/@types/md5/-/md5-2.3.5.tgz", + "integrity": "sha512-/i42wjYNgE6wf0j2bcTX6kuowmdL/6PE4IVitMpm2eYKBUuYCprdcWVK+xEF0gcV6ufMCRhtxmReGfc6hIK7Jw==", "dev": true }, "@types/node": { - "version": "14.18.49", - "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.49.tgz", - "integrity": "sha512-bJhkIh+GsIpLIJ/QlMYI30O1ZGDeUq+8S9uCq2fR3EYPvpnXtU0KsDJcljONyvyowjmYCQ3BxJje2CMXzCCvSg==", - "dev": true - }, - "@types/semver": { - "version": "7.5.0", - "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.0.tgz", - "integrity": "sha512-G8hZ6XJiHnuhQKR7ZmysCeJWE08o8T0AXtk5darsCaTVsYZhhgUrq53jizaR2FvsoeCwJhlmwTjkXBY5Pn/ZHw==", - "dev": true - }, - "@types/string-format": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@types/string-format/-/string-format-2.0.0.tgz", - "integrity": "sha512-mMwtmgN0ureESnJ3SuMM4W9lsi4CgOxs43YxNo14SDHgzJ+OPYO3yM7nOTJTh8x5YICseBdtrySUbvxnpb+NYQ==", - "dev": true - }, - "@types/triple-beam": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.2.tgz", - "integrity": "sha512-txGIh+0eDFzKGC25zORnswy+br1Ha7hj5cMVwKIU7+s0U2AxxJru/jZSMU6OC9MJWP6+pc/hc6ZjyZShpsyY2g==", - "dev": true - }, - "@typescript-eslint/eslint-plugin": { - "version": "5.59.9", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-5.59.9.tgz", - "integrity": "sha512-4uQIBq1ffXd2YvF7MAvehWKW3zVv/w+mSfRAu+8cKbfj3nwzyqJLNcZJpQ/WZ1HLbJDiowwmQ6NO+63nCA+fqA==", - "dev": true, - "requires": { - "@eslint-community/regexpp": "^4.4.0", - "@typescript-eslint/scope-manager": "5.59.9", - "@typescript-eslint/type-utils": "5.59.9", - "@typescript-eslint/utils": "5.59.9", - "debug": "^4.3.4", - "grapheme-splitter": "^1.0.4", - "ignore": "^5.2.0", - "natural-compare-lite": "^1.4.0", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "dependencies": { - "tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - } - } - }, - "@typescript-eslint/parser": { - "version": "5.59.9", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-5.59.9.tgz", - "integrity": "sha512-FsPkRvBtcLQ/eVK1ivDiNYBjn3TGJdXy2fhXX+rc7czWl4ARwnpArwbihSOHI2Peg9WbtGHrbThfBUkZZGTtvQ==", - "dev": true, - "requires": { - "@typescript-eslint/scope-manager": "5.59.9", - "@typescript-eslint/types": "5.59.9", - "@typescript-eslint/typescript-estree": "5.59.9", - "debug": "^4.3.4" - } - }, - "@typescript-eslint/scope-manager": { - "version": "5.59.9", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-5.59.9.tgz", - "integrity": "sha512-8RA+E+w78z1+2dzvK/tGZ2cpGigBZ58VMEHDZtpE1v+LLjzrYGc8mMaTONSxKyEkz3IuXFM0IqYiGHlCsmlZxQ==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.59.9", - "@typescript-eslint/visitor-keys": "5.59.9" - } - }, - "@typescript-eslint/type-utils": { - "version": "5.59.9", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-5.59.9.tgz", - "integrity": "sha512-ksEsT0/mEHg9e3qZu98AlSrONAQtrSTljL3ow9CGej8eRo7pe+yaC/mvTjptp23Xo/xIf2mLZKC6KPv4Sji26Q==", - "dev": true, - "requires": { - "@typescript-eslint/typescript-estree": "5.59.9", - "@typescript-eslint/utils": "5.59.9", - "debug": "^4.3.4", - "tsutils": "^3.21.0" - }, - "dependencies": { - "tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - } - } - }, - "@typescript-eslint/types": { - "version": "5.59.9", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.59.9.tgz", - "integrity": "sha512-uW8H5NRgTVneSVTfiCVffBb8AbwWSKg7qcA4Ot3JI3MPCJGsB4Db4BhvAODIIYE5mNj7Q+VJkK7JxmRhk2Lyjw==", - "dev": true - }, - "@typescript-eslint/typescript-estree": { - "version": "5.59.9", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-5.59.9.tgz", - "integrity": "sha512-pmM0/VQ7kUhd1QyIxgS+aRvMgw+ZljB3eDb+jYyp6d2bC0mQWLzUDF+DLwCTkQ3tlNyVsvZRXjFyV0LkU/aXjA==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.59.9", - "@typescript-eslint/visitor-keys": "5.59.9", - "debug": "^4.3.4", - "globby": "^11.1.0", - "is-glob": "^4.0.3", - "semver": "^7.3.7", - "tsutils": "^3.21.0" - }, - "dependencies": { - "tsutils": { - "version": "3.21.0", - "resolved": "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz", - "integrity": "sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==", - "dev": true, - "requires": { - "tslib": "^1.8.1" - } - } - } - }, - "@typescript-eslint/utils": { - "version": "5.59.9", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-5.59.9.tgz", - "integrity": "sha512-1PuMYsju/38I5Ggblaeb98TOoUvjhRvLpLa1DoTOFaLWqaXl/1iQ1eGurTXgBY58NUdtfTXKP5xBq7q9NDaLKg==", - "dev": true, - "requires": { - "@eslint-community/eslint-utils": "^4.2.0", - "@types/json-schema": "^7.0.9", - "@types/semver": "^7.3.12", - "@typescript-eslint/scope-manager": "5.59.9", - "@typescript-eslint/types": "5.59.9", - "@typescript-eslint/typescript-estree": "5.59.9", - "eslint-scope": "^5.1.1", - "semver": "^7.3.7" - } - }, - "@typescript-eslint/visitor-keys": { - "version": "5.59.9", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-5.59.9.tgz", - "integrity": "sha512-bT7s0td97KMaLwpEBckbzj/YohnvXtqbe2XgqNvTl6RJVakY5mvENOTPvw5u66nljfZxthESpDozs86U+oLY8Q==", - "dev": true, - "requires": { - "@typescript-eslint/types": "5.59.9", - "eslint-visitor-keys": "^3.3.0" - } - }, - "acorn": { - "version": "8.8.2", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.8.2.tgz", - "integrity": "sha512-xjIYgE8HBrkpd/sJqOGNspf8uHG+NOHGOw6a/Urj8taM2EXfdNAH2oFcPeIFfsv3+kz/mJrS5VuMqbNLjCa2vw==", - "dev": true - }, - "acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "requires": {} - }, - "acorn-walk": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.2.0.tgz", - "integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==", - "dev": true - }, - "ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "requires": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - } - }, - "ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true - }, - "ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "version": "20.17.10", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.17.10.tgz", + "integrity": "sha512-/jrvh5h6NXhEauFFexRin69nA0uHJ5gwk4iDivp/DeoEua3uwCUto6PC86IpRITBOs4+6i2I56K5x5b6WYGXHA==", "dev": true, "requires": { - "color-convert": "^2.0.1" + "undici-types": "~6.19.2" } }, - "arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "dev": true - }, - "argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "@types/string-format": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@types/string-format/-/string-format-2.0.3.tgz", + "integrity": "sha512-2BuDXYaQvSZR5XHlLJQ3KQ455NW+C1Mok0uOO6q8bnp97V/gtZbDEYy44kmu5Ng1U8wRtCSF/leREYVmH2vYmQ==", "dev": true }, - "array-union": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", - "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", + "@types/triple-beam": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", + "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==", "dev": true }, "async": { - "version": "3.2.4", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", - "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==", - "dev": true - }, - "balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", + "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", "dev": true }, "bandcamp-fetch": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/bandcamp-fetch/-/bandcamp-fetch-1.2.0.tgz", - "integrity": "sha512-Q/PwxYL74P1oiN7Bb/JKhiJhtM5tKWaeSIMMqLRgIIofS7DLTj/qVW3pRQe6Mk0hfWOy8swCsUEoqV5Iw8OElg==", + "version": "file:dep/bandcamp-fetch-2.0.0-node14-compat.tgz", + "integrity": "sha512-+Yn4KhA7W/y4nqMvWc/YfrZISUHGimh2xHAfHEFl/MV8j+WMuk6ssMmmAaKD9/BDYJsuGemJbMlocxtFMQdcSA==", "requires": { "bottleneck": "^2.19.5", - "cheerio": "^1.0.0-rc.5", - "cookie": "^0.5.0", - "eval5": "^1.4.7", - "html-entities": "^2.4.0", + "cheerio": "1.0.0-rc.12", + "html-entities": "^2.5.2", "node-cache": "^5.1.2", "node-fetch": "^2.6.9" } @@ -2991,41 +84,6 @@ "resolved": "https://registry.npmjs.org/bottleneck/-/bottleneck-2.19.5.tgz", "integrity": "sha512-VHiNCbI1lKdl44tGrhNfU3lup0Tj/ZBMJB5/2ZbNXRCPuRCO7ed2mgcK4r17y+KB2EfuYuRaVlwNbAeaWGSpbw==" }, - "brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "requires": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "braces": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", - "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, - "requires": { - "fill-range": "^7.0.1" - } - }, - "callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true - }, - "chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "requires": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - } - }, "charenc": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz", @@ -3071,38 +129,21 @@ "requires": { "color-convert": "^1.9.3", "color-string": "^1.6.0" - }, - "dependencies": { - "color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "requires": { - "color-name": "1.1.3" - } - }, - "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - } } }, "color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "requires": { - "color-name": "~1.1.4" + "color-name": "1.1.3" } }, "color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, "color-string": { @@ -3125,34 +166,6 @@ "text-hex": "1.0.x" } }, - "concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true - }, - "cookie": { - "version": "0.5.0", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz", - "integrity": "sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==" - }, - "create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "dev": true - }, - "cross-spawn": { - "version": "7.0.3", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", - "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, - "requires": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - } - }, "crypt": { "version": "0.0.2", "resolved": "https://registry.npmjs.org/crypt/-/crypt-0.0.2.tgz", @@ -3175,45 +188,6 @@ "resolved": "https://registry.npmjs.org/css-what/-/css-what-6.1.0.tgz", "integrity": "sha512-HTUrgRJ7r4dsZKU6GjmpfRK1O76h97Z8MfS1G0FozR+oF2kG6Vfe8JE6zwrkbxigziPHinCJ+gCPjA9EaBDtRw==" }, - "debug": { - "version": "4.3.4", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", - "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, - "requires": { - "ms": "2.1.2" - } - }, - "deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true - }, - "diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "dev": true - }, - "dir-glob": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", - "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, - "requires": { - "path-type": "^4.0.0" - } - }, - "doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "requires": { - "esutils": "^2.0.2" - } - }, "dom-serializer": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-2.0.0.tgz", @@ -3247,229 +221,16 @@ "domhandler": "^5.0.3" } }, - "enabled": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", - "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==", - "dev": true - }, - "entities": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", - "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==" - }, - "escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true - }, - "eslint": { - "version": "8.42.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.42.0.tgz", - "integrity": "sha512-ulg9Ms6E1WPf67PHaEY4/6E2tEn5/f7FXGzr3t9cBMugOmf1INYvuUwwh1aXQN4MfJ6a5K2iNwP3w4AColvI9A==", - "dev": true, - "requires": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.4.0", - "@eslint/eslintrc": "^2.0.3", - "@eslint/js": "8.42.0", - "@humanwhocodes/config-array": "^0.11.10", - "@humanwhocodes/module-importer": "^1.0.1", - "@nodelib/fs.walk": "^1.2.8", - "ajv": "^6.10.0", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.2", - "debug": "^4.3.2", - "doctrine": "^3.0.0", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^7.2.0", - "eslint-visitor-keys": "^3.4.1", - "espree": "^9.5.2", - "esquery": "^1.4.2", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^6.0.1", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "globals": "^13.19.0", - "graphemer": "^1.4.0", - "ignore": "^5.2.0", - "import-fresh": "^3.0.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "is-path-inside": "^3.0.3", - "js-yaml": "^4.1.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "levn": "^0.4.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.1", - "strip-ansi": "^6.0.1", - "strip-json-comments": "^3.1.0", - "text-table": "^0.2.0" - }, - "dependencies": { - "eslint-scope": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz", - "integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - } - }, - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } - } - }, - "eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dev": true, - "requires": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - } - }, - "eslint-visitor-keys": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz", - "integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==", - "dev": true - }, - "espree": { - "version": "9.5.2", - "resolved": "https://registry.npmjs.org/espree/-/espree-9.5.2.tgz", - "integrity": "sha512-7OASN1Wma5fum5SrNhFMAMJxOUAbhyfQ8dQ//PJaJbNw0URTPWqIghHWt1MmAANKhHZIYOHruW4Kw4ruUWOdGw==", - "dev": true, - "requires": { - "acorn": "^8.8.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^3.4.1" - } - }, - "esquery": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", - "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dev": true, - "requires": { - "estraverse": "^5.1.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } - } - }, - "esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "requires": { - "estraverse": "^5.2.0" - }, - "dependencies": { - "estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true - } - } - }, - "estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "dev": true - }, - "esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true - }, - "eval5": { - "version": "1.4.7", - "resolved": "https://registry.npmjs.org/eval5/-/eval5-1.4.7.tgz", - "integrity": "sha512-GtNl5TyxeIE1VkZ8p4vgzeLkdh7UEn9qzLnSIh/aXKYiJc31i1tNGB0CZhPaXReIZIE59xTV39IsAdWY7P93UA==", - "requires": { - "@babel/runtime": "^7.8.4", - "@types/acorn": "^4.0.5", - "@types/estree": "0.0.41", - "acorn": "^7.1.0" - }, - "dependencies": { - "acorn": { - "version": "7.4.1", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz", - "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" - } - } - }, - "fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true - }, - "fast-glob": { - "version": "3.2.12", - "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.12.tgz", - "integrity": "sha512-DVj4CQIYYow0BlaelwK1pHl5n5cRSJfM60UA0zK891sVInoPri2Ekj7+e1CT3/3qxXenpI+nBBmQAcJPJgaj4w==", - "dev": true, - "requires": { - "@nodelib/fs.stat": "^2.0.2", - "@nodelib/fs.walk": "^1.2.3", - "glob-parent": "^5.1.2", - "merge2": "^1.3.0", - "micromatch": "^4.0.4" - }, - "dependencies": { - "glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "requires": { - "is-glob": "^4.0.1" - } - } - } - }, - "fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true - }, - "fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", + "enabled": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", + "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==", "dev": true }, - "fastq": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.15.0.tgz", - "integrity": "sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==", - "dev": true, - "requires": { - "reusify": "^1.0.4" - } + "entities": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/entities/-/entities-4.5.0.tgz", + "integrity": "sha512-V0hjH4dGPh9Ao5p0MoRY6BVqtwCjhz6vI5LT8AJ55H+4g9/4vbHx1I54fS0XuclLhDHArPQCiMjDxjaL8fPxhw==" }, "fecha": { "version": "4.2.3", @@ -3477,50 +238,6 @@ "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==", "dev": true }, - "file-entry-cache": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", - "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, - "requires": { - "flat-cache": "^3.0.4" - } - }, - "fill-range": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", - "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, - "requires": { - "to-regex-range": "^5.0.1" - } - }, - "find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "requires": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - } - }, - "flat-cache": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.0.4.tgz", - "integrity": "sha512-dm9s5Pw7Jc0GvMYbshN6zchCA9RgQlzzEZX3vylR9IqFfS8XciblUXOKfW6SiuJ0e13eDYZoZV5wdrev7P3Nwg==", - "dev": true, - "requires": { - "flatted": "^3.1.0", - "rimraf": "^3.0.2" - } - }, - "flatted": { - "version": "3.2.7", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.2.7.tgz", - "integrity": "sha512-5nqDSxl8nn5BSNxyR3n4I6eDmbolI6WT+QqR547RwxQapgjQBmtktdP+HTBb/a/zLsbzERTONyUB5pefh5TtjQ==", - "dev": true - }, "fn.name": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", @@ -3537,85 +254,15 @@ "universalify": "^0.1.0" } }, - "fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true - }, - "glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, - "requires": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - } - }, - "glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "requires": { - "is-glob": "^4.0.3" - } - }, - "globals": { - "version": "13.20.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz", - "integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==", - "dev": true, - "requires": { - "type-fest": "^0.20.2" - } - }, - "globby": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", - "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, - "requires": { - "array-union": "^2.1.0", - "dir-glob": "^3.0.1", - "fast-glob": "^3.2.9", - "ignore": "^5.2.0", - "merge2": "^1.4.1", - "slash": "^3.0.0" - } - }, "graceful-fs": { "version": "4.2.11", "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==" }, - "grapheme-splitter": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/grapheme-splitter/-/grapheme-splitter-1.0.4.tgz", - "integrity": "sha512-bzh50DW9kTPM00T8y4o8vQg89Di9oLJVLW/KaOGIXJWP/iqCN6WKYkbNOF04vFLJhwcpYUh9ydh/+5vpOqV4YQ==", - "dev": true - }, - "graphemer": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true - }, - "has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true - }, "html-entities": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.4.0.tgz", - "integrity": "sha512-igBTJcNNNhvZFRtm8uA6xMY6xYleeDwn3PeBCkDz7tHttv4F2hsDI2aPgNERWzvRcNYHNT3ymRaQzllmXj4YsQ==" + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-2.5.2.tgz", + "integrity": "sha512-K//PSRMQk4FZ78Kyau+mZurHn3FH0Vwr+H36eE0rPbeYkRRi9YxceYPhuN60UwWorxyKHhqoAJl2OFKa4BVtaA==" }, "htmlparser2": { "version": "8.0.2", @@ -3628,37 +275,11 @@ "entities": "^4.4.0" } }, - "ignore": { - "version": "5.2.4", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.2.4.tgz", - "integrity": "sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==", - "dev": true - }, - "import-fresh": { - "version": "3.3.0", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", - "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, - "requires": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - } - }, "imurmurhash": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==" }, - "inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, - "requires": { - "once": "^1.3.0", - "wrappy": "1" - } - }, "inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", @@ -3676,66 +297,12 @@ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" }, - "is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true - }, - "is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "requires": { - "is-extglob": "^2.1.1" - } - }, - "is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true - }, - "is-path-inside": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", - "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true - }, "is-stream": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", "dev": true }, - "isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "requires": { - "argparse": "^2.0.1" - } - }, - "json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true - }, - "json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true - }, "jsonfile": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-3.0.1.tgz", @@ -3755,38 +322,13 @@ "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==", "dev": true }, - "levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - } - }, - "locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "requires": { - "p-locate": "^5.0.0" - } - }, - "lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true - }, "logform": { - "version": "2.5.1", - "resolved": "https://registry.npmjs.org/logform/-/logform-2.5.1.tgz", - "integrity": "sha512-9FyqAm9o9NKKfiAKfZoYo9bGXXuwMkxQiQttkT4YjjVtQVIQtK6LmVtlxmCaFswo6N4AfEkHqZTV0taDtPotNg==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/logform/-/logform-2.7.0.tgz", + "integrity": "sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==", "dev": true, "requires": { - "@colors/colors": "1.5.0", + "@colors/colors": "1.6.0", "@types/triple-beam": "^1.3.2", "fecha": "^4.2.0", "ms": "^2.1.1", @@ -3794,21 +336,6 @@ "triple-beam": "^1.3.0" } }, - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "dev": true - }, "md5": { "version": "2.3.0", "resolved": "https://registry.npmjs.org/md5/-/md5-2.3.0.tgz", @@ -3819,35 +346,10 @@ "is-buffer": "~1.1.6" } }, - "merge2": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", - "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true - }, - "micromatch": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", - "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, - "requires": { - "braces": "^3.0.2", - "picomatch": "^2.3.1" - } - }, - "minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "requires": { - "brace-expansion": "^1.1.7" - } - }, "ms": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", - "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", "dev": true }, "multimap": { @@ -3855,18 +357,6 @@ "resolved": "https://registry.npmjs.org/multimap/-/multimap-1.0.1.tgz", "integrity": "sha512-3BA0yy/HC53U1emi32s5Kk78bwDG70Hdx4TkPFSCFTNXqsDR10VoX3zJb2Kn+L6U4X929q8WChzEy2HeI7l1Bg==" }, - "natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true - }, - "natural-compare-lite": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare-lite/-/natural-compare-lite-1.4.0.tgz", - "integrity": "sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==", - "dev": true - }, "node-cache": { "version": "5.1.2", "resolved": "https://registry.npmjs.org/node-cache/-/node-cache-5.1.2.tgz", @@ -3876,9 +366,9 @@ } }, "node-fetch": { - "version": "2.6.11", - "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.11.tgz", - "integrity": "sha512-4I6pdBY1EthSqDmJkiNk3JIT8cswwR9nfeW/cPdUagJYEQG7R95WRH74wpz7ma8Gh/9dI9FP+OU+0E4FvtA55w==", + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", "requires": { "whatwg-url": "^5.0.0" } @@ -3891,15 +381,6 @@ "boolbase": "^1.0.0" } }, - "once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, - "requires": { - "wrappy": "1" - } - }, "one-time": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", @@ -3909,112 +390,23 @@ "fn.name": "1.x.x" } }, - "optionator": { - "version": "0.9.1", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.1.tgz", - "integrity": "sha512-74RlY5FCnhq4jRxVUPKDaRwrVNXMqsGsiW6AJw4XK8hmtm10wC0ypZBLw5IIp85NZMr91+qd1RvvENwg7jjRFw==", - "dev": true, - "requires": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.3" - } - }, - "p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "requires": { - "yocto-queue": "^0.1.0" - } - }, - "p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "requires": { - "p-limit": "^3.0.2" - } - }, - "parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "requires": { - "callsites": "^3.0.0" - } - }, "parse5": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.1.2.tgz", - "integrity": "sha512-Czj1WaSVpaoj0wbhMzLmWD69anp2WH7FXMB9n1Sy8/ZFF9jolSQVMu1Ij5WIyGmcBmhk7EOndpO4mIpihVqAXw==", + "version": "7.2.1", + "resolved": "https://registry.npmjs.org/parse5/-/parse5-7.2.1.tgz", + "integrity": "sha512-BuBYQYlv1ckiPdQi/ohiivi9Sagc9JG+Ozs0r7b/0iK3sKmrb0b9FdWdBbOdx6hBCM/F9Ir82ofnBhtZOjCRPQ==", "requires": { - "entities": "^4.4.0" + "entities": "^4.5.0" } }, "parse5-htmlparser2-tree-adapter": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.0.0.tgz", - "integrity": "sha512-B77tOZrqqfUfnVcOrUvfdLbz4pu4RopLD/4vmu3HUPswwTA8OH0EMW9BlWR2B0RCoiZRAHEUu7IxeP1Pd1UU+g==", + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-7.1.0.tgz", + "integrity": "sha512-ruw5xyKs6lrpo9x9rCZqZZnIUntICjQAd0Wsmp396Ul9lN/h+ifgVV1x1gZHi8euej6wTfpqX8j+BFQxF0NS/g==", "requires": { - "domhandler": "^5.0.2", + "domhandler": "^5.0.3", "parse5": "^7.0.0" } }, - "path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true - }, - "path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true - }, - "path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true - }, - "path-type": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", - "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true - }, - "picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true - }, - "prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true - }, - "punycode": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.0.tgz", - "integrity": "sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==", - "dev": true - }, - "queue-microtask": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", - "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true - }, "readable-stream": { "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", @@ -4026,41 +418,6 @@ "util-deprecate": "^1.0.1" } }, - "regenerator-runtime": { - "version": "0.13.11", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.11.tgz", - "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==" - }, - "resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true - }, - "reusify": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", - "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true - }, - "rimraf": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", - "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, - "requires": { - "glob": "^7.1.3" - } - }, - "run-parallel": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", - "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, - "requires": { - "queue-microtask": "^1.2.2" - } - }, "safe-buffer": { "version": "5.2.1", "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", @@ -4068,33 +425,9 @@ "dev": true }, "safe-stable-stringify": { - "version": "2.4.3", - "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.3.tgz", - "integrity": "sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==", - "dev": true - }, - "semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "dev": true, - "requires": { - "lru-cache": "^6.0.0" - } - }, - "shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "requires": { - "shebang-regex": "^3.0.0" - } - }, - "shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", + "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", "dev": true }, "simple-swizzle": { @@ -4106,12 +439,6 @@ "is-arrayish": "^0.3.1" } }, - "slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true - }, "slide": { "version": "1.1.6", "resolved": "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz", @@ -4123,42 +450,18 @@ "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", "dev": true }, - "string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "dev": true, - "requires": { - "safe-buffer": "~5.2.0" - } - }, "string-format": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/string-format/-/string-format-2.0.0.tgz", "integrity": "sha512-bbEs3scLeYNXLecRRuk6uJxdXUSj6le/8rNPHChIJTn2V79aXVTR1EH2OH5zLKKoz0V02fOUKZZcw01pLUShZA==" }, - "strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "requires": { - "ansi-regex": "^5.0.1" - } - }, - "strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true - }, - "supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "string_decoder": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", + "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", "dev": true, "requires": { - "has-flag": "^4.0.0" + "safe-buffer": "~5.2.0" } }, "text-hex": { @@ -4167,78 +470,27 @@ "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==", "dev": true }, - "text-table": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true - }, - "to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "requires": { - "is-number": "^7.0.0" - } - }, "tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, "triple-beam": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.3.0.tgz", - "integrity": "sha512-XrHUvV5HpdLmIj4uVMxHggLbFSZYIn7HEWsqePZcI50pco+MPqJ50wMGY794X7AOOhxOBAjbkqfAbEe/QMp2Lw==", - "dev": true - }, - "ts-node": { - "version": "10.9.1", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.1.tgz", - "integrity": "sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==", - "dev": true, - "requires": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - } - }, - "tslib": { - "version": "1.14.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", - "integrity": "sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==", + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", + "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==", "dev": true }, - "type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "requires": { - "prelude-ls": "^1.2.1" - } - }, - "type-fest": { - "version": "0.20.2", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", - "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", + "typescript": { + "version": "5.7.2", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.7.2.tgz", + "integrity": "sha512-i5t66RHxDvVN40HfDd1PsEThGNnlMCMT3jMUuoh9/0TaqWevNontacunWyN02LA9/fIbEWlcHZcgTKb9QoaLfg==", "dev": true }, - "typescript": { - "version": "4.9.5", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.9.5.tgz", - "integrity": "sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==", + "undici-types": { + "version": "6.19.8", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-6.19.8.tgz", + "integrity": "sha512-ve2KP6f/JnbPBFyobGHuerC9g1FYGn/F8n1LWTwNxCEzd6IfqTwUQcNXgEtmmQ6DlRrC1hrSrBnCZPokRrDHjw==", "dev": true }, "universalify": { @@ -4246,15 +498,6 @@ "resolved": "https://registry.npmjs.org/universalify/-/universalify-0.1.2.tgz", "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" }, - "uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "requires": { - "punycode": "^2.1.0" - } - }, "util-deprecate": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", @@ -4271,12 +514,6 @@ "write-file-atomic": "1.3.1" } }, - "v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "dev": true - }, "webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", @@ -4291,57 +528,36 @@ "webidl-conversions": "^3.0.0" } }, - "which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "requires": { - "isexe": "^2.0.0" - } - }, "winston": { - "version": "3.9.0", - "resolved": "https://registry.npmjs.org/winston/-/winston-3.9.0.tgz", - "integrity": "sha512-jW51iW/X95BCW6MMtZWr2jKQBP4hV5bIDq9QrIjfDk6Q9QuxvTKEAlpUNAzP+HYHFFCeENhph16s0zEunu4uuQ==", + "version": "3.17.0", + "resolved": "https://registry.npmjs.org/winston/-/winston-3.17.0.tgz", + "integrity": "sha512-DLiFIXYC5fMPxaRg832S6F5mJYvePtmO5G9v9IgUFPhXm9/GkXarH/TUrBAVzhTCzAj9anE/+GjrgXp/54nOgw==", "dev": true, "requires": { - "@colors/colors": "1.5.0", + "@colors/colors": "^1.6.0", "@dabh/diagnostics": "^2.0.2", "async": "^3.2.3", "is-stream": "^2.0.0", - "logform": "^2.4.0", + "logform": "^2.7.0", "one-time": "^1.0.0", "readable-stream": "^3.4.0", "safe-stable-stringify": "^2.3.1", "stack-trace": "0.0.x", "triple-beam": "^1.3.0", - "winston-transport": "^4.5.0" + "winston-transport": "^4.9.0" } }, "winston-transport": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.5.0.tgz", - "integrity": "sha512-YpZzcUzBedhlTAfJg6vJDlyEai/IFMIVcaEZZyl3UXIl4gmqRpU7AE89AHLkbzLUsv0NVmw7ts+iztqKxxPW1Q==", + "version": "4.9.0", + "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.9.0.tgz", + "integrity": "sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==", "dev": true, "requires": { - "logform": "^2.3.2", - "readable-stream": "^3.6.0", + "logform": "^2.7.0", + "readable-stream": "^3.6.2", "triple-beam": "^1.3.0" } }, - "word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dev": true - }, - "wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "dev": true - }, "write-file-atomic": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-1.3.1.tgz", @@ -4351,24 +567,6 @@ "imurmurhash": "^0.1.4", "slide": "^1.1.5" } - }, - "yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true - }, - "yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "dev": true - }, - "yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true } } } diff --git a/bandcamp/package.json b/bandcamp/package.json index f61ad250f..161bb74e7 100644 --- a/bandcamp/package.json +++ b/bandcamp/package.json @@ -1,13 +1,10 @@ { "name": "bandcamp", - "version": "1.1.1", + "version": "1.2.0", "description": "Discover Bandcamp music", "main": "./dist/index.js", "scripts": { - "build": "npm run prepare", - "prepare": "rm -rf dist && npx tsc --build src && bash fixup.sh", - "lint": "npx eslint ./src", - "lint:fix": "npx eslint ./src --fix" + "build": "rm -rf dist && npx tsc --build src && bash fixup.sh" }, "repository": { "type": "git", @@ -27,8 +24,7 @@ "changelog": "", "architectures": [ "amd64", - "armhf", - "i386" + "armhf" ] }, "engines": { @@ -38,17 +34,13 @@ "devDependencies": { "@types/fs-extra": "^8.1.2", "@types/md5": "^2.3.2", - "@types/node": "^14.18.38", + "@types/node": "^20.5.1", "@types/string-format": "^2.0.0", - "@typescript-eslint/eslint-plugin": "^5.56.0", - "@typescript-eslint/parser": "^5.56.0", - "eslint": "^8.36.0", - "ts-node": "^10.9.1", - "typescript": "^4.9.5", + "typescript": "^5.5.4", "winston": "^3.8.2" }, "dependencies": { - "bandcamp-fetch": "^1.2.0", + "bandcamp-fetch": "file:dep/bandcamp-fetch-2.0.0-node14-compat.tgz", "kew": "^0.7.0", "md5": "^2.3.0", "node-cache": "^5.1.2", diff --git a/bandcamp/src/i18n/strings_en.json b/bandcamp/src/i18n/strings_en.json index 87ee399ea..9061318d6 100755 --- a/bandcamp/src/i18n/strings_en.json +++ b/bandcamp/src/i18n/strings_en.json @@ -2,6 +2,8 @@ "BANDCAMP_CONFIGURATION": "Bandcamp Discover Configuration", "BANDCAMP_DISCOVER": "Bandcamp Discover", "BANDCAMP_DISCOVER_SHORT": "Discover", + "BANDCAMP_ALL_GENRES": "all genres", + "BANDCAMP_ALL_SUBGENRES": "all {}", "BANDCAMP_ALBUM": "ALBUM", "BANDCAMP_ARTIST": "ARTIST", "BANDCAMP_LABEL": "LABEL", @@ -28,6 +30,7 @@ "BANDCAMP_BROWSE_BY_TAGS": "Browse by tags", "BANDCAMP_TAGS": "Tags", "BANDCAMP_SELECT_TAG": "Choose tag", + "BANDCAMP_SELECT_RELATEDTAG": "Add a tag", "BANDCAMP_LOCATIONS": "Locations", "BANDCAMP_RELEASES": "Releases", "BANDCAMP_MY_BANDCAMP": "My Bandcamp", @@ -62,9 +65,8 @@ "BANDCAMP_SELECT_GENRE": "Genres", "BANDCAMP_SELECT_SUBGENRE": "Subgenres", "BANDCAMP_SELECT_SORTBY": "Sort By", - "BANDCAMP_SELECT_ARTISTRECOMMENDATIONTYPE": "Artist Recommendation", "BANDCAMP_SELECT_LOCATION": "Locations", - "BANDCAMP_SELECT_FORMAT": "Formats", + "BANDCAMP_SELECT_CATEGORY": "Categories", "BANDCAMP_SELECT_TIME": "Time Period", "BANDCAMP_SELECT_SORT": "Sort By", "BANDCAMP_SET_DEFAULT_DISCOVER_PARAMS": "Set current selection as default", diff --git a/bandcamp/src/index.ts b/bandcamp/src/index.ts index f1b2041b6..196e89825 100644 --- a/bandcamp/src/index.ts +++ b/bandcamp/src/index.ts @@ -7,17 +7,17 @@ import vconf from 'v-conf'; import bandcamp from './lib/BandcampContext'; import BrowseController from './lib/controller/browse'; -import SearchController, { SearchQuery } from './lib/controller/search/SearchController'; +import SearchController, { type SearchQuery } from './lib/controller/search/SearchController'; import PlayController from './lib/controller/play/PlayController'; -import { ExplodedTrackInfo } from './lib/controller/browse/view-handlers/ExplodableViewHandler'; +import { type ExplodedTrackInfo } from './lib/controller/browse/view-handlers/ExplodableViewHandler'; import { jsPromiseToKew } from './lib/util'; -import { RenderedPage } from './lib/controller/browse/view-handlers/ViewHandler'; +import { type RenderedPage } from './lib/controller/browse/view-handlers/ViewHandler'; import ViewHelper from './lib/controller/browse/view-handlers/ViewHelper'; -import { AlbumView } from './lib/controller/browse/view-handlers/AlbumViewHandler'; -import View from './lib/controller/browse/view-handlers/View'; -import { BandView } from './lib/controller/browse/view-handlers/BandViewHandler'; -import { ShowView } from './lib/controller/browse/view-handlers/ShowViewHandler'; -import { ArticleView } from './lib/controller/browse/view-handlers/ArticleViewHandler'; +import { type AlbumView } from './lib/controller/browse/view-handlers/AlbumViewHandler'; +import type View from './lib/controller/browse/view-handlers/View'; +import { type BandView } from './lib/controller/browse/view-handlers/BandViewHandler'; +import { type ShowView } from './lib/controller/browse/view-handlers/ShowViewHandler'; +import { type ArticleView } from './lib/controller/browse/view-handlers/ArticleViewHandler'; import Model from './lib/model'; interface GotoParams extends ExplodedTrackInfo { @@ -302,7 +302,7 @@ class ControllerBandcamp { } goto(data: GotoParams) { - return jsPromiseToKew((async (): Promise => { + return jsPromiseToKew(((): Promise => { if (!this.#browseController) { throw Error('Bandcamp Discover plugin is not started'); } diff --git a/bandcamp/src/lib/BandcampContext.ts b/bandcamp/src/lib/BandcampContext.ts index 373763e0e..c44b460f3 100644 --- a/bandcamp/src/lib/BandcampContext.ts +++ b/bandcamp/src/lib/BandcampContext.ts @@ -1,6 +1,6 @@ import format from 'string-format'; import fs from 'fs-extra'; -import winston from 'winston'; +import type winston from 'winston'; import Cache from './util/Cache'; class BandcampContext { @@ -168,11 +168,6 @@ class BandcampContext { this.#loadI18n(); } - #onPlayerNameChanged() { - this.delete('deviceInfo'); - this.toast('warning', 'Detected change in system settings. Please restart plugin for changes to take effect.'); - } - get volumioCoreCommand(): any { return this.#pluginContext?.coreCommand || null; } diff --git a/bandcamp/src/lib/controller/browse/index.ts b/bandcamp/src/lib/controller/browse/index.ts index 0d622150f..b722dc75b 100644 --- a/bandcamp/src/lib/controller/browse/index.ts +++ b/bandcamp/src/lib/controller/browse/index.ts @@ -1,8 +1,8 @@ import bandcamp from '../../BandcampContext'; -import BaseViewHandler from './view-handlers/BaseViewHandler'; -import { ExplodedTrackInfo } from './view-handlers/ExplodableViewHandler'; -import View from './view-handlers/View'; -import { RenderedPage } from './view-handlers/ViewHandler'; +import type BaseViewHandler from './view-handlers/BaseViewHandler'; +import { type ExplodedTrackInfo } from './view-handlers/ExplodableViewHandler'; +import type View from './view-handlers/View'; +import { type RenderedPage } from './view-handlers/ViewHandler'; import ViewHandlerFactory from './view-handlers/ViewHandlerFactory'; export default class BrowseController { @@ -12,13 +12,13 @@ export default class BrowseController { * - If nothing follows 'bandcamp', the view would be 'root'. * * After 'bandcamp/', the uri consists of segments representing the following views: - * - discover[@genre=...][@subgenre=...][@sortBy=...][@artistRecommendationType=...][@location=...][@format=...][@time=...][@pageRef=...] + * - discover[@genre=...][@subgenre=...][@sortBy=...][@location=...][@category=...][@time=...][@customTags=...][@pageRef=...] * - album[@albumUrl=...] * - search[@query=...][@itemType=...][@pageRef=...] * - band[@bandUrl=...][band.type==='label': @view=artists|discography][@pageRef=...]* * - track[@trackUrl=...] * - shows[@showUrl=...|@pageRef=...][@view=tracks|albums] - * - tag[@tagUrl=...][@select=...][@format=...][@location=...][@sort=...][@pageRef=...] + * - tag * - fan[@username=...][@view=collection|wishlist|followingArtistsAndLabels|followingGenres][@pageRef=...] * * *Replaces obsolete 'artist' and 'label' views @@ -35,6 +35,7 @@ export default class BrowseController { * - track[@trackUrl=...] * - album[@albumUrl=...] * - shows[@showUrl=...] + * - discover[@...] */ explodeUri(uri: string): Promise { bandcamp.getLogger().info(`[bandcamp-browse] explodeUri: ${uri}`); diff --git a/bandcamp/src/lib/controller/browse/view-handlers/AlbumViewHandler.ts b/bandcamp/src/lib/controller/browse/view-handlers/AlbumViewHandler.ts index 8ee88a59f..cdfebf542 100644 --- a/bandcamp/src/lib/controller/browse/view-handlers/AlbumViewHandler.ts +++ b/bandcamp/src/lib/controller/browse/view-handlers/AlbumViewHandler.ts @@ -1,13 +1,13 @@ import bandcamp from '../../../BandcampContext'; import { ModelType } from '../../../model'; -import UIHelper, { UILink } from '../../../util/UIHelper'; -import { BandView } from './BandViewHandler'; +import UIHelper, { type UILink } from '../../../util/UIHelper'; +import { type BandView } from './BandViewHandler'; import ExplodableViewHandler from './ExplodableViewHandler'; -import View from './View'; -import { RenderedList, RenderedPage, RenderedPageContents } from './ViewHandler'; +import type View from './View'; +import { type RenderedList, type RenderedPage, type RenderedPageContents } from './ViewHandler'; import ViewHelper from './ViewHelper'; import { RendererType } from './renderers'; -import { RenderedListItem } from './renderers/BaseRenderer'; +import { type RenderedListItem } from './renderers/BaseRenderer'; export interface AlbumView extends View { name: 'album'; @@ -15,6 +15,7 @@ export interface AlbumView extends View { track?: string; // For explode track URIs (used by `goto()`) artistUrl?: string; + trackId?: string; } export default class AlbumViewHandler extends ExplodableViewHandler { diff --git a/bandcamp/src/lib/controller/browse/view-handlers/ArticleViewHandler.ts b/bandcamp/src/lib/controller/browse/view-handlers/ArticleViewHandler.ts index dbe3c851e..023fd3f42 100644 --- a/bandcamp/src/lib/controller/browse/view-handlers/ArticleViewHandler.ts +++ b/bandcamp/src/lib/controller/browse/view-handlers/ArticleViewHandler.ts @@ -1,19 +1,20 @@ -import { ArticleCategory, ArticleCategorySection } from 'bandcamp-fetch'; +import { type ArticleCategory, type ArticleCategorySection } from 'bandcamp-fetch'; import bandcamp from '../../../BandcampContext'; -import AlbumEntity from '../../../entities/AlbumEntity'; -import ArticleEntity, { ArticleEntityMediaItem } from '../../../entities/ArticleEntity'; -import TrackEntity from '../../../entities/TrackEntity'; +import type AlbumEntity from '../../../entities/AlbumEntity'; +import {type ArticleEntityMediaItem} from '../../../entities/ArticleEntity'; +import type ArticleEntity from '../../../entities/ArticleEntity'; +import type TrackEntity from '../../../entities/TrackEntity'; import { ModelType } from '../../../model'; -import UIHelper, { UILink, UI_STYLES } from '../../../util/UIHelper'; -import View from './View'; -import { RenderedList, RenderedPage } from './ViewHandler'; +import UIHelper, { type UILink, UI_STYLES } from '../../../util/UIHelper'; +import type View from './View'; +import { type RenderedList, type RenderedPage } from './ViewHandler'; import { RendererType } from './renderers'; -import { RenderedListItem } from './renderers/BaseRenderer'; +import { type RenderedListItem } from './renderers/BaseRenderer'; import ViewHelper from './ViewHelper'; import ExplodableViewHandler from './ExplodableViewHandler'; -import { ArticleModelGetArticlesParams } from '../../../model/ArticleModel'; -import { AlbumView } from './AlbumViewHandler'; -import { TrackView } from './TrackViewHandler'; +import { type ArticleModelGetArticlesParams } from '../../../model/ArticleModel'; +import { type AlbumView } from './AlbumViewHandler'; +import { type TrackView } from './TrackViewHandler'; const ARTICLE_CATEGORY_ALL = { url: 'all', diff --git a/bandcamp/src/lib/controller/browse/view-handlers/BandViewHandler.ts b/bandcamp/src/lib/controller/browse/view-handlers/BandViewHandler.ts index bf2eb0cfa..cc5f81a40 100644 --- a/bandcamp/src/lib/controller/browse/view-handlers/BandViewHandler.ts +++ b/bandcamp/src/lib/controller/browse/view-handlers/BandViewHandler.ts @@ -1,14 +1,14 @@ import bandcamp from '../../../BandcampContext'; -import TrackEntity from '../../../entities/TrackEntity'; +import type TrackEntity from '../../../entities/TrackEntity'; import { ModelType } from '../../../model'; -import { BandModelGetDiscographyParams, BandModelGetLabelArtistsParams } from '../../../model/BandModel'; -import UIHelper, { UILink } from '../../../util/UIHelper'; +import { type BandModelGetDiscographyParams, type BandModelGetLabelArtistsParams } from '../../../model/BandModel'; +import UIHelper, { type UILink } from '../../../util/UIHelper'; import ExplodableViewHandler from './ExplodableViewHandler'; -import View from './View'; -import { RenderedList, RenderedPage } from './ViewHandler'; +import type View from './View'; +import { type RenderedList, type RenderedPage } from './ViewHandler'; import ViewHelper from './ViewHelper'; import { RendererType } from './renderers'; -import { RenderedListItem } from './renderers/BaseRenderer'; +import { type RenderedListItem } from './renderers/BaseRenderer'; export interface BandView extends View { name: 'band'; diff --git a/bandcamp/src/lib/controller/browse/view-handlers/BaseViewHandler.ts b/bandcamp/src/lib/controller/browse/view-handlers/BaseViewHandler.ts index 154d1c66e..426e828a2 100644 --- a/bandcamp/src/lib/controller/browse/view-handlers/BaseViewHandler.ts +++ b/bandcamp/src/lib/controller/browse/view-handlers/BaseViewHandler.ts @@ -1,28 +1,31 @@ import Model, { ModelType } from '../../../model'; -import AlbumModel from '../../../model/AlbumModel'; -import ArticleModel from '../../../model/ArticleModel'; -import BandModel from '../../../model/BandModel'; -import BaseModel from '../../../model/BaseModel'; -import DiscoverModel from '../../../model/DiscoverModel'; -import FanModel from '../../../model/FanModel'; -import SearchModel from '../../../model/SearchModel'; -import ShowModel from '../../../model/ShowModel'; -import TagModel from '../../../model/TagModel'; -import TrackModel from '../../../model/TrackModel'; +import type AlbumModel from '../../../model/AlbumModel'; +import type ArticleModel from '../../../model/ArticleModel'; +import type BandModel from '../../../model/BandModel'; +import type BaseModel from '../../../model/BaseModel'; +import type DiscoverModel from '../../../model/DiscoverModel'; +import type FanModel from '../../../model/FanModel'; +import type SearchModel from '../../../model/SearchModel'; +import type ShowModel from '../../../model/ShowModel'; +import type TagModel from '../../../model/TagModel'; +import type TrackModel from '../../../model/TrackModel'; import UIHelper from '../../../util/UIHelper'; -import { ExplodedTrackInfo } from './ExplodableViewHandler'; -import View, { PageRef } from './View'; -import ViewHandler, { RenderedPage } from './ViewHandler'; +import { type ExplodedTrackInfo } from './ExplodableViewHandler'; +import {type PageRef} from './View'; +import type View from './View'; +import {type RenderedPage} from './ViewHandler'; +import type ViewHandler from './ViewHandler'; import ViewHelper from './ViewHelper'; import Renderer, { RendererType } from './renderers'; -import AlbumRenderer from './renderers/AlbumRenderer'; -import ArticleRenderer from './renderers/ArticleRenderer'; -import BandRenderer from './renderers/BandRenderer'; -import BaseRenderer, { RenderedListItem } from './renderers/BaseRenderer'; -import SearchResultRenderer from './renderers/SearchResultParser'; -import ShowRenderer from './renderers/ShowRenderer'; -import TagRenderer from './renderers/TagRenderer'; -import TrackRenderer from './renderers/TrackRenderer'; +import type AlbumRenderer from './renderers/AlbumRenderer'; +import type ArticleRenderer from './renderers/ArticleRenderer'; +import type BandRenderer from './renderers/BandRenderer'; +import {type RenderedListItem} from './renderers/BaseRenderer'; +import type BaseRenderer from './renderers/BaseRenderer'; +import type SearchResultRenderer from './renderers/SearchResultParser'; +import type ShowRenderer from './renderers/ShowRenderer'; +import type TagRenderer from './renderers/TagRenderer'; +import type TrackRenderer from './renderers/TrackRenderer'; export default class BaseViewHandler implements ViewHandler { @@ -40,8 +43,8 @@ export default class BaseViewHandler implements ViewHandler { this.#renderers = {}; } - async browse(): Promise { - return {}; + browse(): Promise { + return Promise.resolve({}); } explode(): Promise { @@ -101,7 +104,7 @@ export default class BaseViewHandler implements ViewHandler { model = Model.getInstance(ModelType.Track); break; default: - throw Error(`Unknown model type: ${type}`); + throw Error(`Unknown model type: ${String(type)}`); } this.#models[type] = model; } @@ -149,7 +152,7 @@ export default class BaseViewHandler implements ViewHandler { this.#currentView, this.#previousViews); break; default: - throw Error(`Unknown renderer type: ${type}`); + throw Error(`Unknown renderer type: ${String(type)}`); } this.#renderers[type] = renderer; } diff --git a/bandcamp/src/lib/controller/browse/view-handlers/DiscoverViewHandler.ts b/bandcamp/src/lib/controller/browse/view-handlers/DiscoverViewHandler.ts index 3e014ddfd..fec03b216 100644 --- a/bandcamp/src/lib/controller/browse/view-handlers/DiscoverViewHandler.ts +++ b/bandcamp/src/lib/controller/browse/view-handlers/DiscoverViewHandler.ts @@ -1,39 +1,40 @@ -import { DiscoverOptions, DiscoverParams } from 'bandcamp-fetch'; +import { type DiscoverOptions, type DiscoverParams } from 'bandcamp-fetch'; import bandcamp from '../../../BandcampContext'; -import BaseViewHandler from './BaseViewHandler'; -import View from './View'; -import { RenderedList, RenderedPage } from './ViewHandler'; +import type View from './View'; +import { type RenderedList, type RenderedPage } from './ViewHandler'; import { ModelType } from '../../../model'; import ViewHelper from './ViewHelper'; import { RendererType } from './renderers'; -import { RenderedListItem } from './renderers/BaseRenderer'; -import { DiscoverLoopFetchResult, DiscoveryModelGetDiscoverResultParams } from '../../../model/DiscoverModel'; -import UIHelper, { UILink, UI_STYLES } from '../../../util/UIHelper'; +import { type RenderedListItem } from './renderers/BaseRenderer'; +import { type DiscoverLoopFetchResult, type DiscoveryModelGetDiscoverResultParams } from '../../../model/DiscoverModel'; +import UIHelper, { type UILink, UI_STYLES } from '../../../util/UIHelper'; +import ExplodableViewHandler from './ExplodableViewHandler'; +import type TrackEntity from '../../../entities/TrackEntity'; +import { type AlbumView } from './AlbumViewHandler'; export interface DiscoverView extends View { name: 'discover'; - select?: 'genre' | 'subgenre' | 'sortBy' | 'artistRecommendationType' | - 'location' | 'format' | 'time'; + select?: 'genre' | 'subgenre' | 'sortBy' | 'location' | 'category' | 'time' | 'relatedTag'; genre?: string; subgenre?: string; sortBy?: string; - artistRecommendationType?: string; location?: string; - format?: string; + category?: string; time?: string; + customTags?: string; } const DISCOVER_OPTION_ICONS: Record = { genre: 'fa fa-music', subgenre: 'fa fa-filter', sortBy: 'fa fa-sort', - artistRecommendationType: 'fa fa-thumbs-o-up', location: 'fa fa-map-marker', - format: 'fa fa-archive', - time: 'fa fa-clock-o' + category: 'fa fa-archive', + time: 'fa fa-clock-o', + relatedTag: 'fa fa-tag' }; -export default class DiscoverViewHandler extends BaseViewHandler { +export default class DiscoverViewHandler extends ExplodableViewHandler { browse(): Promise { if (this.currentView.select) { @@ -84,20 +85,19 @@ export default class DiscoverViewHandler extends BaseViewHandler { } if (view.sortBy) { params.sortBy = view.sortBy; - - if (view.artistRecommendationType) { - params.artistRecommendationType = view.artistRecommendationType; - } } if (view.location) { - params.location = view.location; + params.location = Number(view.location); } - if (view.format) { - params.format = view.format; + if (view.category) { + params.category = Number(view.category); } if (view.time) { params.time = parseInt(view.time, 10); } + if (view.customTags) { + params.customTags = view.customTags.split(','); + } if (Object.keys(params).length) { return params; @@ -107,20 +107,41 @@ export default class DiscoverViewHandler extends BaseViewHandler { return defaultParams || {}; } - #getParamsListFromDiscoverResult(params: DiscoverParams, discoverOptions: DiscoverOptions): RenderedList { + #getParamsListFromDiscoverResult(_params: DiscoverParams, discoverOptions: DiscoverOptions): RenderedList { + const params = {..._params}; + const defaultAllGenres = !params.genre && (!params.customTags || params.customTags.length === 0); + const defaultAllSubgenres = params.genre && !params.subgenre; const baseUri = this.#constructUriWithParams(params); const listItems: RenderedListItem[] = []; - [ 'genre', 'subgenre', 'sortBy', 'artistRecommendationType', 'location', 'format', 'time' ].forEach((o) => { + [ 'genre', 'subgenre', 'sortBy', 'location', 'category', 'time' ].forEach((o) => { const paramValue = params[o as keyof DiscoverParams]; - if (paramValue !== undefined) { - let optArr = discoverOptions[`${o}s` as keyof DiscoverOptions] || []; + if (paramValue !== undefined || (o === 'genre' && defaultAllGenres) || (o === 'subgenre' && defaultAllSubgenres)) { + let optKey; + switch (o) { + case 'category': + optKey = 'categories'; + break; + default: + optKey = `${o}s`; + } + let optArr = discoverOptions[optKey as keyof DiscoverOptions] || []; if (o === 'subgenre') { optArr = params.genre ? (optArr as DiscoverOptions['subgenres'])[params.genre] || [] : []; } if (optArr.length) { const opts = optArr as Array; const opt = opts.find((o: any) => o.value == paramValue); - const title = opt ? opt.name : opts[0].name; + let title; + if (o === 'genre' && defaultAllGenres) { + title = bandcamp.getI18n('BANDCAMP_ALL_GENRES'); + } + else if (o === 'subgenre' && defaultAllSubgenres) { + const genre = discoverOptions.genres.find((g) => g.value === params.genre); + title = bandcamp.getI18n('BANDCAMP_ALL_SUBGENRES', genre ? genre.name : params.genre); + } + else { + title = opt ? opt.name : opts[0].name; + } listItems.push({ service: 'bandcamp', type: 'item-no-menu', @@ -131,6 +152,15 @@ export default class DiscoverViewHandler extends BaseViewHandler { } } }); + if (params.customTags && params.customTags.length > 0) { + listItems.unshift({ + service: 'bandcamp', + type: 'item-no-menu', + title: bandcamp.getI18n('BANDCAMP_SELECT_RELATEDTAG'), + icon: DISCOVER_OPTION_ICONS['relatedTag'], + uri: `${baseUri}@select=relatedTag` + }); + } const setDefaultJS = ` const params = ${JSON.stringify(params)}; const payload = { @@ -151,7 +181,13 @@ export default class DiscoverViewHandler extends BaseViewHandler { this.#getBrowseByTagsLink() ]; - const title = UIHelper.constructListTitleWithLink(UIHelper.addBandcampIconToListTitle(bandcamp.getI18n(this.currentView.inSection ? 'BANDCAMP_DISCOVER_SHORT' : 'BANDCAMP_DISCOVER')), links, true); + let title; + if (params.customTags && params.customTags.length > 0) { + title = params.customTags.join(', '); + } + else { + title = UIHelper.constructListTitleWithLink(UIHelper.addBandcampIconToListTitle(bandcamp.getI18n(this.currentView.inSection ? 'BANDCAMP_DISCOVER_SHORT' : 'BANDCAMP_DISCOVER')), links, true); + } if (!UIHelper.supportsEnhancedTitles()) { // Compensate for loss of 'browse by tags' link @@ -224,9 +260,36 @@ export default class DiscoverViewHandler extends BaseViewHandler { throw Error('Target option missing'); } + const listItems = await (targetOption === 'relatedTag' ? this.#getRelatedTagListItems() : this.#getDiscoverOptionListItems(targetOption)); + let title = bandcamp.getI18n(`BANDCAMP_SELECT_${targetOption.toUpperCase()}`); + title = UIHelper.addIconToListTitle(DISCOVER_OPTION_ICONS[targetOption], title); + const lists: RenderedList[] = [ { + title, + availableListViews: [ 'list' ], + items: listItems + } ]; + + return { + navigation: { + prev: { uri: this.constructPrevUri() }, + lists + } + }; + } + + async #getDiscoverOptionListItems(targetOption: Required>) { const discoverOptions = await this.getModel(ModelType.Discover).getDiscoverOptions(); - let optArr = discoverOptions[`${view.select}s` as keyof DiscoverOptions] || []; - if (view.select === 'subgenre' && optArr) { + let optKey; + switch (targetOption) { + case 'category': + optKey = 'categories'; + break; + default: + optKey = `${targetOption}s`; + } + let optArr = discoverOptions[optKey as keyof DiscoverOptions] || []; + const view = this.currentView; + if (targetOption === 'subgenre' && optArr) { optArr = view.genre ? (optArr as DiscoverOptions['subgenres'])[view.genre] || [] : []; } const listItems = (optArr as Array).map((opt) => { @@ -241,34 +304,79 @@ export default class DiscoverViewHandler extends BaseViewHandler { type: 'item-no-menu', title, icon: isSelected ? 'fa fa-check' : 'fa', - uri: this.#constructDiscoverOptionUri(targetOption, opt.value) + uri: this.#constructDiscoverOptionUri(targetOption as string, opt.value) }; }); - let title = bandcamp.getI18n(`BANDCAMP_SELECT_${targetOption.toUpperCase()}`); - title = UIHelper.addIconToListTitle(DISCOVER_OPTION_ICONS[targetOption], title); - const lists: RenderedList[] = [ { - title, - availableListViews: [ 'list' ], - items: listItems - } ]; + if (targetOption === 'genre') { + const isSelected = !view.genre; + let title = bandcamp.getI18n('BANDCAMP_ALL_GENRES'); + if (isSelected) { + title = UIHelper.styleText(title, UI_STYLES.LIST_ITEM_SELECTED); + } + listItems.unshift({ + service: 'bandcamp', + type: 'item-no-menu', + title, + icon: isSelected ? 'fa fa-check' : 'fa', + uri: this.#constructDiscoverOptionUri(targetOption as string, undefined) + }); + } - return { - navigation: { - prev: { uri: this.constructPrevUri() }, - lists + if (targetOption === 'subgenre' && view.genre) { + const isSelected = !view.subgenre; + const genre = discoverOptions.genres.find((g) => g.value === view.genre); + let title = bandcamp.getI18n('BANDCAMP_ALL_SUBGENRES', genre ? genre.name : view.genre); + if (isSelected) { + title = UIHelper.styleText(title, UI_STYLES.LIST_ITEM_SELECTED); } - }; + listItems.unshift({ + service: 'bandcamp', + type: 'item-no-menu', + title, + icon: isSelected ? 'fa fa-check' : 'fa', + uri: this.#constructDiscoverOptionUri(targetOption as string, undefined) + }); + } + + return listItems; + } + + async #getRelatedTagListItems() { + const view = this.currentView; + const customTags = view.customTags?.split(',') || []; + if (customTags.length === 0) { + throw Error('No target tags specified'); + } + const model = this.getModel(ModelType.Tag); + const relatedTags = model.getRelatedTags(customTags); + const listItems = (await relatedTags).map((tag) => { + const added = [ ...customTags, tag.value ]; + return { + service: 'bandcamp', + type: 'item-no-menu', + title: tag.name, + icon: 'fa', + uri: this.#constructDiscoverOptionUri('customTags', added.join(',')) + }; + }); + + return listItems; } - #constructDiscoverOptionUri(option: string, value: string) { + #constructDiscoverOptionUri(option: string, value?: string) { const targetView = { ...this.currentView }; if (this.currentView[option] !== value) { delete targetView.pageRef; delete targetView.prevPageRefs; - targetView[option] = value; + if (value !== undefined) { + targetView[option] = value; + } + else { + delete targetView[option]; + } } delete targetView.select; @@ -288,4 +396,64 @@ export default class DiscoverViewHandler extends BaseViewHandler { targetView ]); } + + protected async getTracksOnExplode() { + const view = this.currentView; + const modelParams: DiscoveryModelGetDiscoverResultParams = { + discoverParams: this.#getDiscoverParamsFromUriOrDefault(), + limit: bandcamp.getConfigValue('itemsPerPage', 47) + }; + const model = this.getModel(ModelType.Discover); + const discoverResults = await model.getDiscoverResult(modelParams); + const tracks = discoverResults.items.reduce((result, album) => { + const featured = album.featuredTrack; + if (featured?.streamUrl && featured.id) { + result.push({ + type: 'track', + id: featured.id, + name: featured.name, + url: album.url, + thumbnail: album.thumbnail, + artist: album.artist, + album: { + type: 'album', + name: album.name, + url: album.url + }, + streamUrl: featured.streamUrl + }); + } + return result; + }, []); + + return tracks; + } + + /** + * Override + * + * Add track uri: + * - bandcamp/album@albumUrl={...}@trackId={...}@artistUrl={...} + */ + getTrackUri(track: TrackEntity) { + const artistUrl = track.artist?.url || null; + const albumUrl = track.album?.url || artistUrl; + + if (track.album && albumUrl) { + const albumView: AlbumView = { + name: 'album', + albumUrl + }; + if (track.id) { + albumView.trackId = String(track.id); + } + if (artistUrl) { + albumView.artistUrl = artistUrl; + } + + return `bandcamp/${ViewHelper.constructUriSegmentFromView(albumView)}`; + } + + return super.getTrackUri(track); + } } diff --git a/bandcamp/src/lib/controller/browse/view-handlers/ExplodableViewHandler.ts b/bandcamp/src/lib/controller/browse/view-handlers/ExplodableViewHandler.ts index 7e03b8dd0..58924f86b 100644 --- a/bandcamp/src/lib/controller/browse/view-handlers/ExplodableViewHandler.ts +++ b/bandcamp/src/lib/controller/browse/view-handlers/ExplodableViewHandler.ts @@ -1,8 +1,8 @@ import BaseViewHandler from './BaseViewHandler'; -import View from './View'; +import type View from './View'; import UIHelper from '../../../util/UIHelper'; -import TrackEntity from '../../../entities/TrackEntity'; -import { TrackView } from './TrackViewHandler'; +import type TrackEntity from '../../../entities/TrackEntity'; +import { type TrackView } from './TrackViewHandler'; import ViewHelper from './ViewHelper'; export interface ExplodedTrackInfo { @@ -35,13 +35,13 @@ export default abstract class ExplodableViewHandler song) as ExplodedTrackInfo[]; } - protected async parseTrackForExplode(track: E): Promise { + protected parseTrackForExplode(track: E): Promise { const trackUri = this.getTrackUri(track); if (!trackUri) { - return null; + return Promise.resolve(null); } const trackName = track.streamUrl ? track.name : UIHelper.addNonPlayableText(track.name); - return { + return Promise.resolve({ service: 'bandcamp', uri: trackUri, albumart: track.thumbnail, @@ -50,7 +50,7 @@ export default abstract class ExplodableViewHandler; diff --git a/bandcamp/src/lib/controller/browse/view-handlers/FanViewHandler.ts b/bandcamp/src/lib/controller/browse/view-handlers/FanViewHandler.ts index 0088544d2..d23fbea26 100644 --- a/bandcamp/src/lib/controller/browse/view-handlers/FanViewHandler.ts +++ b/bandcamp/src/lib/controller/browse/view-handlers/FanViewHandler.ts @@ -1,13 +1,13 @@ -import { Fan } from 'bandcamp-fetch'; +import { type Fan } from 'bandcamp-fetch'; import bandcamp from '../../../BandcampContext'; import { ModelType } from '../../../model'; import BaseViewHandler from './BaseViewHandler'; -import View from './View'; -import { RenderedList, RenderedPage } from './ViewHandler'; +import type View from './View'; +import { type RenderedList, type RenderedPage } from './ViewHandler'; import { RendererType } from './renderers'; -import { RenderedListItem } from './renderers/BaseRenderer'; -import UIHelper, { UILink } from '../../../util/UIHelper'; -import { FanModelGetFanItemsParams } from '../../../model/FanModel'; +import { type RenderedListItem } from './renderers/BaseRenderer'; +import UIHelper, { type UILink } from '../../../util/UIHelper'; +import { type FanModelGetFanItemsParams } from '../../../model/FanModel'; import ViewHelper from './ViewHelper'; export interface FanView extends View { diff --git a/bandcamp/src/lib/controller/browse/view-handlers/RootViewHandler.ts b/bandcamp/src/lib/controller/browse/view-handlers/RootViewHandler.ts index 9722b03f5..fcc9bb6e9 100644 --- a/bandcamp/src/lib/controller/browse/view-handlers/RootViewHandler.ts +++ b/bandcamp/src/lib/controller/browse/view-handlers/RootViewHandler.ts @@ -1,8 +1,8 @@ import bandcamp from '../../../BandcampContext'; import { ModelType } from '../../../model'; import BaseViewHandler from './BaseViewHandler'; -import View from './View'; -import { RenderedList, RenderedPage } from './ViewHandler'; +import type View from './View'; +import { type RenderedList, type RenderedPage } from './ViewHandler'; import ViewHandlerFactory from './ViewHandlerFactory'; export interface RootView extends View { diff --git a/bandcamp/src/lib/controller/browse/view-handlers/SearchViewHandler.ts b/bandcamp/src/lib/controller/browse/view-handlers/SearchViewHandler.ts index 81596c390..2ce0d21f7 100644 --- a/bandcamp/src/lib/controller/browse/view-handlers/SearchViewHandler.ts +++ b/bandcamp/src/lib/controller/browse/view-handlers/SearchViewHandler.ts @@ -1,12 +1,12 @@ import bandcamp from '../../../BandcampContext'; import { ModelType } from '../../../model'; -import { SearchItemType, SearchModelGetSearchResultsParams } from '../../../model/SearchModel'; +import { SearchItemType, type SearchModelGetSearchResultsParams } from '../../../model/SearchModel'; import UIHelper from '../../../util/UIHelper'; import BaseViewHandler from './BaseViewHandler'; -import View from './View'; -import { RenderedPage } from './ViewHandler'; +import type View from './View'; +import { type RenderedPage } from './ViewHandler'; import { RendererType } from './renderers'; -import { RenderedListItem } from './renderers/BaseRenderer'; +import { type RenderedListItem } from './renderers/BaseRenderer'; export interface SearchView extends View { name: 'search'; diff --git a/bandcamp/src/lib/controller/browse/view-handlers/ShowViewHandler.ts b/bandcamp/src/lib/controller/browse/view-handlers/ShowViewHandler.ts index 368385017..cbdc1e4cb 100644 --- a/bandcamp/src/lib/controller/browse/view-handlers/ShowViewHandler.ts +++ b/bandcamp/src/lib/controller/browse/view-handlers/ShowViewHandler.ts @@ -1,14 +1,14 @@ import bandcamp from '../../../BandcampContext'; -import TrackEntity from '../../../entities/TrackEntity'; +import type TrackEntity from '../../../entities/TrackEntity'; import { ModelType } from '../../../model'; -import { ShowModelGetShowsParams } from '../../../model/ShowModel'; -import UIHelper, { UILink } from '../../../util/UIHelper'; +import { type ShowModelGetShowsParams } from '../../../model/ShowModel'; +import UIHelper, { type UILink } from '../../../util/UIHelper'; import ExplodableViewHandler from './ExplodableViewHandler'; -import View from './View'; -import { RenderedList, RenderedPage } from './ViewHandler'; +import type View from './View'; +import { type RenderedList, type RenderedPage } from './ViewHandler'; import ViewHelper from './ViewHelper'; import { RendererType } from './renderers'; -import { RenderedListItem } from './renderers/BaseRenderer'; +import { type RenderedListItem } from './renderers/BaseRenderer'; export interface ShowView extends View { name: 'show'; diff --git a/bandcamp/src/lib/controller/browse/view-handlers/TagViewHandler.ts b/bandcamp/src/lib/controller/browse/view-handlers/TagViewHandler.ts index ae3bb2221..9ffb4f219 100644 --- a/bandcamp/src/lib/controller/browse/view-handlers/TagViewHandler.ts +++ b/bandcamp/src/lib/controller/browse/view-handlers/TagViewHandler.ts @@ -1,18 +1,17 @@ -import { ReleasesByTag } from 'bandcamp-fetch'; import bandcamp from '../../../BandcampContext'; -import TagEntity from '../../../entities/TagEntity'; +import type TagEntity from '../../../entities/TagEntity'; import { ModelType } from '../../../model'; import UIHelper, { UI_STYLES } from '../../../util/UIHelper'; -import View from './View'; -import { RenderedList, RenderedPage } from './ViewHandler'; +import type View from './View'; +import { type RenderedList, type RenderedPage } from './ViewHandler'; import ViewHelper from './ViewHelper'; import { RendererType } from './renderers'; -import { RenderedListItem } from './renderers/BaseRenderer'; -import { ReleasesLoopFetchResult, TagModelGetReleasesParams } from '../../../model/TagModel'; +import { type RenderedListItem } from './renderers/BaseRenderer'; import TrackEntity from '../../../entities/TrackEntity'; import ExplodableViewHandler from './ExplodableViewHandler'; import { AlbumView } from './AlbumViewHandler'; import { TrackView } from './TrackViewHandler'; +import BaseViewHandler from './BaseViewHandler'; const FILTER_ICONS: Record = { sort: 'fa fa-sort', @@ -27,29 +26,17 @@ export interface TagView extends View { select?: string; } -export default class TagViewHandler extends ExplodableViewHandler { +export default class TagViewHandler extends BaseViewHandler { async browse(): Promise { - const view = this.currentView; - if (view.select) { - return view.select === 'tag' ? this.#browseTags() : this.#browseFilterOptions(); - } - else if (view.tagUrl) { - return this.#browseReleases(); - } - return this.#browseTags(); - } async #browseTags(): Promise { - const view = this.currentView; - const tagUrl = view.tagUrl || null; - const tags = await this.getModel(ModelType.Tag).getTags(); const lists = [ - this.#getTagsList(tags, 'tags', bandcamp.getI18n('BANDCAMP_TAGS'), 'fa fa-tag', tagUrl), - this.#getTagsList(tags, 'locations', bandcamp.getI18n('BANDCAMP_LOCATIONS'), 'fa fa-map-marker', tagUrl) + this.#getTagsList(tags, 'tags', bandcamp.getI18n('BANDCAMP_TAGS'), 'fa fa-tag'), + this.#getTagsList(tags, 'locations', bandcamp.getI18n('BANDCAMP_LOCATIONS'), 'fa fa-map-marker') ]; return { @@ -60,13 +47,10 @@ export default class TagViewHandler extends ExplodableViewHandler { }; } - #getTagsList(tags: Record, key: string, title: string, icon: string, currentTagUrl: string | null): RenderedList { + #getTagsList(tags: Record, key: string, title: string, icon: string): RenderedList { const tagRenderer = this.getRenderer(RendererType.Tag); const listItems = tags[key].reduce((result, tag) => { - const rendered = tagRenderer.renderToListItem(tag, { - selected: tag.url === currentTagUrl, - uri: this.#constructTagUrl(tag.url) - }); + const rendered = tagRenderer.renderToListItem(tag); if (rendered) { result.push(rendered); } @@ -80,242 +64,9 @@ export default class TagViewHandler extends ExplodableViewHandler { }; } - async #browseReleases(): Promise { - const view = this.currentView; - const model = this.getModel(ModelType.Tag); - const tagUrl = view.tagUrl; - - const modelParams: TagModelGetReleasesParams = { - tagUrl, - limit: bandcamp.getConfigValue('itemsPerPage', 47), - filters: await this.#getReleasesFiltersFromUriAndDefault() - }; - - if (view.pageRef) { - modelParams.pageToken = view.pageRef.pageToken; - modelParams.pageOffset = view.pageRef.pageOffset; - } - - const filterOptions = await model.getReleasesAvailableFilters(tagUrl); - const releases = await model.getReleases(modelParams); - const baseUri = this.#constructUriWithParams(releases.filters); - const allLists = [ - this.#getSelectTagList(baseUri), - this.#getFilterOptionsList(releases.filters, filterOptions, baseUri), - this.#getReleasesList(releases) - ]; - - const tagInfo = await model.getTag(tagUrl); - const tagRenderer = this.getRenderer(RendererType.Tag); - const header = tagRenderer.renderToHeader(tagInfo); - - if (header && allLists[2].items.length > 0) { - header.albumart = allLists[2].items[0].albumart; - } - - return { - navigation: { - prev: { uri: this.constructPrevUri() }, - info: header, - lists: allLists - } - }; - } - - #getSelectTagList(baseUri: string): RenderedList { - return { - availableListViews: [ 'list' ], - items: [ { - service: 'bandcamp', - type: 'item-no-menu', - title: bandcamp.getI18n('BANDCAMP_SELECT_TAG'), - icon: 'fa fa-tag', - uri: `${baseUri}@select=tag` - } ] - }; - } - - #getFilterOptionsList(current: Record, all: ReleasesByTag.Filter[], baseUri: string): RenderedList { - const listItems: RenderedListItem[] = []; - FILTER_NAMES.forEach((o) => { - const filterValue = current[o]; - if (filterValue != undefined) { - const filter = all.find((f) => f.name === o) || null; - if (filter) { - const opt = filter.options.find((o) => o.value == filterValue); - const title = opt ? opt.name : filterValue; - listItems.push({ - service: 'bandcamp', - type: 'item-no-menu', - title, - icon: FILTER_ICONS[o], - uri: `${baseUri}@select=${o}` - }); - } - } - }); - - return { - title: bandcamp.getI18n('BANDCAMP_RELEASES'), - availableListViews: [ 'list' ], - items: listItems - }; - } - - #getReleasesList(releases: ReleasesLoopFetchResult): RenderedList { - const albumRenderer = this.getRenderer(RendererType.Album); - const trackRenderer = this.getRenderer(RendererType.Track); - const listItems = releases.items.reduce((result, item) => { - let rendered; - if (item.type === 'album') { - rendered = albumRenderer.renderToListItem(item); - } - else if (item.type === 'track') { - rendered = trackRenderer.renderToListItem(item, true, true); - } - if (rendered) { - result.push(rendered); - } - return result; - }, []); - - const nextPageRef = this.constructPageRef(releases.nextPageToken, releases.nextPageOffset); - if (nextPageRef) { - const nextUri = this.constructNextUri(nextPageRef); - listItems.push(this.constructNextPageItem(nextUri)); - } - return { - availableListViews: [ 'list', 'grid' ], - items: listItems - }; - } - - async #browseFilterOptions(): Promise { - const view = this.currentView; - const filterName = view.select; - - if (!filterName) { - throw Error('Target filter not specified'); - } - - const tagUrl = view.tagUrl; - const filterOptions = await this.getModel(ModelType.Tag).getReleasesAvailableFilters(tagUrl); - const filter = filterOptions.find((f) => f.name === filterName) || null; - let listItems: RenderedListItem[]; - if (filter && view.select) { - listItems = filter.options.reduce((result, opt) => { - const isSelected = opt.value.toString() === view[filterName]; - let title = opt.name; - if (isSelected) { - title = UIHelper.styleText(title, UI_STYLES.LIST_ITEM_SELECTED); - } - result.push({ - service: 'bandcamp', - type: 'item-no-menu', - title, - icon: isSelected ? 'fa fa-check' : 'fa', - uri: this.#constructFilterOptionUrl(filterName, opt.value) - }); - - return result; - }, []); - } - else { - listItems = []; - } - - let title = bandcamp.getI18n(`BANDCAMP_SELECT_${filterName.toUpperCase()}`); - title = UIHelper.addIconToListTitle(FILTER_ICONS[filterName], title); - - const lists: RenderedList[] = [ { - title, - availableListViews: [ 'list' ], - items: listItems - } ]; - - return { - navigation: { - prev: { uri: this.constructPrevUri() }, - lists - } - }; - } - - #constructTagUrl(tagUrl: string) { - const targetView = { - ...this.currentView - }; - - if (this.currentView.tagUrl !== tagUrl) { - delete targetView.pageRef; - delete targetView.prevPageRefs; - targetView.tagUrl = tagUrl; - } - delete targetView.select; - - return ViewHelper.constructUriFromViews([ - ...this.previousViews, - targetView - ]); - } - - #constructFilterOptionUrl(optionName: string, optionValue: string | number) { - const targetView = { - ...this.currentView - }; - - if (this.currentView[optionName] !== optionValue.toString()) { - delete targetView.pageRef; - delete targetView.prevPageRefs; - targetView[optionName] = optionValue; - } - delete targetView.select; - - return ViewHelper.constructUriFromViews([ - ...this.previousViews, - targetView - ]); - } - - #constructUriWithParams(params: object) { - const targetView = { - ...this.currentView, - ...params - }; - - return ViewHelper.constructUriFromViews([ - ...this.previousViews, - targetView - ]); - } - - async #getReleasesFiltersFromUriAndDefault() { - const view = this.currentView; - const tagUrl = view.tagUrl; - const model = this.getModel(ModelType.Tag); - const filterOptions = await model.getReleasesAvailableFilters(tagUrl); - const allowedFilterOptions = filterOptions.filter((filter) => FILTER_NAMES.includes(filter.name)); - const defaultFilters = allowedFilterOptions.reduce>((result, f) => { - const selected = f.options.find((o) => o.selected); - if (selected) { - result[f.name] = selected.value; - } - return result; - }, {}); - const filtersFromView = Object.keys(view).reduce>((result, key) => { - if (FILTER_NAMES.includes(key)) { - result[key] = view[key]; - } - return result; - }, {}); - return { - ...defaultFilters, - ...filtersFromView - }; - } - - async getTracksOnExplode() { - const view = this.currentView; + /* Async getTracksOnExplode() { + throw Error('not supported'); + /*const view = this.currentView; const tagUrl = view.tagUrl; if (!tagUrl) { @@ -366,7 +117,7 @@ export default class TagViewHandler extends ExplodableViewHandler { }, []); return tracks; - } + }*/ /** * Override @@ -375,7 +126,7 @@ export default class TagViewHandler extends ExplodableViewHandler { * - bandcamp/album@albumUrl={...}@track={...}@artistUrl={...} * - bandcamp/track@trackUrl={...}@artistUrl={...}@albumurl={...} */ - getTrackUri(track: TrackEntity) { + /*GetTrackUri(track: TrackEntity) { const artistUrl = track.artist?.url || null; const albumUrl = track.album?.url || artistUrl; const trackUrl = track.url || null; @@ -410,5 +161,5 @@ export default class TagViewHandler extends ExplodableViewHandler { } return null; - } + }*/ } diff --git a/bandcamp/src/lib/controller/browse/view-handlers/TrackViewHandler.ts b/bandcamp/src/lib/controller/browse/view-handlers/TrackViewHandler.ts index c59e84351..934ccaa0b 100644 --- a/bandcamp/src/lib/controller/browse/view-handlers/TrackViewHandler.ts +++ b/bandcamp/src/lib/controller/browse/view-handlers/TrackViewHandler.ts @@ -1,14 +1,14 @@ import bandcamp from '../../../BandcampContext'; import { ModelType } from '../../../model'; -import UIHelper, { UILink } from '../../../util/UIHelper'; -import { AlbumView } from './AlbumViewHandler'; +import UIHelper, { type UILink } from '../../../util/UIHelper'; +import { type AlbumView } from './AlbumViewHandler'; import ExplodableViewHandler from './ExplodableViewHandler'; -import View from './View'; -import { RenderedPage } from './ViewHandler'; +import type View from './View'; +import { type RenderedPage } from './ViewHandler'; import ViewHandlerFactory from './ViewHandlerFactory'; import ViewHelper from './ViewHelper'; import { RendererType } from './renderers'; -import { RenderedListItem } from './renderers/BaseRenderer'; +import { type RenderedListItem } from './renderers/BaseRenderer'; export interface TrackView extends View { name: 'track'; diff --git a/bandcamp/src/lib/controller/browse/view-handlers/ViewHandler.ts b/bandcamp/src/lib/controller/browse/view-handlers/ViewHandler.ts index f6b2f21ff..e2433c4dd 100644 --- a/bandcamp/src/lib/controller/browse/view-handlers/ViewHandler.ts +++ b/bandcamp/src/lib/controller/browse/view-handlers/ViewHandler.ts @@ -1,4 +1,4 @@ -import { RenderedHeader, RenderedListItem } from './renderers/BaseRenderer'; +import { type RenderedHeader, type RenderedListItem } from './renderers/BaseRenderer'; export interface RenderedPage { navigation?: RenderedPageContents; diff --git a/bandcamp/src/lib/controller/browse/view-handlers/ViewHandlerFactory.ts b/bandcamp/src/lib/controller/browse/view-handlers/ViewHandlerFactory.ts index 3ab3c4429..929b92b8c 100644 --- a/bandcamp/src/lib/controller/browse/view-handlers/ViewHandlerFactory.ts +++ b/bandcamp/src/lib/controller/browse/view-handlers/ViewHandlerFactory.ts @@ -1,7 +1,7 @@ import AlbumViewHandler from './AlbumViewHandler'; import ArticleViewHandler from './ArticleViewHandler'; import BandViewHandler from './BandViewHandler'; -import BaseViewHandler from './BaseViewHandler'; +import type BaseViewHandler from './BaseViewHandler'; import DiscoverViewHandler from './DiscoverViewHandler'; import FanViewHandler from './FanViewHandler'; import RootViewHandler from './RootViewHandler'; @@ -9,7 +9,7 @@ import SearchViewHandler from './SearchViewHandler'; import ShowViewHandler from './ShowViewHandler'; import TagViewHandler from './TagViewHandler'; import TrackViewHandler from './TrackViewHandler'; -import View from './View'; +import type View from './View'; import ViewHelper from './ViewHelper'; type HandlerClass> = diff --git a/bandcamp/src/lib/controller/browse/view-handlers/ViewHelper.ts b/bandcamp/src/lib/controller/browse/view-handlers/ViewHelper.ts index 873ab6fe3..c03af35f7 100644 --- a/bandcamp/src/lib/controller/browse/view-handlers/ViewHelper.ts +++ b/bandcamp/src/lib/controller/browse/view-handlers/ViewHelper.ts @@ -1,4 +1,4 @@ -import View from './View'; +import type View from './View'; export default class ViewHelper { @@ -26,7 +26,7 @@ export default class ViewHelper { return result; } - static constructUriSegmentFromView(view: V) { + static constructUriSegmentFromView(view: View) { let segment: string; if (view.name === 'root') { segment = 'bandcamp'; diff --git a/bandcamp/src/lib/controller/browse/view-handlers/renderers/AlbumRenderer.ts b/bandcamp/src/lib/controller/browse/view-handlers/renderers/AlbumRenderer.ts index e944f40f3..1ababb293 100644 --- a/bandcamp/src/lib/controller/browse/view-handlers/renderers/AlbumRenderer.ts +++ b/bandcamp/src/lib/controller/browse/view-handlers/renderers/AlbumRenderer.ts @@ -1,7 +1,7 @@ -import BaseRenderer, { RenderedHeader, RenderedListItem } from './BaseRenderer'; +import BaseRenderer, { type RenderedHeader, type RenderedListItem } from './BaseRenderer'; import UIHelper from '../../../../util/UIHelper'; -import AlbumEntity from '../../../../entities/AlbumEntity'; -import { AlbumView } from '../AlbumViewHandler'; +import type AlbumEntity from '../../../../entities/AlbumEntity'; +import { type AlbumView } from '../AlbumViewHandler'; import ViewHelper from '../ViewHelper'; export default class AlbumRenderer extends BaseRenderer { diff --git a/bandcamp/src/lib/controller/browse/view-handlers/renderers/ArticleRenderer.ts b/bandcamp/src/lib/controller/browse/view-handlers/renderers/ArticleRenderer.ts index c383ab89a..4411c7098 100644 --- a/bandcamp/src/lib/controller/browse/view-handlers/renderers/ArticleRenderer.ts +++ b/bandcamp/src/lib/controller/browse/view-handlers/renderers/ArticleRenderer.ts @@ -1,10 +1,11 @@ import bandcamp from '../../../../BandcampContext'; -import BaseRenderer, { RenderedHeader, RenderedListItem } from './BaseRenderer'; +import BaseRenderer, { type RenderedHeader, type RenderedListItem } from './BaseRenderer'; import UIHelper from '../../../../util/UIHelper'; -import ArticleEntity, { ArticleEntityMediaItem } from '../../../../entities/ArticleEntity'; -import TrackEntity from '../../../../entities/TrackEntity'; -import AlbumEntity from '../../../../entities/AlbumEntity'; -import { ArticleView } from '../ArticleViewHandler'; +import {type ArticleEntityMediaItem} from '../../../../entities/ArticleEntity'; +import type ArticleEntity from '../../../../entities/ArticleEntity'; +import type TrackEntity from '../../../../entities/TrackEntity'; +import type AlbumEntity from '../../../../entities/AlbumEntity'; +import { type ArticleView } from '../ArticleViewHandler'; import ViewHelper from '../ViewHelper'; export default class ArticleRenderer extends BaseRenderer { diff --git a/bandcamp/src/lib/controller/browse/view-handlers/renderers/BandRenderer.ts b/bandcamp/src/lib/controller/browse/view-handlers/renderers/BandRenderer.ts index 8a19377bd..78b7b7a55 100644 --- a/bandcamp/src/lib/controller/browse/view-handlers/renderers/BandRenderer.ts +++ b/bandcamp/src/lib/controller/browse/view-handlers/renderers/BandRenderer.ts @@ -1,9 +1,9 @@ import bandcamp from '../../../../BandcampContext'; -import BaseRenderer, { RenderedHeader, RenderedListItem } from './BaseRenderer'; -import LabelEntity from '../../../../entities/LabelEntity'; -import ArtistEntity from '../../../../entities/ArtistEntity'; -import BandEntity from '../../../../entities/BandEntity'; -import { BandView } from '../BandViewHandler'; +import BaseRenderer, { type RenderedHeader, type RenderedListItem } from './BaseRenderer'; +import type LabelEntity from '../../../../entities/LabelEntity'; +import type ArtistEntity from '../../../../entities/ArtistEntity'; +import type BandEntity from '../../../../entities/BandEntity'; +import { type BandView } from '../BandViewHandler'; import ViewHelper from '../ViewHelper'; export default class BandRenderer extends BaseRenderer { diff --git a/bandcamp/src/lib/controller/browse/view-handlers/renderers/BaseRenderer.ts b/bandcamp/src/lib/controller/browse/view-handlers/renderers/BaseRenderer.ts index f282e90d3..c7aef38f6 100644 --- a/bandcamp/src/lib/controller/browse/view-handlers/renderers/BaseRenderer.ts +++ b/bandcamp/src/lib/controller/browse/view-handlers/renderers/BaseRenderer.ts @@ -1,6 +1,6 @@ import bandcamp from '../../../../BandcampContext'; import UIHelper, { UI_STYLES } from '../../../../util/UIHelper'; -import View from '../View'; +import type View from '../View'; export interface RenderedListItem { service: 'bandcamp'; @@ -42,7 +42,7 @@ export default abstract class BaseRenderer { abstract renderToListItem(data: T, ...args: any[]): RenderedListItem | null; - // eslint-disable-next-line @typescript-eslint/no-unused-vars + renderToHeader(data: T): RenderedHeader | null { return null; } diff --git a/bandcamp/src/lib/controller/browse/view-handlers/renderers/SearchResultParser.ts b/bandcamp/src/lib/controller/browse/view-handlers/renderers/SearchResultParser.ts index 7f4e4ca11..a8e544a85 100644 --- a/bandcamp/src/lib/controller/browse/view-handlers/renderers/SearchResultParser.ts +++ b/bandcamp/src/lib/controller/browse/view-handlers/renderers/SearchResultParser.ts @@ -1,13 +1,13 @@ -import AlbumEntity from '../../../../entities/AlbumEntity'; -import ArtistEntity from '../../../../entities/ArtistEntity'; -import LabelEntity from '../../../../entities/LabelEntity'; -import TrackEntity from '../../../../entities/TrackEntity'; -import { AlbumView } from '../AlbumViewHandler'; -import { BandView } from '../BandViewHandler'; -import { TrackView } from '../TrackViewHandler'; -import View from '../View'; +import type AlbumEntity from '../../../../entities/AlbumEntity'; +import type ArtistEntity from '../../../../entities/ArtistEntity'; +import type LabelEntity from '../../../../entities/LabelEntity'; +import type TrackEntity from '../../../../entities/TrackEntity'; +import { type AlbumView } from '../AlbumViewHandler'; +import { type BandView } from '../BandViewHandler'; +import { type TrackView } from '../TrackViewHandler'; +import type View from '../View'; import ViewHelper from '../ViewHelper'; -import BaseRenderer, { RenderedListItem } from './BaseRenderer'; +import BaseRenderer, { type RenderedListItem } from './BaseRenderer'; type SearchResultEntity = ArtistEntity | LabelEntity | AlbumEntity | TrackEntity; diff --git a/bandcamp/src/lib/controller/browse/view-handlers/renderers/ShowRenderer.ts b/bandcamp/src/lib/controller/browse/view-handlers/renderers/ShowRenderer.ts index b5ef9d541..3d4bbf86a 100644 --- a/bandcamp/src/lib/controller/browse/view-handlers/renderers/ShowRenderer.ts +++ b/bandcamp/src/lib/controller/browse/view-handlers/renderers/ShowRenderer.ts @@ -1,8 +1,8 @@ import bandcamp from '../../../../BandcampContext'; -import BaseRenderer, { RenderedHeader, RenderedListItem } from './BaseRenderer'; +import BaseRenderer, { type RenderedHeader, type RenderedListItem } from './BaseRenderer'; import UIHelper from '../../../../util/UIHelper'; -import ShowEntity from '../../../../entities/ShowEntity'; -import { ShowView } from '../ShowViewHandler'; +import type ShowEntity from '../../../../entities/ShowEntity'; +import { type ShowView } from '../ShowViewHandler'; import ViewHelper from '../ViewHelper'; export default class ShowRenderer extends BaseRenderer { diff --git a/bandcamp/src/lib/controller/browse/view-handlers/renderers/TagRenderer.ts b/bandcamp/src/lib/controller/browse/view-handlers/renderers/TagRenderer.ts index 7a99fa4af..23e8c20b8 100644 --- a/bandcamp/src/lib/controller/browse/view-handlers/renderers/TagRenderer.ts +++ b/bandcamp/src/lib/controller/browse/view-handlers/renderers/TagRenderer.ts @@ -1,39 +1,36 @@ import bandcamp from '../../../../BandcampContext'; -import BaseRenderer, { RenderedHeader, RenderedListItem } from './BaseRenderer'; -import UIHelper, { UI_STYLES } from '../../../../util/UIHelper'; -import TagEntity from '../../../../entities/TagEntity'; -import { TagView } from '../TagViewHandler'; +import BaseRenderer, { type RenderedHeader, type RenderedListItem } from './BaseRenderer'; +import type TagEntity from '../../../../entities/TagEntity'; import ViewHelper from '../ViewHelper'; - -export interface TagListSelectionRenderParams { - selected: boolean; - uri: string; -} +import { type DiscoverView } from '../DiscoverViewHandler'; export default class TagRenderer extends BaseRenderer { - renderToListItem(data: TagEntity, listSelectionParams: TagListSelectionRenderParams): RenderedListItem | null { - const title = listSelectionParams.selected ? UIHelper.styleText(data.name, UI_STYLES.LIST_ITEM_SELECTED) : data.name; + renderToListItem(data: TagEntity): RenderedListItem | null { + const discoverView: DiscoverView = { + name: 'discover', + customTags: data.value + }; return { service: 'bandcamp', type: 'item-no-menu', - title, - icon: listSelectionParams.selected ? 'fa fa-check' : 'fa', - uri: listSelectionParams.uri + title: data.name, + icon: 'fa', + uri: `${this.uri}/${ViewHelper.constructUriSegmentFromView(discoverView)}` }; } renderGenreListItem(data: TagEntity): RenderedListItem | null { - const tagView: TagView = { - name: 'tag', - tagUrl: data.url + const discoverView: DiscoverView = { + name: 'discover', + customTags: data.value }; return { service: 'bandcamp', type: 'folder', title: data.name, albumart: data.thumbnail, - uri: `${this.uri}/${ViewHelper.constructUriSegmentFromView(tagView)}` + uri: `${this.uri}/${ViewHelper.constructUriSegmentFromView(discoverView)}` }; } diff --git a/bandcamp/src/lib/controller/browse/view-handlers/renderers/TrackRenderer.ts b/bandcamp/src/lib/controller/browse/view-handlers/renderers/TrackRenderer.ts index e63845ef1..067239907 100644 --- a/bandcamp/src/lib/controller/browse/view-handlers/renderers/TrackRenderer.ts +++ b/bandcamp/src/lib/controller/browse/view-handlers/renderers/TrackRenderer.ts @@ -1,7 +1,7 @@ -import BaseRenderer, { RenderedHeader, RenderedListItem } from './BaseRenderer'; +import BaseRenderer, { type RenderedHeader, type RenderedListItem } from './BaseRenderer'; import UIHelper from '../../../../util/UIHelper'; -import TrackEntity from '../../../../entities/TrackEntity'; -import { TrackView } from '../TrackViewHandler'; +import type TrackEntity from '../../../../entities/TrackEntity'; +import { type TrackView } from '../TrackViewHandler'; import ViewHelper from '../ViewHelper'; export default class TrackRenderer extends BaseRenderer { diff --git a/bandcamp/src/lib/controller/browse/view-handlers/renderers/index.ts b/bandcamp/src/lib/controller/browse/view-handlers/renderers/index.ts index cdbeefd4f..3797806fd 100644 --- a/bandcamp/src/lib/controller/browse/view-handlers/renderers/index.ts +++ b/bandcamp/src/lib/controller/browse/view-handlers/renderers/index.ts @@ -1,4 +1,4 @@ -import View from '../View'; +import type View from '../View'; import AlbumRenderer from './AlbumRenderer'; import ArticleRenderer from './ArticleRenderer'; import BandRenderer from './BandRenderer'; @@ -40,6 +40,6 @@ export default class Renderer { if (RENDERER_TYPE_TO_CLASS[type]) { return new RENDERER_TYPE_TO_CLASS[type](uri, currentView, previousViews); } - throw Error(`Renderer not found for type ${RendererType}`); + throw Error(`Renderer not found for type ${String(type)}`); } } diff --git a/bandcamp/src/lib/controller/play/PlayController.ts b/bandcamp/src/lib/controller/play/PlayController.ts index 554e70e58..ca5eed79f 100644 --- a/bandcamp/src/lib/controller/play/PlayController.ts +++ b/bandcamp/src/lib/controller/play/PlayController.ts @@ -3,16 +3,16 @@ import libQ from 'kew'; import bandcamp from '../../BandcampContext'; -import { ExplodedTrackInfo } from '../browse/view-handlers/ExplodableViewHandler'; +import { type ExplodedTrackInfo } from '../browse/view-handlers/ExplodableViewHandler'; import ViewHelper from '../browse/view-handlers/ViewHelper'; import Model, { ModelType } from '../../model'; -import { TrackView } from '../browse/view-handlers/TrackViewHandler'; -import { ShowView } from '../browse/view-handlers/ShowViewHandler'; -import { ArticleView } from '../browse/view-handlers/ArticleViewHandler'; -import AlbumEntity from '../../entities/AlbumEntity'; -import { ArticleEntityMediaItem } from '../../entities/ArticleEntity'; -import TrackEntity from '../../entities/TrackEntity'; -import { AlbumView } from '../browse/view-handlers/AlbumViewHandler'; +import { type TrackView } from '../browse/view-handlers/TrackViewHandler'; +import { type ShowView } from '../browse/view-handlers/ShowViewHandler'; +import { type ArticleView } from '../browse/view-handlers/ArticleViewHandler'; +import type AlbumEntity from '../../entities/AlbumEntity'; +import { type ArticleEntityMediaItem } from '../../entities/ArticleEntity'; +import type TrackEntity from '../../entities/TrackEntity'; +import { type AlbumView } from '../browse/view-handlers/AlbumViewHandler'; import { kewToJSPromise } from '../../util'; import EventEmitter from 'events'; @@ -31,7 +31,7 @@ export default class PlayController { * - bandcamp/track@trackUrl={trackUrl}@artistUrl={...}@albumUrl={...} * - bandcamp/show@showUrl={showUrl} * - bandcamp/article@articleUrl={articleUrl}@mediaItemRef={...}@track={trackPosition}@artistUrl={...}@albumUrl={...} - * - bandcamp/album@albumUrl={...}@track={...}@artistUrl={...}@albumUrl={...} + * - bandcamp/album@albumUrl={...}@[track | trackId]={...}@artistUrl={...}@albumUrl={...} */ async clearAddPlayTrack(track: ExplodedTrackInfo) { bandcamp.getLogger().info(`[bandcamp-play] clearAddPlayTrack: ${track.uri}`); @@ -249,19 +249,30 @@ export default class PlayController { } else if (trackView.name === 'album') { - const { albumUrl, track: trackPosition } = trackView as AlbumView; - if (!albumUrl || !trackPosition) { - throw Error('Album URL or track position not specified'); + const { albumUrl, track: trackPosition, trackId } = trackView as AlbumView; + if (!albumUrl || (!trackPosition && !trackId)) { + throw Error('Album URL or track position / ID not specified'); } const model = Model.getInstance(ModelType.Album); const album = await model.getAlbum(albumUrl); - const albumTrack = album.tracks?.[parseInt(trackPosition, 10) - 1]; + let albumTrack; + if (trackPosition !== undefined) { + albumTrack = album.tracks?.[parseInt(trackPosition, 10) - 1]; + } + else if (trackId !== undefined) { + albumTrack = album.tracks?.find((track) => track.id !== undefined && String(track.id) === trackId); + } if (albumTrack?.streamUrl) { const safeUri = albumTrack.streamUrl.replace(/"/g, '\\"'); return safeUri; } _toast('error', bandcamp.getI18n('BANDCAMP_ERR_STREAM_NOT_FOUND', albumTrack?.name || track.name)); - throw Error(`Track or stream URL missing at position ${trackPosition} for album URL: ${albumUrl}`); + if (trackPosition !== undefined) { + throw Error(`Track or stream URL missing at position ${trackPosition} for album URL: ${albumUrl}`); + } + if (trackId !== undefined) { + throw Error(`Track matching ID ${trackId} or its stream URL missing for album URL: ${albumUrl}`); + } } _toast('error', bandcamp.getI18n('BANDCAMP_ERR_INVALID_PLAY_REQUEST')); diff --git a/bandcamp/src/lib/controller/search/SearchController.ts b/bandcamp/src/lib/controller/search/SearchController.ts index 7c9661c75..1abc4b45c 100644 --- a/bandcamp/src/lib/controller/search/SearchController.ts +++ b/bandcamp/src/lib/controller/search/SearchController.ts @@ -1,7 +1,7 @@ import bandcamp from '../../BandcampContext'; import { SearchItemType } from '../../model/SearchModel'; -import { SearchView } from '../browse/view-handlers/SearchViewHandler'; -import { RenderedList } from '../browse/view-handlers/ViewHandler'; +import { type SearchView } from '../browse/view-handlers/SearchViewHandler'; +import { type RenderedList } from '../browse/view-handlers/ViewHandler'; import ViewHandlerFactory from '../browse/view-handlers/ViewHandlerFactory'; import ViewHelper from '../browse/view-handlers/ViewHelper'; diff --git a/bandcamp/src/lib/entities/AlbumEntity.ts b/bandcamp/src/lib/entities/AlbumEntity.ts index 408515707..fee6a4257 100644 --- a/bandcamp/src/lib/entities/AlbumEntity.ts +++ b/bandcamp/src/lib/entities/AlbumEntity.ts @@ -1,5 +1,5 @@ -import ArtistEntity from './ArtistEntity'; -import TrackEntity from './TrackEntity'; +import type ArtistEntity from './ArtistEntity'; +import type TrackEntity from './TrackEntity'; interface AlbumEntity { type: 'album'; diff --git a/bandcamp/src/lib/entities/ArticleEntity.ts b/bandcamp/src/lib/entities/ArticleEntity.ts index f5b0c1bf7..db50d24ce 100644 --- a/bandcamp/src/lib/entities/ArticleEntity.ts +++ b/bandcamp/src/lib/entities/ArticleEntity.ts @@ -1,5 +1,5 @@ -import AlbumEntity from './AlbumEntity'; -import TrackEntity from './TrackEntity'; +import type AlbumEntity from './AlbumEntity'; +import type TrackEntity from './TrackEntity'; interface ArticleEntity { type: 'article', diff --git a/bandcamp/src/lib/entities/ArtistEntity.ts b/bandcamp/src/lib/entities/ArtistEntity.ts index ffa271b12..28c907326 100644 --- a/bandcamp/src/lib/entities/ArtistEntity.ts +++ b/bandcamp/src/lib/entities/ArtistEntity.ts @@ -1,5 +1,5 @@ -import BandEntity from './BandEntity'; -import LabelEntity from './LabelEntity'; +import type BandEntity from './BandEntity'; +import type LabelEntity from './LabelEntity'; interface ArtistEntity extends BandEntity { type: 'artist'; diff --git a/bandcamp/src/lib/entities/LabelEntity.ts b/bandcamp/src/lib/entities/LabelEntity.ts index 0cf146cd7..24e671c2f 100644 --- a/bandcamp/src/lib/entities/LabelEntity.ts +++ b/bandcamp/src/lib/entities/LabelEntity.ts @@ -1,4 +1,4 @@ -import BandEntity from './BandEntity'; +import type BandEntity from './BandEntity'; interface LabelEntity extends BandEntity { type: 'label'; diff --git a/bandcamp/src/lib/entities/ShowEntity.ts b/bandcamp/src/lib/entities/ShowEntity.ts index 166dee70b..e74e50cb2 100644 --- a/bandcamp/src/lib/entities/ShowEntity.ts +++ b/bandcamp/src/lib/entities/ShowEntity.ts @@ -1,4 +1,4 @@ -import TrackEntity from './TrackEntity'; +import type TrackEntity from './TrackEntity'; interface ShowEntity { type: 'show'; diff --git a/bandcamp/src/lib/entities/TagEntity.ts b/bandcamp/src/lib/entities/TagEntity.ts index 9f8c0afa8..02f138280 100644 --- a/bandcamp/src/lib/entities/TagEntity.ts +++ b/bandcamp/src/lib/entities/TagEntity.ts @@ -1,7 +1,7 @@ interface TagEntity { type: 'tag'; name: string; - url: string; + value: string; thumbnail?: string; } diff --git a/bandcamp/src/lib/entities/TrackEntity.ts b/bandcamp/src/lib/entities/TrackEntity.ts index 88ab4057e..56c8ded1c 100644 --- a/bandcamp/src/lib/entities/TrackEntity.ts +++ b/bandcamp/src/lib/entities/TrackEntity.ts @@ -1,8 +1,9 @@ -import AlbumEntity from './AlbumEntity'; -import ArtistEntity from './ArtistEntity'; +import type AlbumEntity from './AlbumEntity'; +import type ArtistEntity from './ArtistEntity'; interface TrackEntity { type: 'track'; + id?: number; name: string; url?: string; duration?: number; diff --git a/bandcamp/src/lib/model/AlbumModel.ts b/bandcamp/src/lib/model/AlbumModel.ts index 44629de58..5b8656173 100644 --- a/bandcamp/src/lib/model/AlbumModel.ts +++ b/bandcamp/src/lib/model/AlbumModel.ts @@ -1,7 +1,7 @@ -import bcfetch, { Album } from 'bandcamp-fetch'; +import bcfetch, { type Album } from 'bandcamp-fetch'; import bandcamp from '../BandcampContext'; import BaseModel from './BaseModel'; -import AlbumEntity from '../entities/AlbumEntity'; +import type AlbumEntity from '../entities/AlbumEntity'; import EntityConverter from '../util/EntityConverter'; export default class AlbumModel extends BaseModel { diff --git a/bandcamp/src/lib/model/ArticleModel.ts b/bandcamp/src/lib/model/ArticleModel.ts index 6f6c07a92..5e3fb58b3 100644 --- a/bandcamp/src/lib/model/ArticleModel.ts +++ b/bandcamp/src/lib/model/ArticleModel.ts @@ -1,7 +1,7 @@ -import bcfetch, { Article, ArticleAPIListParams, ArticleList, ArticleListItem } from 'bandcamp-fetch'; +import bcfetch, { type Article, type ArticleAPIListParams, type ArticleList, type ArticleListItem } from 'bandcamp-fetch'; import bandcamp from '../BandcampContext'; -import BaseModel, { LoopFetchCallbackParams } from './BaseModel'; -import ArticleEntity from '../entities/ArticleEntity'; +import BaseModel, { type LoopFetchCallbackParams } from './BaseModel'; +import type ArticleEntity from '../entities/ArticleEntity'; import EntityConverter from '../util/EntityConverter'; export interface ArticleModelGetArticlesParams { diff --git a/bandcamp/src/lib/model/BandModel.ts b/bandcamp/src/lib/model/BandModel.ts index ddd7ebea5..86e8bbec1 100644 --- a/bandcamp/src/lib/model/BandModel.ts +++ b/bandcamp/src/lib/model/BandModel.ts @@ -1,11 +1,11 @@ -import bcfetch, { Album, LabelArtist, Track } from 'bandcamp-fetch'; +import bcfetch, { type Album, type LabelArtist, type Track } from 'bandcamp-fetch'; import bandcamp from '../BandcampContext'; -import BaseModel, { LoopFetchCallbackParams } from './BaseModel'; -import ArtistEntity from '../entities/ArtistEntity'; +import BaseModel, { type LoopFetchCallbackParams } from './BaseModel'; +import type ArtistEntity from '../entities/ArtistEntity'; import EntityConverter from '../util/EntityConverter'; -import AlbumEntity from '../entities/AlbumEntity'; -import TrackEntity from '../entities/TrackEntity'; -import LabelEntity from '../entities/LabelEntity'; +import type AlbumEntity from '../entities/AlbumEntity'; +import type TrackEntity from '../entities/TrackEntity'; +import type LabelEntity from '../entities/LabelEntity'; export interface BandModelGetLabelArtistsParams { labelUrl: string; diff --git a/bandcamp/src/lib/model/DiscoverModel.ts b/bandcamp/src/lib/model/DiscoverModel.ts index 4f1b45b1d..b1a8a5267 100644 --- a/bandcamp/src/lib/model/DiscoverModel.ts +++ b/bandcamp/src/lib/model/DiscoverModel.ts @@ -1,7 +1,7 @@ -import bcfetch, { Album, DiscoverParams, DiscoverResult } from 'bandcamp-fetch'; +import bcfetch, { type Album, type DiscoverParams, type DiscoverResult, type DiscoverResultContinuation } from 'bandcamp-fetch'; import bandcamp from '../BandcampContext'; -import BaseModel, { LoopFetchCallbackParams, LoopFetchResult } from './BaseModel'; -import AlbumEntity from '../entities/AlbumEntity'; +import BaseModel, { type LoopFetchCallbackParams, type LoopFetchResult } from './BaseModel'; +import type AlbumEntity from '../entities/AlbumEntity'; import EntityConverter from '../util/EntityConverter'; export interface DiscoveryModelGetDiscoverResultParams { @@ -36,18 +36,20 @@ export default class DiscoverModel extends BaseModel { } #getDiscoverResultFetchPromise(params: GetDiscoverResultLoopFetchCallbackParams) { - let page = 0; - if (params.pageToken) { - const parsedPageToken = JSON.parse(params.pageToken); - page = parsedPageToken?.page || 0; - } - - const queryParams: DiscoverParams = { - ...params.discoverParams, - page, - albumImageFormat: this.getAlbumImageFormat(), - artistImageFormat: this.getArtistImageFormat() - }; + const queryParams = ((): DiscoverParams | DiscoverResultContinuation => { + if (params.pageToken) { + const parsedPageToken = JSON.parse(params.pageToken); + const continuation = parsedPageToken?.continuation; + if (continuation) { + return continuation; + } + } + return { + ...params.discoverParams, + albumImageFormat: this.getAlbumImageFormat(), + artistImageFormat: this.getArtistImageFormat() + }; + })(); return bandcamp.getCache().getOrSet( this.getCacheKeyForFetch('discover', queryParams), @@ -55,19 +57,18 @@ export default class DiscoverModel extends BaseModel { } #getDiscoverItemsFromFetchResult(result: DiscoverResult) { - return result.items.slice(0); + return result.items.filter((value) => value.type === 'album'); } #getNextPageTokenFromDiscoverFetchResult(result: DiscoverResult, params: GetDiscoverResultLoopFetchCallbackParams) { - let page = 0, indexRef = 0; + let indexRef = 0; if (params.pageToken) { const parsedPageToken = JSON.parse(params.pageToken); - page = parsedPageToken?.page || 0; indexRef = parsedPageToken?.indexRef || 0; } - if (result.items.length > 0 && result.total > indexRef + result.items.length) { + if (result.continuation && result.items.length > 0 && result.total > indexRef + result.items.length) { const nextPageToken = { - page: page + 1, + continuation: result.continuation, indexRef: indexRef + result.items.length }; return JSON.stringify(nextPageToken); @@ -85,7 +86,6 @@ export default class DiscoverModel extends BaseModel { ...result, params: lastFetchResult.params }; - delete r.params.page; return r; } @@ -93,6 +93,11 @@ export default class DiscoverModel extends BaseModel { getDiscoverOptions() { return bandcamp.getCache().getOrSet( this.getCacheKeyForFetch('discoverOptions'), - () => bcfetch.limiter.discovery.getAvailableOptions()); + async () => { + const opts = await bcfetch.limiter.discovery.getAvailableOptions(); + opts.categories = opts.categories.filter((cat) => cat.slug !== 'tshirt'); + return opts; + } + ); } } diff --git a/bandcamp/src/lib/model/FanModel.ts b/bandcamp/src/lib/model/FanModel.ts index d8fd3b884..b86617d52 100644 --- a/bandcamp/src/lib/model/FanModel.ts +++ b/bandcamp/src/lib/model/FanModel.ts @@ -1,10 +1,10 @@ -import bcfetch, { Album, FanAPIGetInfoParams, FanContinuationItemsResult, FanPageItemsResult, Tag, Track, UserKind } from 'bandcamp-fetch'; +import bcfetch, { type Album, type FanAPIGetInfoParams, type FanContinuationItemsResult, type FanPageItemsResult, type Tag, type Track, type UserKind } from 'bandcamp-fetch'; import bandcamp from '../BandcampContext'; -import BaseModel, { LoopFetchCallbackParams, LoopFetchResult } from './BaseModel'; -import BandEntity from '../entities/BandEntity'; -import AlbumEntity from '../entities/AlbumEntity'; -import TrackEntity from '../entities/TrackEntity'; -import TagEntity from '../entities/TagEntity'; +import BaseModel, { type LoopFetchCallbackParams, type LoopFetchResult } from './BaseModel'; +import type BandEntity from '../entities/BandEntity'; +import type AlbumEntity from '../entities/AlbumEntity'; +import type TrackEntity from '../entities/TrackEntity'; +import type TagEntity from '../entities/TagEntity'; import EntityConverter from '../util/EntityConverter'; import Model from '.'; diff --git a/bandcamp/src/lib/model/SearchModel.ts b/bandcamp/src/lib/model/SearchModel.ts index 60ab54fa1..2715b718d 100644 --- a/bandcamp/src/lib/model/SearchModel.ts +++ b/bandcamp/src/lib/model/SearchModel.ts @@ -1,11 +1,11 @@ -import bcfetch, { SearchAPISearchParams, SearchResultAny, SearchResults } from 'bandcamp-fetch'; +import bcfetch, { type SearchAPISearchParams, type SearchResultAny, type SearchResults } from 'bandcamp-fetch'; import bandcamp from '../BandcampContext'; -import BaseModel, { LoopFetchCallbackParams, LoopFetchResult } from './BaseModel'; +import BaseModel, { type LoopFetchCallbackParams, type LoopFetchResult } from './BaseModel'; import EntityConverter from '../util/EntityConverter'; -import ArtistEntity from '../entities/ArtistEntity'; -import LabelEntity from '../entities/LabelEntity'; -import AlbumEntity from '../entities/AlbumEntity'; -import TrackEntity from '../entities/TrackEntity'; +import type ArtistEntity from '../entities/ArtistEntity'; +import type LabelEntity from '../entities/LabelEntity'; +import type AlbumEntity from '../entities/AlbumEntity'; +import type TrackEntity from '../entities/TrackEntity'; export enum SearchItemType { All = 'All', diff --git a/bandcamp/src/lib/model/ShowModel.ts b/bandcamp/src/lib/model/ShowModel.ts index 0835b8761..c128f6f88 100644 --- a/bandcamp/src/lib/model/ShowModel.ts +++ b/bandcamp/src/lib/model/ShowModel.ts @@ -1,4 +1,4 @@ -import bcfetch, { Show } from 'bandcamp-fetch'; +import bcfetch, { type Show } from 'bandcamp-fetch'; import bandcamp from '../BandcampContext'; import BaseModel from './BaseModel'; import EntityConverter from '../util/EntityConverter'; diff --git a/bandcamp/src/lib/model/TagModel.ts b/bandcamp/src/lib/model/TagModel.ts index 12287bbda..d6c0a654f 100644 --- a/bandcamp/src/lib/model/TagModel.ts +++ b/bandcamp/src/lib/model/TagModel.ts @@ -1,108 +1,37 @@ -import bcfetch, { Album, ReleasesByTag, TagAPIGetReleasesParams, Track } from 'bandcamp-fetch'; +import bcfetch from 'bandcamp-fetch'; import bandcamp from '../BandcampContext'; -import BaseModel, { LoopFetchCallbackParams, LoopFetchResult } from './BaseModel'; +import BaseModel from './BaseModel'; import EntityConverter from '../util/EntityConverter'; -import AlbumEntity from '../entities/AlbumEntity'; -import TrackEntity from '../entities/TrackEntity'; - -export interface TagModelGetReleasesParams { - tagUrl: string; - filters: TagAPIGetReleasesParams['filters']; - pageToken?: string; - pageOffset?: number; - limit: number; -} - -interface GetReleasesLoopFetchCallbackParams extends LoopFetchCallbackParams { - tagUrl: string; - filters: TagAPIGetReleasesParams['filters']; -} - -export interface ReleasesLoopFetchResult extends LoopFetchResult { - filters: ReleasesByTag['filters']; -} export default class TagModel extends BaseModel { - getReleases(params: TagModelGetReleasesParams) { - return this.loopFetch({ - callbackParams: { ...params }, - getFetchPromise: this.#getReleasesFetchPromise.bind(this), - getItemsFromFetchResult: this.#getReleasesFromFetchResult.bind(this), - getNextPageTokenFromFetchResult: this.#getNextPageTokenFromReleasesFetchResult.bind(this), - convertToEntity: this.#convertFetchedReleaseToEntity.bind(this), - onEnd: this.#onGetReleasesLoopFetchEnd.bind(this), - pageOffset: params.pageOffset, - pageToken: params.pageToken, - limit: params.limit - }); - } - - #getReleasesFetchPromise(params: GetReleasesLoopFetchCallbackParams) { - const page = params.pageToken ? parseInt(params.pageToken, 10) : 1; - const queryParams = { - tagUrl: params.tagUrl, - page, - filters: params.filters, - imageFormat: this.getAlbumImageFormat() - }; - return bandcamp.getCache().getOrSet( - this.getCacheKeyForFetch('releasesByTag', queryParams), - () => bcfetch.limiter.tag.getReleases(queryParams)); - } - - #getReleasesFromFetchResult(result: ReleasesByTag) { - return result.items.slice(0); - } - - #getNextPageTokenFromReleasesFetchResult(result: ReleasesByTag, params: GetReleasesLoopFetchCallbackParams) { - const page = params.pageToken ? parseInt(params.pageToken) : 1; - if (result.items.length > 0 && result.hasMore) { - return (page + 1).toString(); - } - - return null; - - } - - #convertFetchedReleaseToEntity(item: Album | Track): AlbumEntity | TrackEntity { - if (item.type === 'album') { - return EntityConverter.convertAlbum(item); - } - - return EntityConverter.convertTrack(item); - } - - #onGetReleasesLoopFetchEnd(result: LoopFetchResult, lastFetchResult: ReleasesByTag) { - const r: ReleasesLoopFetchResult = { - ...result, - filters: lastFetchResult.filters - }; - return r; - } - - async getTag(tagUrl: string) { - const tag = await bandcamp.getCache().getOrSet( - this.getCacheKeyForFetch('tag', { tagUrl }), - () => bcfetch.limiter.tag.getInfo(tagUrl)); - - return EntityConverter.convertTag(tag); - } - async getTags() { const tags = await bandcamp.getCache().getOrSet( this.getCacheKeyForFetch('tags'), () => bcfetch.limiter.tag.list()); return { - tags: tags.tags.map((tag) => EntityConverter.convertTag({ ...tag, type: 'tag' })), - locations: tags.locations.map((tag) => EntityConverter.convertTag({ ...tag, type: 'tag' })) + tags: tags.tags.map((tag) => EntityConverter.convertTag(tag)), + locations: tags.locations.map((tag) => EntityConverter.convertTag(tag)) }; } - getReleasesAvailableFilters(tagUrl: string) { - return bandcamp.getCache().getOrSet( - this.getCacheKeyForFetch('releasesByTagFilterOptions', { tagUrl }), - () => bcfetch.limiter.tag.getReleasesAvailableFilters(tagUrl)); + async getRelatedTags(tags: string[]) { + const related = await bandcamp.getCache().getOrSet( + this.getCacheKeyForFetch('relatedTags', tags), + () => bcfetch.limiter.tag.getRelated({ tags })); + + let tagsArr; + if (related.combo && related.combo.length > 0) { + tagsArr = related.combo; + } + else { + tagsArr = related.single.find((row) => row.related.length > 0)?.related; + } + + if (tagsArr && tagsArr.length > 0) { + return tagsArr.map((tag) => EntityConverter.convertTag(tag)); + } + return []; } } diff --git a/bandcamp/src/lib/model/TrackModel.ts b/bandcamp/src/lib/model/TrackModel.ts index 0c9b54a3e..64ab8dd56 100644 --- a/bandcamp/src/lib/model/TrackModel.ts +++ b/bandcamp/src/lib/model/TrackModel.ts @@ -1,7 +1,7 @@ -import bcfetch, { Track } from 'bandcamp-fetch'; +import bcfetch, { type Track } from 'bandcamp-fetch'; import bandcamp from '../BandcampContext'; import BaseModel from './BaseModel'; -import TrackEntity from '../entities/TrackEntity'; +import type TrackEntity from '../entities/TrackEntity'; import EntityConverter from '../util/EntityConverter'; export default class TrackModel extends BaseModel { diff --git a/bandcamp/src/lib/model/index.ts b/bandcamp/src/lib/model/index.ts index 6671ba378..bc6999953 100644 --- a/bandcamp/src/lib/model/index.ts +++ b/bandcamp/src/lib/model/index.ts @@ -48,7 +48,7 @@ export default class Model { if (MODEL_TYPE_TO_CLASS[type]) { return new MODEL_TYPE_TO_CLASS[type](); } - throw Error(`Model not found for type ${ModelType}`); + throw Error(`Model not found for type ${String(type)}`); } static setCookie(value?: string | null) { diff --git a/bandcamp/src/lib/util/Cache.ts b/bandcamp/src/lib/util/Cache.ts index d7b3afeaa..fd9e3c42b 100644 --- a/bandcamp/src/lib/util/Cache.ts +++ b/bandcamp/src/lib/util/Cache.ts @@ -35,10 +35,12 @@ export default class Cache { this.#maxEntries = maxEntries; } + // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters get(key: string): T | undefined { return this.#cache.get(key); } + // eslint-disable-next-line @typescript-eslint/no-unnecessary-type-parameters put(key: string, value: T) { const keys = this.#cache.keys(); if (keys.length === this.#maxEntries) { diff --git a/bandcamp/src/lib/util/EntityConverter.ts b/bandcamp/src/lib/util/EntityConverter.ts index 0aaa874ee..08b424b39 100644 --- a/bandcamp/src/lib/util/EntityConverter.ts +++ b/bandcamp/src/lib/util/EntityConverter.ts @@ -1,12 +1,13 @@ -import { Album, Article, ArticleListItem, Artist, Label, LabelArtist, SearchResultAlbum, SearchResultArtist, SearchResultLabel, SearchResultTrack, Show, Tag, Track, UserKind } from 'bandcamp-fetch'; -import AlbumEntity from '../entities/AlbumEntity'; -import ArtistEntity from '../entities/ArtistEntity'; -import BandEntity from '../entities/BandEntity'; -import LabelEntity from '../entities/LabelEntity'; -import TrackEntity from '../entities/TrackEntity'; -import TagEntity from '../entities/TagEntity'; -import ShowEntity from '../entities/ShowEntity'; -import ArticleEntity, { ArticleEntityMediaItem, ArticleEntitySection } from '../entities/ArticleEntity'; +import { type Album, type Article, type ArticleListItem, type Artist, type Label, type LabelArtist, type SearchResultAlbum, type SearchResultArtist, type SearchResultLabel, type SearchResultTrack, type Show, type Tag, type Track, type UserKind } from 'bandcamp-fetch'; +import type AlbumEntity from '../entities/AlbumEntity'; +import type ArtistEntity from '../entities/ArtistEntity'; +import type BandEntity from '../entities/BandEntity'; +import type LabelEntity from '../entities/LabelEntity'; +import type TrackEntity from '../entities/TrackEntity'; +import type TagEntity from '../entities/TagEntity'; +import type ShowEntity from '../entities/ShowEntity'; +import {type ArticleEntityMediaItem, type ArticleEntitySection} from '../entities/ArticleEntity'; +import type ArticleEntity from '../entities/ArticleEntity'; export default class EntityConverter { static convertAlbum(data: Album): AlbumEntity { @@ -81,6 +82,9 @@ export default class EntityConverter { type: 'track', name: data.name }; + if (data.id) { + result.id = data.id; + } if (data.url) { result.url = data.url; } @@ -124,10 +128,11 @@ export default class EntityConverter { return this.convertArtist(item); case 'label': return this.convertLabel(item); - case 'album': + case 'album': { const albumArtist = item.artist ? { name: item.artist } : undefined; return this.convertAlbum({ ...item, artist: albumArtist }); - case 'track': + } + case 'track': { const trackArtist = item.artist ? { name: item.artist } : undefined; const trackAlbum = item.album ? { name: item.album } : undefined; return this.convertTrack({ @@ -135,6 +140,7 @@ export default class EntityConverter { artist: trackArtist, album: trackAlbum }); + } } } @@ -196,7 +202,7 @@ export default class EntityConverter { const result: TagEntity = { type: 'tag', name: data.name, - url: data.url + value: data.value }; if (data.imageUrls?.[0]) { diff --git a/bandcamp/src/lib/util/index.ts b/bandcamp/src/lib/util/index.ts index 5d5414ac7..d109125a2 100644 --- a/bandcamp/src/lib/util/index.ts +++ b/bandcamp/src/lib/util/index.ts @@ -8,8 +8,8 @@ export function jsPromiseToKew(promise: Promise): any { promise.then((result) => { defer.resolve(result); }) - .catch((error) => { - defer.reject(error); + .catch((error: unknown) => { + defer.reject(error instanceof Error ? error : Error(String(error))); }); return defer.promise; @@ -17,7 +17,7 @@ export function jsPromiseToKew(promise: Promise): any { export function kewToJSPromise(promise: any): Promise { // Guard against a JS promise from being passed to this function. - if (typeof promise.catch === 'function' && typeof promise.fail === undefined) { + if (typeof promise.catch === 'function' && typeof promise.fail === 'undefined') { // JS promise - return as is return promise; } @@ -26,7 +26,7 @@ export function kewToJSPromise(promise: any): Promise { resolve(result); }) .fail((error: any) => { - reject(error); + reject(error instanceof Error ? error : Error(String(error))); }); }); }