diff --git a/.doctrees/environment.pickle b/.doctrees/environment.pickle index 68585df..64be4a2 100644 Binary files a/.doctrees/environment.pickle and b/.doctrees/environment.pickle differ diff --git a/.doctrees/index.doctree b/.doctrees/index.doctree index c0bfb40..be78cd8 100644 Binary files a/.doctrees/index.doctree and b/.doctrees/index.doctree differ diff --git a/.doctrees/src/MusicTools.Admin.doctree b/.doctrees/src/MusicTools.Admin.doctree new file mode 100644 index 0000000..162108b Binary files /dev/null and b/.doctrees/src/MusicTools.Admin.doctree differ diff --git a/.doctrees/src/MusicTools.Maths.doctree b/.doctrees/src/MusicTools.Maths.doctree new file mode 100644 index 0000000..156150e Binary files /dev/null and b/.doctrees/src/MusicTools.Maths.doctree differ diff --git a/.doctrees/src/MusicTools.MusicTools.doctree b/.doctrees/src/MusicTools.MusicTools.doctree deleted file mode 100644 index 0328fc2..0000000 Binary files a/.doctrees/src/MusicTools.MusicTools.doctree and /dev/null differ diff --git a/.doctrees/src/MusicTools.Playlist.doctree b/.doctrees/src/MusicTools.Playlist.doctree index 0d243f8..ca19a00 100644 Binary files a/.doctrees/src/MusicTools.Playlist.doctree and b/.doctrees/src/MusicTools.Playlist.doctree differ diff --git a/.doctrees/src/MusicTools.Settings.doctree b/.doctrees/src/MusicTools.Settings.doctree new file mode 100644 index 0000000..3698ccd Binary files /dev/null and b/.doctrees/src/MusicTools.Settings.doctree differ diff --git a/.doctrees/src/MusicTools.Tag.doctree b/.doctrees/src/MusicTools.Tag.doctree index 020ff21..94a4f57 100644 Binary files a/.doctrees/src/MusicTools.Tag.doctree and b/.doctrees/src/MusicTools.Tag.doctree differ diff --git a/.doctrees/src/MusicTools.doctree b/.doctrees/src/MusicTools.doctree index 812d423..424f039 100644 Binary files a/.doctrees/src/MusicTools.doctree and b/.doctrees/src/MusicTools.doctree differ diff --git a/.doctrees/src/modules.doctree b/.doctrees/src/modules.doctree index 926ac4b..016f7c2 100644 Binary files a/.doctrees/src/modules.doctree and b/.doctrees/src/modules.doctree differ diff --git a/.doctrees/src/music.doctree b/.doctrees/src/music.doctree index dd6f2a9..5688104 100644 Binary files a/.doctrees/src/music.doctree and b/.doctrees/src/music.doctree differ diff --git a/_sources/index.rst.txt b/_sources/index.rst.txt index a452bac..2805352 100644 --- a/_sources/index.rst.txt +++ b/_sources/index.rst.txt @@ -2,18 +2,12 @@ Music Tools ======================================= .. toctree:: - :maxdepth: 1 + :maxdepth: 2 :caption: Contents: - Modules - src/music - src/music.api - src/music.auth - src/music.cloud - src/music.db - src/music.model - src/music.tasks - src/MusicTools + Py + Js + All Modules `Music Tools `_ ---------------------------------------------- @@ -22,7 +16,7 @@ Music Tools Music Tools is a web app for creating smart Spotify playlists. The app is based on `spotframework `_ and `fmframework `_ for interfacing with Spotify and Last.fm. The app is currently hosted on Google's Cloud Platform. -The system is composed of a Flask web server with a Fireo ORM layer and longer tasks dispatched to Cloud Tasks or Functions. +The backend is composed of a Flask web server with a Fireo ORM layer and longer tasks dispatched to Cloud Tasks or Functions. The frontend is a React app with material UI components and Axios for HTTP requests. .. image:: Playlists.png diff --git a/_sources/src/MusicTools.Admin.rst.txt b/_sources/src/MusicTools.Admin.rst.txt new file mode 100644 index 0000000..aa10ade --- /dev/null +++ b/_sources/src/MusicTools.Admin.rst.txt @@ -0,0 +1,34 @@ +Admin +================= + +Router +-------- + +.. js:autoclass:: Admin + :members: + :private-members: + +Lock +------------------ + +.. js:autoclass:: Lock + :members: + :private-members: + +.. js:autofunction:: Row + +Functions +-------------------- + +.. js:autoclass:: Functions + :members: + :private-members: + +Tasks +-------------------- + +.. js:autoclass:: Tasks + :members: + :private-members: + +.. js:autofunction:: TaskType \ No newline at end of file diff --git a/_sources/src/MusicTools.Maths.rst.txt b/_sources/src/MusicTools.Maths.rst.txt new file mode 100644 index 0000000..bc50182 --- /dev/null +++ b/_sources/src/MusicTools.Maths.rst.txt @@ -0,0 +1,17 @@ +Maths +================= + +Bar Chart +----------------- + +.. js:autoclass:: BarChart + :members: + :private-members: + +Pie Chart +------------------ + +.. js:autoclass:: PieChart + :members: + :private-members: + diff --git a/_sources/src/MusicTools.MusicTools.rst.txt b/_sources/src/MusicTools.MusicTools.rst.txt deleted file mode 100644 index 06a6bb6..0000000 --- a/_sources/src/MusicTools.MusicTools.rst.txt +++ /dev/null @@ -1,6 +0,0 @@ -MusicTools -================= - -.. js:autoclass:: MusicTools - :members: - :private-members: \ No newline at end of file diff --git a/_sources/src/MusicTools.Playlist.rst.txt b/_sources/src/MusicTools.Playlist.rst.txt index 5e3b698..4dd7a52 100644 --- a/_sources/src/MusicTools.Playlist.rst.txt +++ b/_sources/src/MusicTools.Playlist.rst.txt @@ -8,7 +8,13 @@ Router :members: :private-members: -Playlists List +For managing playlists list pages for diverting to new playlist page + +.. js:autoclass:: PlaylistRouter.View + :members: + :private-members: + +Cards List ------------------ .. js:autoclass:: PlaylistsView @@ -32,14 +38,7 @@ New Playlist Card :members: :private-members: -Playlist Router ------------------- - -.. js:autoclass:: PlaylistRouter.View - :members: - :private-members: - -Playlist View +View/Edit Card ------------------ .. js:autoclass:: Edit @@ -52,7 +51,7 @@ Playlist View .. js:autofunction:: Edit.BlockGridItem -Playlist Stats View +Stats Card ----------------------- .. js:autoclass:: Count diff --git a/_sources/src/MusicTools.Settings.rst.txt b/_sources/src/MusicTools.Settings.rst.txt new file mode 100644 index 0000000..589dbaa --- /dev/null +++ b/_sources/src/MusicTools.Settings.rst.txt @@ -0,0 +1,34 @@ +Settings +================= + +Router +-------- + +.. js:autoclass:: Settings + :members: + :private-members: + +Change Password +------------------ + +.. js:autoclass:: ChangePassword + :members: + :private-members: + +Spotify Link +------------------ + +.. js:autoclass:: SpotifyLink + :members: + :private-members: + +.. js:autofunction:: AuthButton + +.. js:autofunction:: DeAuthButton + +Last.fm Username +------------------ + +.. js:autoclass:: LastFM + :members: + :private-members: diff --git a/_sources/src/MusicTools.Tag.rst.txt b/_sources/src/MusicTools.Tag.rst.txt index 28db4c0..aa179dd 100644 --- a/_sources/src/MusicTools.Tag.rst.txt +++ b/_sources/src/MusicTools.Tag.rst.txt @@ -8,7 +8,7 @@ Router :members: :private-members: -Tags List +Cards List ------------------ .. js:autoclass:: TagList @@ -28,3 +28,10 @@ New Tag Card :members: :private-members: +View/Edit Tag +-------------------- + +.. js:autoclass:: TagView + :members: + :private-members: + diff --git a/_sources/src/MusicTools.rst.txt b/_sources/src/MusicTools.rst.txt index e5e5ec4..3f47637 100644 --- a/_sources/src/MusicTools.rst.txt +++ b/_sources/src/MusicTools.rst.txt @@ -1,13 +1,15 @@ -Music Tools React +React Frontend =================== -Subpackages ------------ - .. toctree:: :maxdepth: 4 - MusicTools.MusicTools MusicTools.Playlist MusicTools.Tag + MusicTools.Maths + MusicTools.Admin + MusicTools.Settings +.. js:autoclass:: MusicTools + :members: + :private-members: \ No newline at end of file diff --git a/_sources/src/modules.rst.txt b/_sources/src/modules.rst.txt index 0f60f80..a0cdc3e 100644 --- a/_sources/src/modules.rst.txt +++ b/_sources/src/modules.rst.txt @@ -1,5 +1,5 @@ -music -===== +Music Tools Modules +====================== .. toctree:: :maxdepth: 4 diff --git a/_sources/src/music.rst.txt b/_sources/src/music.rst.txt index cc1f5d8..d117b03 100644 --- a/_sources/src/music.rst.txt +++ b/_sources/src/music.rst.txt @@ -1,8 +1,5 @@ -music -============= - -Subpackages ------------ +Flask Backend +==================== .. toctree:: :maxdepth: 4 @@ -14,17 +11,14 @@ Subpackages music.model music.tasks -Module contents ---------------- +music Root Module +------------------ .. automodule:: music :members: :undoc-members: :show-inheritance: -music.music module ------------------- - .. automodule:: music.music :members: :undoc-members: diff --git a/genindex.html b/genindex.html index e90d330..41c678c 100644 --- a/genindex.html +++ b/genindex.html @@ -35,9 +35,11 @@
A + | B | C | D | E + | F | G | I | L @@ -61,6 +63,10 @@
  • add_last_month (music.model.playlist.Playlist attribute)
  • add_this_month (music.model.playlist.Playlist attribute) +
  • +
  • Admin() (class) +
  • +
  • Admin.handleChange() (Admin method)
  • admin_required() (in module music.api.decorators)
  • @@ -75,6 +81,22 @@
  • artists (music.model.tag.Tag attribute)
  • auth() (in module music.auth.auth) +
  • +
  • AuthButton() (built-in function) +
  • + + + +

    B

    + + +
    @@ -83,6 +105,16 @@
    +

    F

    + + + +
    +

    G

    + -
    +
  • LastFM() (class) +
  • +
  • LastFM.getUserInfo() (LastFM method) +
  • +
  • LastFM.handleChange() (LastFM method) +
  • +
  • LastFM.handleSubmit() (LastFM method) +
  • lastfm_stat_album_count (music.model.playlist.Playlist attribute)
  • lastfm_stat_album_percent (music.model.playlist.Playlist attribute) @@ -289,6 +345,12 @@
  • lastfm_username (music.model.user.User attribute)
  • lastfm_username_required() (in module music.api.decorators) +
  • +
  • Lock() (class) +
  • +
  • Lock.getUserInfo() (Lock method) +
  • +
  • Lock.handleLock() (Lock method)
  • locked (music.model.user.User attribute)
  • @@ -574,15 +636,15 @@
  • module
  • -
  • MusicTools() (class) +
  • MusicTools() (class)
  • -
  • MusicTools.componentDidMount() (MusicTools method) +
  • MusicTools.componentDidMount() (MusicTools method)
  • -
  • MusicTools.componentWillUnmount() (MusicTools method) +
  • MusicTools.componentWillUnmount() (MusicTools method)
  • -
  • MusicTools.getUserInfo() (MusicTools method) +
  • MusicTools.getUserInfo() (MusicTools method)
  • -
  • MusicTools.setOpen() (MusicTools method) +
  • MusicTools.setOpen() (MusicTools method)
  • mutable_keys (music.model.playlist.Playlist attribute)
  • @@ -637,6 +699,12 @@
  • parts (music.model.playlist.Playlist attribute)
  • password (music.model.user.User attribute) +
  • +
  • PieChart() (class) +
  • +
  • PieChart.componentDidMount() (PieChart method) +
  • +
  • PieChart.componentDidUpdate() (PieChart method)
  • play() (in module music.api.player)
  • @@ -654,12 +722,12 @@
  • playlist_refresh() (in module music.api.spotfm)
  • +
      +
    • TagView.handleInputChange() (TagView method) +
    • +
    • TagView.handleRemoveObj() (TagView method) +
    • +
    • TagView.handleRun() (TagView method) +
    • +
    • TagView.makeNetworkUpdate() (TagView method) +
    • +
    • Tasks() (class) +
    • +
    • Tasks.getTasks() (Tasks method) +
    • +
    • TaskType() (built-in function) +
    • time_objects (music.model.tag.Tag attribute)
    • to_dict() (music.model.playlist.Playlist method) @@ -933,15 +1037,9 @@

      Navigation

      Contents:

      diff --git a/index.html b/index.html index 37b673f..499b484 100644 --- a/index.html +++ b/index.html @@ -15,7 +15,7 @@ - + @@ -37,21 +37,35 @@

      Music Tools

      https://github.com/sarsoo/music-tools/workflows/test%20and%20deploy/badge.svg

      Music Tools is a web app for creating smart Spotify playlists. The app is based on spotframework and fmframework for interfacing with Spotify and Last.fm. The app is currently hosted on Google’s Cloud Platform.

      -

      The system is composed of a Flask web server with a Fireo ORM layer and longer tasks dispatched to Cloud Tasks or Functions.

      +

      The backend is composed of a Flask web server with a Fireo ORM layer and longer tasks dispatched to Cloud Tasks or Functions. The frontend is a React app with material UI components and Axios for HTTP requests.

      _images/Playlists.png
      @@ -83,22 +97,16 @@

      Navigation

      Contents:

      Related Topics

      diff --git a/objects.inv b/objects.inv index dffeb44..3ef456c 100644 Binary files a/objects.inv and b/objects.inv differ diff --git a/py-modindex.html b/py-modindex.html index 36c17ed..c03af7b 100644 --- a/py-modindex.html +++ b/py-modindex.html @@ -211,15 +211,9 @@

      Navigation

      Contents:

      diff --git a/search.html b/search.html index f5728e8..e7ea106 100644 --- a/search.html +++ b/search.html @@ -76,15 +76,9 @@

      Navigation

      Contents:

      diff --git a/searchindex.js b/searchindex.js index 8112433..130d9d6 100644 --- a/searchindex.js +++ b/searchindex.js @@ -1 +1 @@ -Search.setIndex({docnames:["index","src/MusicTools","src/MusicTools.MusicTools","src/MusicTools.Playlist","src/MusicTools.Tag","src/modules","src/music","src/music.api","src/music.auth","src/music.cloud","src/music.db","src/music.model","src/music.tasks"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":3,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":2,"sphinx.domains.rst":2,"sphinx.domains.std":2,sphinx:56},filenames:["index.rst","src/MusicTools.rst","src/MusicTools.MusicTools.rst","src/MusicTools.Playlist.rst","src/MusicTools.Tag.rst","src/modules.rst","src/music.rst","src/music.api.rst","src/music.auth.rst","src/music.cloud.rst","src/music.db.rst","src/music.model.rst","src/music.tasks.rst"],objects:{"":{Count:[3,0,1,""],Edit:[3,0,1,""],MusicTools:[2,0,1,""],NewPlaylist:[3,0,1,""],NewTag:[4,0,1,""],PlaylistCard:[3,0,1,""],PlaylistGrid:[3,0,1,""],Playlists:[3,0,1,""],PlaylistsView:[3,0,1,""],ReferenceEntry:[3,2,1,""],TagCard:[4,2,1,""],TagGrid:[4,2,1,""],TagList:[4,0,1,""],TagRouter:[4,0,1,""],getPlaylistLink:[3,2,1,""],getTagLink:[4,2,1,""],music:[6,3,0,"-"]},"PlaylistRouter.View":{handleChange:[3,2,1,""]},"music.api":{admin:[7,3,0,"-"],api:[7,3,0,"-"],decorators:[7,3,0,"-"],fm:[7,3,0,"-"],player:[7,3,0,"-"],spotfm:[7,3,0,"-"],spotify:[7,3,0,"-"],tag:[7,3,0,"-"]},"music.api.admin":{get_tasks:[7,4,1,""]},"music.api.api":{all_playlists_route:[7,4,1,""],all_users_route:[7,4,1,""],change_password:[7,4,1,""],image:[7,4,1,""],playlist_get_delete_route:[7,4,1,""],playlist_post_put_route:[7,4,1,""],run_playlist:[7,4,1,""],run_playlist_task:[7,4,1,""],run_user:[7,4,1,""],run_user_task:[7,4,1,""],run_users:[7,4,1,""],user_route:[7,4,1,""]},"music.api.decorators":{admin_required:[7,4,1,""],check_dict:[7,4,1,""],cloud_task:[7,4,1,""],gae_cron:[7,4,1,""],is_basic_authed:[7,4,1,""],is_logged_in:[7,4,1,""],lastfm_username_required:[7,4,1,""],login_or_basic_auth:[7,4,1,""],login_required:[7,4,1,""],spotify_link_required:[7,4,1,""],validate_args:[7,4,1,""],validate_json:[7,4,1,""]},"music.api.fm":{daily_scrobbles:[7,4,1,""]},"music.api.player":{next_track:[7,4,1,""],play:[7,4,1,""],shuffle:[7,4,1,""],volume:[7,4,1,""]},"music.api.spotfm":{count:[7,4,1,""],playlist_refresh:[7,4,1,""],run_playlist_album_task:[7,4,1,""],run_playlist_artist_task:[7,4,1,""],run_playlist_track_task:[7,4,1,""],run_user:[7,4,1,""],run_user_task:[7,4,1,""],run_users:[7,4,1,""]},"music.api.spotify":{sort:[7,4,1,""]},"music.api.tag":{delete_tag:[7,4,1,""],get_tag:[7,4,1,""],post_tag:[7,4,1,""],put_tag:[7,4,1,""],run_tag_task:[7,4,1,""],tag_refresh:[7,4,1,""],tag_route:[7,4,1,""],tags:[7,4,1,""]},"music.auth":{auth:[8,3,0,"-"]},"music.auth.auth":{auth:[8,4,1,""],deauth:[8,4,1,""],login:[8,4,1,""],logout:[8,4,1,""],register:[8,4,1,""],token:[8,4,1,""]},"music.cloud":{"function":[9,3,0,"-"],offload_or_run_user_playlist:[9,4,1,""],queue_run_user_playlist:[9,4,1,""],tasks:[9,3,0,"-"]},"music.cloud.function":{run_user_playlist_function:[9,4,1,""],update_tag:[9,4,1,""]},"music.cloud.tasks":{refresh_all_user_playlist_stats:[9,4,1,""],refresh_playlist_task:[9,4,1,""],refresh_user_playlist_stats:[9,4,1,""],refresh_user_stats_task:[9,4,1,""],run_user_playlist_task:[9,4,1,""],update_all_user_playlists:[9,4,1,""],update_all_user_tags:[9,4,1,""],update_playlists:[9,4,1,""]},"music.db":{database:[10,3,0,"-"],part_generator:[10,3,0,"-"]},"music.db.database":{DatabaseUser:[10,5,1,""],get_authed_lastfm_network:[10,4,1,""],get_authed_spotify_network:[10,4,1,""],refresh_token_database_callback:[10,4,1,""]},"music.db.database.DatabaseUser":{user_id:[10,6,1,""]},"music.db.part_generator":{PartGenerator:[10,5,1,""]},"music.db.part_generator.PartGenerator":{get_recursive_parts:[10,7,1,""],process_reference_by_name:[10,7,1,""],process_reference_by_reference:[10,7,1,""],reset:[10,7,1,""]},"music.model":{config:[11,3,0,"-"],playlist:[11,3,0,"-"],tag:[11,3,0,"-"],user:[11,3,0,"-"]},"music.model.config":{Config:[11,5,1,""]},"music.model.config.Config":{Meta:[11,5,1,""],collection:[11,6,1,""],collection_name:[11,6,1,""],last_fm_client_id:[11,6,1,""],playlist_cloud_operating_mode:[11,6,1,""],secret_key:[11,6,1,""],spotify_client_id:[11,6,1,""],spotify_client_secret:[11,6,1,""]},"music.model.config.Config.Meta":{collection_name:[11,6,1,""]},"music.model.playlist":{Playlist:[11,5,1,""],Sort:[11,5,1,""]},"music.model.playlist.Playlist":{Meta:[11,5,1,""],add_last_month:[11,6,1,""],add_this_month:[11,6,1,""],chart_limit:[11,6,1,""],chart_range:[11,6,1,""],collection:[11,6,1,""],collection_name:[11,6,1,""],day_boundary:[11,6,1,""],description_overwrite:[11,6,1,""],description_suffix:[11,6,1,""],include_library_tracks:[11,6,1,""],include_recommendations:[11,6,1,""],last_updated:[11,6,1,""],lastfm_stat_album_count:[11,6,1,""],lastfm_stat_album_percent:[11,6,1,""],lastfm_stat_artist_count:[11,6,1,""],lastfm_stat_artist_percent:[11,6,1,""],lastfm_stat_count:[11,6,1,""],lastfm_stat_last_refresh:[11,6,1,""],lastfm_stat_percent:[11,6,1,""],mutable_keys:[11,6,1,""],name:[11,6,1,""],parts:[11,6,1,""],playlist_references:[11,6,1,""],recommendation_sample:[11,6,1,""],shuffle:[11,6,1,""],sort:[11,6,1,""],to_dict:[11,7,1,""],type:[11,6,1,""],uri:[11,6,1,""]},"music.model.playlist.Playlist.Meta":{collection_name:[11,6,1,""]},"music.model.playlist.Sort":{"default":[11,6,1,""],release_date:[11,6,1,""],shuffle:[11,6,1,""]},"music.model.tag":{Tag:[11,5,1,""]},"music.model.tag.Tag":{Meta:[11,5,1,""],albums:[11,6,1,""],artists:[11,6,1,""],collection:[11,6,1,""],collection_name:[11,6,1,""],count:[11,6,1,""],last_updated:[11,6,1,""],name:[11,6,1,""],proportion:[11,6,1,""],tag_id:[11,6,1,""],time_objects:[11,6,1,""],to_dict:[11,7,1,""],total_time:[11,6,1,""],total_time_ms:[11,6,1,""],total_user_scrobbles:[11,6,1,""],tracks:[11,6,1,""],username:[11,6,1,""]},"music.model.tag.Tag.Meta":{collection_name:[11,6,1,""]},"music.model.user":{User:[11,5,1,""]},"music.model.user.User":{Meta:[11,5,1,""],access_token:[11,6,1,""],check_password:[11,7,1,""],collection:[11,6,1,""],collection_name:[11,6,1,""],email:[11,6,1,""],last_login:[11,6,1,""],last_refreshed:[11,6,1,""],lastfm_username:[11,6,1,""],locked:[11,6,1,""],password:[11,6,1,""],refresh_token:[11,6,1,""],spotify_linked:[11,6,1,""],to_dict:[11,7,1,""],token_expiry:[11,6,1,""],type:[11,6,1,""],username:[11,6,1,""],validated:[11,6,1,""]},"music.model.user.User.Meta":{collection_name:[11,6,1,""]},"music.music":{create_app:[6,4,1,""]},"music.tasks":{create_playlist:[12,3,0,"-"],refresh_lastfm_stats:[12,3,0,"-"],run_user_playlist:[12,3,0,"-"],update_tag:[12,3,0,"-"]},"music.tasks.create_playlist":{create_playlist:[12,4,1,""]},"music.tasks.refresh_lastfm_stats":{refresh_lastfm_album_stats:[12,4,1,""],refresh_lastfm_artist_stats:[12,4,1,""],refresh_lastfm_track_stats:[12,4,1,""]},"music.tasks.run_user_playlist":{run_user_playlist:[12,4,1,""]},"music.tasks.update_tag":{update_tag:[12,4,1,""]},Count:{Count:[3,1,1,""],getUserInfo:[3,2,1,""],updateStats:[3,2,1,""]},Edit:{BlockGridItem:[3,2,1,""],Edit:[3,1,1,""],ListBlock:[3,2,1,""],componentDidMount:[3,2,1,""],getPlaylistInfo:[3,2,1,""],getPlaylists:[3,2,1,""],handleAddPart:[3,2,1,""],handleAddReference:[3,2,1,""],handleCheckChange:[3,2,1,""],handleInputChange:[3,2,1,""],handleRemovePart:[3,2,1,""],handleRemoveReference:[3,2,1,""],handleRun:[3,2,1,""],makeNetworkUpdate:[3,2,1,""]},MusicTools:{componentDidMount:[2,2,1,""],componentWillUnmount:[2,2,1,""],getUserInfo:[2,2,1,""],setOpen:[2,2,1,""]},NewPlaylist:{componentDidMount:[3,2,1,""],handleInputChange:[3,2,1,""],handleSubmit:[3,2,1,""],setDescription:[3,2,1,""]},NewTag:{handleInputChange:[4,2,1,""],handleSubmit:[4,2,1,""]},PlaylistRouter:{View:[3,0,1,""]},PlaylistsView:{getPlaylists:[3,2,1,""],handleDeletePlaylist:[3,2,1,""],handleRunAll:[3,2,1,""],handleRunPlaylist:[3,2,1,""]},TagList:{getTags:[4,2,1,""],handleDeleteTag:[4,2,1,""]},music:{api:[7,3,0,"-"],auth:[8,3,0,"-"],cloud:[9,3,0,"-"],db:[10,3,0,"-"],init_log:[6,4,1,""],model:[11,3,0,"-"],music:[6,3,0,"-"],tasks:[12,3,0,"-"]}},objnames:{"0":["js","class","JavaScript class"],"1":["js","attribute","JavaScript attribute"],"2":["js","function","JavaScript function"],"3":["py","module","Python module"],"4":["py","function","Python function"],"5":["py","class","Python class"],"6":["py","attribute","Python attribute"],"7":["py","method","Python method"]},objtypes:{"0":"js:class","1":"js:attribute","2":"js:function","3":"py:module","4":"py:function","5":"py:class","6":"py:attribute","7":"py:method"},terms:{"class":[2,3,4,10,11],"default":[7,9,11,12],"enum":11,"function":[0,5,6,10,11,12],"int":9,"long":[9,12],"new":[1,5,12],"return":[3,4,6,7,8,10,11,12],Adding:10,For:12,The:0,Used:10,access_token:[10,11],account:12,action:3,add_last_month:11,add_this_month:11,adding:3,admin:[5,6],admin_requir:7,album:11,all:[3,7,9],all_playlists_rout:7,all_users_rout:7,allow:8,api:[0,2,3,4,5,6],app:[0,2,6,7,11,12],arg:[3,7,11],argument:[2,3,4],artist:11,asid:10,attributeerror:12,auth:[0,5,6],authent:10,avail:12,backend:6,base:[0,10,11],between:4,blockgriditem:3,blueprint:[6,7],bool:2,box:[3,4],button:3,callback:10,cancel:2,card:[1,5],cell:3,chang:[3,4],change_password:7,chart_limit:11,chart_rang:11,check:3,check_dict:7,check_password:11,checkbox:3,client_id:10,client_secret:10,cloud:[0,5,6,10,11],cloud_task:7,code:9,collect:11,collection_nam:11,compon:[2,3,4,10],componentdidmount:[2,3],componentwillunmount:2,compos:0,config:[5,6],consol:6,contain:[3,6,11],content:[0,5],convert:11,correct:11,count:[3,7,11],creat:[0,6,9,12],create_app:6,create_playlist:[5,6],credemti:10,credenti:10,current:0,daily_scrobbl:7,data:[3,4,11],databas:[5,6],databaseus:10,day_boundari:11,deauth:8,decor:[5,6],delai:9,delet:[3,4],delete_tag:7,depend:[9,10],descript:[3,7,11,12],description_overwrit:11,description_suffix:11,determin:11,dict:11,dictionari:3,direct:4,dispatch:0,document:10,documentrefer:10,done:11,drawer:2,dropbox:3,dure:3,edit:3,email:11,endpoint:[7,8],entri:3,enumer:11,environ:9,error:12,event:[3,4],execut:9,expected_arg:7,fals:6,fireo:[0,11],firestor:[10,11],firestore_v1:10,flask:[0,6,7],fmframework:[0,10,12],fmnet:12,fmnetwork:10,from:[2,3,4,10],fullplaylist:12,func:7,gae_cron:7,gcp:9,gener:[6,12],get:[2,3,4,8,10],get_authed_lastfm_network:10,get_authed_spotify_network:10,get_recursive_part:10,get_tag:7,get_task:7,getplaylist:3,getplaylistinfo:3,getplaylistlink:3,gettag:4,gettaglink:4,getuserinfo:[2,3],given:[3,7,9,10],googl:[0,10],grid:[3,4],hand:9,handl:[3,4,10],handleaddpart:3,handleaddrefer:3,handlechang:3,handlecheckchang:3,handledeleteplaylist:3,handledeletetag:4,handleinputchang:[3,4],handleremovepart:3,handleremoverefer:3,handlerun:3,handlerunal:3,handlerunplaylist:3,handlesubmit:[3,4],has:[3,12],home:8,host:[0,3],html:8,http:[7,8],imag:7,includ:[3,8,9,12],include_library_track:11,include_recommend:11,index:0,info:[2,3,4],infrastuctur:9,init:3,init_log:6,initi:3,initialis:6,input:[3,4],interfac:[0,10],intern:10,is_basic_auth:7,is_logged_in:7,kei:11,kwarg:[7,11],last:[0,3,12],last_fm_client_id:11,last_login:11,last_refresh:11,last_upd:11,lastfm_stat_album_count:11,lastfm_stat_album_perc:11,lastfm_stat_artist_count:11,lastfm_stat_artist_perc:11,lastfm_stat_count:11,lastfm_stat_last_refresh:11,lastfm_stat_perc:11,lastfm_usernam:11,lastfm_username_requir:7,layer:[0,10,11],level:[3,6,11],link:3,list:[1,5,10],listblock:3,listen:3,load:[2,3,6,7],lock:11,log:6,login:8,login_or_basic_auth:7,login_requir:7,logout:8,longer:0,main:3,make:[3,4],makenetworkupd:3,manag:11,map:4,match:3,meta:11,model:[0,5,6,10,12],modul:[0,5],music:3,musictool:[1,5],mutable_kei:11,name:[3,4,9,10,11,12],nameerror:12,net:[10,12],network:[10,12],networkus:10,newli:10,newplaylist:3,newtag:4,newvalu:3,next_track:7,none:[7,9,10,11,12],object:[3,10,11,12],off:9,offload_or_run_user_playlist:9,open:2,oper:[9,11,12],option:[3,7,9,10,12],orm:[0,10,11],other:10,page:[0,3,8],paramet:[7,9,10,11,12],part:11,part_gener:[5,6],partgener:10,password:[8,11],path:11,plai:7,platform:0,player:[5,6],playlist:[0,1,5,6,7,9,10,12],playlist_cloud_operating_mod:11,playlist_get_delete_rout:7,playlist_nam:[9,12],playlist_post_put_rout:7,playlist_refer:11,playlist_refresh:7,playlistcard:3,playlistgrid:3,playlistnam:3,playlistrout:3,playlistsview:3,post:[3,8],post_tag:7,present:3,process_reference_by_nam:10,process_reference_by_refer:10,prop:[2,3,4],properti:[3,4],proport:11,provid:12,put_tag:7,queue:9,queue_run_user_playlist:9,rais:12,react:[0,5],readi:6,recommendation_sampl:11,recurs:10,redirect:8,ref:10,refer:3,referenc:10,referenceentri:3,refresh:[3,9],refresh_all_user_playlist_stat:9,refresh_lastfm_album_stat:12,refresh_lastfm_artist_stat:12,refresh_lastfm_stat:[5,6],refresh_lastfm_track_stat:12,refresh_playlist_task:9,refresh_token:[10,11],refresh_token_database_callback:10,refresh_user_playlist_stat:9,refresh_user_stats_task:9,regist:8,relat:8,release_d:11,remov:3,request:[2,3,4,8],request_param:7,reset:[8,10],resolut:10,resolv:10,respons:[7,8],result:[3,8],retriev:[6,7,8,10,12],root:[2,6],rout:8,router:[1,5],run:[3,6,9,12],run_playlist:7,run_playlist_album_task:7,run_playlist_artist_task:7,run_playlist_task:7,run_playlist_track_task:7,run_tag_task:7,run_us:7,run_user_playlist:[5,6],run_user_playlist_funct:9,run_user_playlist_task:9,run_user_task:7,search:0,second:9,secret_kei:11,secur:8,send:3,server:0,serverless:9,servic:11,set:[2,3,11],setdescript:3,setopen:2,shuffl:[7,11],side:2,smart:[0,3,10,11,12],sort:[3,7,11],spotfm:[5,6],spotframework:[0,10,12],spotifi:[0,3,5,6,10,12],spotify_client_id:11,spotify_client_secret:11,spotify_link:11,spotify_link_requir:7,spotify_us:11,spotifynetwork:10,spotnet:12,spotnetwork:12,stack:6,stat:[1,5,9],state:[2,3,4,10],statist:3,store:10,str:[9,10,12],string:3,structur:[3,11],subject:[3,4,9,10,12],submiss:8,subpackag:5,system:0,tab:3,tag:[1,5,6,9,12],tag_id:[4,7,9,11],tag_refresh:7,tag_rout:7,tagcard:4,taggrid:4,taglist:4,tagnam:4,tagrout:4,task:[0,5,6,11],time_object:11,to_dict:11,token:8,token_expiri:11,tool:[3,5,6,10],top:[3,6],total_tim:11,total_time_m:11,total_user_scrobbl:11,track:11,trigger:3,type:[3,6,7,8,10,11,12],upad:12,updat:[3,9,10,11,12],update_all_user_playlist:9,update_all_user_tag:9,update_playlist:9,update_tag:[5,6,9],updatestat:3,uri:[11,12],url:[3,4],user:[2,3,5,6,7,9,10,12],user_id:10,user_rout:7,usernam:[3,9,10,11,12],valid:[3,4,11],validate_arg:7,validate_json:7,valu:[3,11],view:[1,5],volum:7,walk:10,watch:3,web:0,when:[10,12],whether:[2,11],wrap:3},titles:["Music Tools","Music Tools React","MusicTools","Playlist","Tag","music","music","music.api","music.auth","music.cloud","music.db","music.model","music.tasks"],titleterms:{"function":9,"new":[3,4],admin:7,api:7,auth:8,card:[3,4],cloud:9,config:11,content:[6,7,8,9,10,11,12],create_playlist:12,databas:10,decor:7,indic:0,list:[3,4],model:11,modul:[6,7,8,9,10,11,12],music:[0,1,5,6,7,8,9,10,11,12],musictool:2,part_gener:10,player:7,playlist:[3,11],react:1,refresh_lastfm_stat:12,router:[3,4],run_user_playlist:12,spotfm:7,spotifi:7,stat:3,subpackag:[1,6],tabl:0,tag:[4,7,11],task:[9,12],tool:[0,1],update_tag:12,user:11,view:3}}) \ No newline at end of file +Search.setIndex({docnames:["index","src/MusicTools","src/MusicTools.Admin","src/MusicTools.Maths","src/MusicTools.Playlist","src/MusicTools.Settings","src/MusicTools.Tag","src/modules","src/music","src/music.api","src/music.auth","src/music.cloud","src/music.db","src/music.model","src/music.tasks"],envversion:{"sphinx.domains.c":2,"sphinx.domains.changeset":1,"sphinx.domains.citation":1,"sphinx.domains.cpp":3,"sphinx.domains.index":1,"sphinx.domains.javascript":2,"sphinx.domains.math":2,"sphinx.domains.python":2,"sphinx.domains.rst":2,"sphinx.domains.std":2,sphinx:56},filenames:["index.rst","src/MusicTools.rst","src/MusicTools.Admin.rst","src/MusicTools.Maths.rst","src/MusicTools.Playlist.rst","src/MusicTools.Settings.rst","src/MusicTools.Tag.rst","src/modules.rst","src/music.rst","src/music.api.rst","src/music.auth.rst","src/music.cloud.rst","src/music.db.rst","src/music.model.rst","src/music.tasks.rst"],objects:{"":{Admin:[2,0,1,""],AuthButton:[5,1,1,""],BarChart:[3,0,1,""],ChangePassword:[5,0,1,""],Count:[4,0,1,""],DeAuthButton:[5,1,1,""],Edit:[4,0,1,""],Functions:[2,0,1,""],LastFM:[5,0,1,""],Lock:[2,0,1,""],MusicTools:[1,0,1,""],NewPlaylist:[4,0,1,""],NewTag:[6,0,1,""],PieChart:[3,0,1,""],PlaylistCard:[4,0,1,""],PlaylistGrid:[4,0,1,""],Playlists:[4,0,1,""],PlaylistsView:[4,0,1,""],ReferenceEntry:[4,1,1,""],Row:[2,1,1,""],Settings:[5,0,1,""],SpotifyLink:[5,0,1,""],TagCard:[6,1,1,""],TagGrid:[6,1,1,""],TagList:[6,0,1,""],TagRouter:[6,0,1,""],TagView:[6,0,1,""],TaskType:[2,1,1,""],Tasks:[2,0,1,""],getPlaylistLink:[4,1,1,""],getTagLink:[6,1,1,""],music:[8,3,0,"-"]},"PlaylistRouter.View":{handleChange:[4,1,1,""]},"music.api":{admin:[9,3,0,"-"],api:[9,3,0,"-"],decorators:[9,3,0,"-"],fm:[9,3,0,"-"],player:[9,3,0,"-"],spotfm:[9,3,0,"-"],spotify:[9,3,0,"-"],tag:[9,3,0,"-"]},"music.api.admin":{get_tasks:[9,4,1,""]},"music.api.api":{all_playlists_route:[9,4,1,""],all_users_route:[9,4,1,""],change_password:[9,4,1,""],image:[9,4,1,""],playlist_get_delete_route:[9,4,1,""],playlist_post_put_route:[9,4,1,""],run_playlist:[9,4,1,""],run_playlist_task:[9,4,1,""],run_user:[9,4,1,""],run_user_task:[9,4,1,""],run_users:[9,4,1,""],user_route:[9,4,1,""]},"music.api.decorators":{admin_required:[9,4,1,""],check_dict:[9,4,1,""],cloud_task:[9,4,1,""],gae_cron:[9,4,1,""],is_basic_authed:[9,4,1,""],is_logged_in:[9,4,1,""],lastfm_username_required:[9,4,1,""],login_or_basic_auth:[9,4,1,""],login_required:[9,4,1,""],spotify_link_required:[9,4,1,""],validate_args:[9,4,1,""],validate_json:[9,4,1,""]},"music.api.fm":{daily_scrobbles:[9,4,1,""]},"music.api.player":{next_track:[9,4,1,""],play:[9,4,1,""],shuffle:[9,4,1,""],volume:[9,4,1,""]},"music.api.spotfm":{count:[9,4,1,""],playlist_refresh:[9,4,1,""],run_playlist_album_task:[9,4,1,""],run_playlist_artist_task:[9,4,1,""],run_playlist_track_task:[9,4,1,""],run_user:[9,4,1,""],run_user_task:[9,4,1,""],run_users:[9,4,1,""]},"music.api.spotify":{sort:[9,4,1,""]},"music.api.tag":{delete_tag:[9,4,1,""],get_tag:[9,4,1,""],post_tag:[9,4,1,""],put_tag:[9,4,1,""],run_tag_task:[9,4,1,""],tag_refresh:[9,4,1,""],tag_route:[9,4,1,""],tags:[9,4,1,""]},"music.auth":{auth:[10,3,0,"-"]},"music.auth.auth":{auth:[10,4,1,""],deauth:[10,4,1,""],login:[10,4,1,""],logout:[10,4,1,""],register:[10,4,1,""],token:[10,4,1,""]},"music.cloud":{"function":[11,3,0,"-"],offload_or_run_user_playlist:[11,4,1,""],queue_run_user_playlist:[11,4,1,""],tasks:[11,3,0,"-"]},"music.cloud.function":{run_user_playlist_function:[11,4,1,""],update_tag:[11,4,1,""]},"music.cloud.tasks":{refresh_all_user_playlist_stats:[11,4,1,""],refresh_playlist_task:[11,4,1,""],refresh_user_playlist_stats:[11,4,1,""],refresh_user_stats_task:[11,4,1,""],run_user_playlist_task:[11,4,1,""],update_all_user_playlists:[11,4,1,""],update_all_user_tags:[11,4,1,""],update_playlists:[11,4,1,""]},"music.db":{database:[12,3,0,"-"],part_generator:[12,3,0,"-"]},"music.db.database":{DatabaseUser:[12,5,1,""],get_authed_lastfm_network:[12,4,1,""],get_authed_spotify_network:[12,4,1,""],refresh_token_database_callback:[12,4,1,""]},"music.db.database.DatabaseUser":{user_id:[12,6,1,""]},"music.db.part_generator":{PartGenerator:[12,5,1,""]},"music.db.part_generator.PartGenerator":{get_recursive_parts:[12,7,1,""],process_reference_by_name:[12,7,1,""],process_reference_by_reference:[12,7,1,""],reset:[12,7,1,""]},"music.model":{config:[13,3,0,"-"],playlist:[13,3,0,"-"],tag:[13,3,0,"-"],user:[13,3,0,"-"]},"music.model.config":{Config:[13,5,1,""]},"music.model.config.Config":{Meta:[13,5,1,""],collection:[13,6,1,""],collection_name:[13,6,1,""],last_fm_client_id:[13,6,1,""],playlist_cloud_operating_mode:[13,6,1,""],secret_key:[13,6,1,""],spotify_client_id:[13,6,1,""],spotify_client_secret:[13,6,1,""]},"music.model.config.Config.Meta":{collection_name:[13,6,1,""]},"music.model.playlist":{Playlist:[13,5,1,""],Sort:[13,5,1,""]},"music.model.playlist.Playlist":{Meta:[13,5,1,""],add_last_month:[13,6,1,""],add_this_month:[13,6,1,""],chart_limit:[13,6,1,""],chart_range:[13,6,1,""],collection:[13,6,1,""],collection_name:[13,6,1,""],day_boundary:[13,6,1,""],description_overwrite:[13,6,1,""],description_suffix:[13,6,1,""],include_library_tracks:[13,6,1,""],include_recommendations:[13,6,1,""],last_updated:[13,6,1,""],lastfm_stat_album_count:[13,6,1,""],lastfm_stat_album_percent:[13,6,1,""],lastfm_stat_artist_count:[13,6,1,""],lastfm_stat_artist_percent:[13,6,1,""],lastfm_stat_count:[13,6,1,""],lastfm_stat_last_refresh:[13,6,1,""],lastfm_stat_percent:[13,6,1,""],mutable_keys:[13,6,1,""],name:[13,6,1,""],parts:[13,6,1,""],playlist_references:[13,6,1,""],recommendation_sample:[13,6,1,""],shuffle:[13,6,1,""],sort:[13,6,1,""],to_dict:[13,7,1,""],type:[13,6,1,""],uri:[13,6,1,""]},"music.model.playlist.Playlist.Meta":{collection_name:[13,6,1,""]},"music.model.playlist.Sort":{"default":[13,6,1,""],release_date:[13,6,1,""],shuffle:[13,6,1,""]},"music.model.tag":{Tag:[13,5,1,""]},"music.model.tag.Tag":{Meta:[13,5,1,""],albums:[13,6,1,""],artists:[13,6,1,""],collection:[13,6,1,""],collection_name:[13,6,1,""],count:[13,6,1,""],last_updated:[13,6,1,""],name:[13,6,1,""],proportion:[13,6,1,""],tag_id:[13,6,1,""],time_objects:[13,6,1,""],to_dict:[13,7,1,""],total_time:[13,6,1,""],total_time_ms:[13,6,1,""],total_user_scrobbles:[13,6,1,""],tracks:[13,6,1,""],username:[13,6,1,""]},"music.model.tag.Tag.Meta":{collection_name:[13,6,1,""]},"music.model.user":{User:[13,5,1,""]},"music.model.user.User":{Meta:[13,5,1,""],access_token:[13,6,1,""],check_password:[13,7,1,""],collection:[13,6,1,""],collection_name:[13,6,1,""],email:[13,6,1,""],last_login:[13,6,1,""],last_refreshed:[13,6,1,""],lastfm_username:[13,6,1,""],locked:[13,6,1,""],password:[13,6,1,""],refresh_token:[13,6,1,""],spotify_linked:[13,6,1,""],to_dict:[13,7,1,""],token_expiry:[13,6,1,""],type:[13,6,1,""],username:[13,6,1,""],validated:[13,6,1,""]},"music.model.user.User.Meta":{collection_name:[13,6,1,""]},"music.music":{create_app:[8,4,1,""]},"music.tasks":{create_playlist:[14,3,0,"-"],refresh_lastfm_stats:[14,3,0,"-"],run_user_playlist:[14,3,0,"-"],update_tag:[14,3,0,"-"]},"music.tasks.create_playlist":{create_playlist:[14,4,1,""]},"music.tasks.refresh_lastfm_stats":{refresh_lastfm_album_stats:[14,4,1,""],refresh_lastfm_artist_stats:[14,4,1,""],refresh_lastfm_track_stats:[14,4,1,""]},"music.tasks.run_user_playlist":{run_user_playlist:[14,4,1,""]},"music.tasks.update_tag":{update_tag:[14,4,1,""]},Admin:{handleChange:[2,1,1,""]},BarChart:{componentDidMount:[3,1,1,""],componentDidUpdate:[3,1,1,""]},ChangePassword:{handleCurrentChange:[5,1,1,""],handleNew2Change:[5,1,1,""],handleNewChange:[5,1,1,""],handleSubmit:[5,1,1,""]},Count:{Count:[4,2,1,""],getUserInfo:[4,1,1,""],updateStats:[4,1,1,""]},Edit:{BlockGridItem:[4,1,1,""],Edit:[4,2,1,""],ListBlock:[4,1,1,""],componentDidMount:[4,1,1,""],getPlaylistInfo:[4,1,1,""],getPlaylists:[4,1,1,""],handleAddPart:[4,1,1,""],handleAddReference:[4,1,1,""],handleCheckChange:[4,1,1,""],handleInputChange:[4,1,1,""],handleRemovePart:[4,1,1,""],handleRemoveReference:[4,1,1,""],handleRun:[4,1,1,""],makeNetworkUpdate:[4,1,1,""]},Functions:{runAllUsers:[2,1,1,""],runStats:[2,1,1,""]},LastFM:{getUserInfo:[5,1,1,""],handleChange:[5,1,1,""],handleSubmit:[5,1,1,""]},Lock:{getUserInfo:[2,1,1,""],handleLock:[2,1,1,""]},MusicTools:{componentDidMount:[1,1,1,""],componentWillUnmount:[1,1,1,""],getUserInfo:[1,1,1,""],setOpen:[1,1,1,""]},NewPlaylist:{componentDidMount:[4,1,1,""],handleInputChange:[4,1,1,""],handleSubmit:[4,1,1,""],setDescription:[4,1,1,""]},NewTag:{handleInputChange:[6,1,1,""],handleSubmit:[6,1,1,""]},PieChart:{componentDidMount:[3,1,1,""],componentDidUpdate:[3,1,1,""]},PlaylistRouter:{View:[4,0,1,""]},PlaylistsView:{getPlaylists:[4,1,1,""],handleDeletePlaylist:[4,1,1,""],handleRunAll:[4,1,1,""],handleRunPlaylist:[4,1,1,""]},Settings:{handleChange:[5,1,1,""]},SpotifyLink:{getUserInfo:[5,1,1,""]},TagList:{getTags:[6,1,1,""],handleDeleteTag:[6,1,1,""]},TagView:{componentDidMount:[6,1,1,""],getTag:[6,1,1,""],handleAdd:[6,1,1,""],handleChangeAddType:[6,1,1,""],handleCheckChange:[6,1,1,""],handleInputChange:[6,1,1,""],handleRemoveObj:[6,1,1,""],handleRun:[6,1,1,""],makeNetworkUpdate:[6,1,1,""]},Tasks:{getTasks:[2,1,1,""]},music:{api:[9,3,0,"-"],auth:[10,3,0,"-"],cloud:[11,3,0,"-"],db:[12,3,0,"-"],init_log:[8,4,1,""],model:[13,3,0,"-"],music:[8,3,0,"-"],tasks:[14,3,0,"-"]}},objnames:{"0":["js","class","JavaScript class"],"1":["js","function","JavaScript function"],"2":["js","attribute","JavaScript attribute"],"3":["py","module","Python module"],"4":["py","function","Python function"],"5":["py","class","Python class"],"6":["py","attribute","Python attribute"],"7":["py","method","Python method"]},objtypes:{"0":"js:class","1":"js:function","2":"js:attribute","3":"py:module","4":"py:function","5":"py:class","6":"py:attribute","7":"py:method"},terms:{"class":[1,2,3,4,5,6,12,13],"default":[9,11,13,14],"enum":13,"function":[0,1,7,8,12,13,14],"int":11,"long":[11,14],"new":[1,2,5,7,14],"return":[2,4,5,6,8,9,10,12,13,14],"true":6,Adding:12,For:[4,14],The:0,Used:12,access_token:[12,13],account:[2,5,14],action:4,add:6,add_last_month:13,add_this_month:13,adding:[4,6],addtyp:6,admin:[0,1,7,8],admin_requir:9,again:5,album:[6,13],all:[0,2,4,9,11],all_playlists_rout:9,all_users_rout:9,allow:10,api:[0,1,2,4,5,6,7,8],app:[0,1,8,9,13,14],appli:3,arg:[4,5,9,13],argument:[1,2,4,5,6],artist:[6,13],asid:12,attributeerror:14,auth:[0,7,8],authbutton:5,authent:[5,12],avail:14,axio:0,backend:[0,7],bar:[1,7],barchart:3,base:[0,12,13],between:6,blockgriditem:4,blueprint:[8,9],bool:1,box:[4,5,6],button:[2,4,5],callback:12,cancel:1,card:[1,2,5,7],cell:[2,4],chang:[1,2,4,6,7],change_password:9,changepassword:5,chart:[1,7],chart_limit:13,chart_rang:13,check:4,check_dict:9,check_password:13,checkbox:[4,6],click:5,client_id:12,client_secret:12,cloud:[0,7,8,12,13],cloud_task:9,code:11,collect:13,collection_nam:13,compnent:2,compon:[0,1,2,3,4,5,6,12],componentdidmount:[1,3,4,6],componentdidupd:3,componentwillunmount:1,compos:0,config:[7,8],consol:8,contain:[4,8,13],content:[0,7,8],convert:13,correct:13,count:[4,9,13],creat:[0,8,11,14],create_app:8,create_playlist:[7,8],credemti:12,credenti:12,current:[0,5],daily_scrobbl:9,data:[2,3,4,5,6,13],databas:[7,8],databaseus:12,day_boundari:13,deauth:10,deauthbutton:5,deauthent:5,decor:[7,8],delai:11,delet:[4,6],delete_tag:9,depend:[11,12],descript:[4,9,13,14],description_overwrit:13,description_suffix:13,determin:13,dict:13,dictionari:[4,6],direct:6,dispatch:0,divert:4,document:12,documentrefer:12,done:13,down:6,drawer:1,drop:6,dropbox:4,dure:4,edit:[1,7],email:13,endpoint:[9,10],entri:4,enumer:13,environ:11,error:[6,14],error_toast:6,event:[2,4,5,6],execut:11,expected_arg:9,fals:8,fireo:[0,13],firestor:[12,13],firestore_v1:12,flask:[0,7,9],fmframework:[0,12,14],fmnet:14,fmnetwork:12,from:[1,2,3,4,5,6,12],frontend:[0,7],fullplaylist:14,func:9,gae_cron:9,gcp:11,gener:[8,14],get:[1,2,4,5,6,10,12],get_authed_lastfm_network:12,get_authed_spotify_network:12,get_recursive_part:12,get_tag:9,get_task:9,getplaylist:4,getplaylistinfo:4,getplaylistlink:4,gettag:6,gettaglink:6,gettask:2,getuserinfo:[1,2,4,5],given:[4,9,11,12],googl:[0,12],grid:[2,4,6],hand:11,handl:[2,4,5,6,12],handleadd:6,handleaddpart:4,handleaddrefer:4,handlechang:[2,4,5],handlechangeaddtyp:6,handlecheckchang:[4,6],handlecurrentchang:5,handledeleteplaylist:4,handledeletetag:6,handleinputchang:[4,6],handlelock:2,handlenew2chang:5,handlenewchang:5,handleremoveobj:6,handleremovepart:4,handleremoverefer:4,handlerun:[4,6],handlerunal:4,handlerunplaylist:4,handlesubmit:[4,5,6],has:[4,14],home:10,host:[0,2,4,5],html:10,http:[0,9,10],imag:9,includ:[4,10,11,14],include_library_track:13,include_recommend:13,index:0,info:[1,4,5,6],infor:2,infrastuctur:11,init:4,init_log:8,initi:4,initialis:8,input:[4,5,6],interfac:[0,12],intern:12,is_basic_auth:9,is_logged_in:9,kei:13,kwarg:[9,13],last:[0,1,4,7,14],last_fm_client_id:13,last_login:13,last_refresh:13,last_upd:13,lastfm:5,lastfm_stat_album_count:13,lastfm_stat_album_perc:13,lastfm_stat_artist_count:13,lastfm_stat_artist_perc:13,lastfm_stat_count:13,lastfm_stat_last_refresh:13,lastfm_stat_perc:13,lastfm_usernam:13,lastfm_username_requir:9,layer:[0,12,13],level:[4,8,13],link:[1,4,7],list:[1,7,12],listblock:4,listen:4,load:[1,3,4,6,8,9],lock:[1,7,13],log:8,login:10,login_or_basic_auth:9,login_requir:9,logout:10,longer:0,main:4,make:[2,4,5,6],makenetworkupd:[4,6],manag:[4,13],map:6,match:4,materi:0,math:[0,1,7],meta:13,model:[0,7,8,12,14],modul:0,music:4,music_obj:6,musictool:1,mutable_kei:13,name:[4,6,11,12,13,14],nameerror:14,net:[12,14],network:[5,6,12,14],networkus:12,newli:12,newplaylist:4,newtag:6,newvalu:[2,4,5],next_track:9,none:[9,11,12,13,14],noth:6,object:[4,5,6,12,13,14],off:11,offload_or_run_user_playlist:11,open:1,oper:[11,13,14],option:[4,9,11,12,14],orm:[0,12,13],other:12,page:[0,4,10],paramet:[9,11,12,13,14],part:[6,13],part_gener:[7,8],partgener:12,password:[1,7,10,13],path:13,pie:[1,7],piechart:3,plai:9,platform:0,player:[7,8],playlist:[0,1,2,7,8,9,11,12,14],playlist_cloud_operating_mod:13,playlist_get_delete_rout:9,playlist_nam:[11,14],playlist_post_put_rout:9,playlist_refer:13,playlist_refresh:9,playlistcard:4,playlistgrid:4,playlistnam:4,playlistrout:4,playlistsview:4,post:[4,5,10],post_tag:9,present:4,process_reference_by_nam:12,process_reference_by_refer:12,prop:[1,2,3,4,5,6],properti:[3,4,5,6],proport:13,provid:14,put:6,put_tag:9,queue:11,queue_run_user_playlist:11,rais:14,react:[0,3,7],readi:8,recommendation_sampl:13,recurs:12,redirect:10,ref:12,refer:4,referenc:12,referenceentri:4,refresh:[4,6,11],refresh_all_user_playlist_stat:11,refresh_lastfm_album_stat:14,refresh_lastfm_artist_stat:14,refresh_lastfm_stat:[7,8],refresh_lastfm_track_stat:14,refresh_playlist_task:11,refresh_token:[12,13],refresh_token_database_callback:12,refresh_user_playlist_stat:11,refresh_user_stats_task:11,regist:10,relat:10,release_d:13,remov:[4,6],request:[0,1,2,4,5,6,10],request_param:9,reset:[10,12],resolut:12,resolv:12,respons:[9,10],result:[4,10],retriev:[8,9,10,12,14],root:[0,1,7],rout:10,router:[1,7],row:2,run:[2,4,8,11,14],run_playlist:9,run_playlist_album_task:9,run_playlist_artist_task:9,run_playlist_task:9,run_playlist_track_task:9,run_tag_task:9,run_us:9,run_user_playlist:[7,8],run_user_playlist_funct:11,run_user_playlist_task:11,run_user_task:9,runallus:2,runstat:2,search:0,second:11,secret_kei:13,secur:10,send:4,server:0,serverless:11,servic:13,set:[0,1,4,7,13],setdescript:4,setopen:1,show:6,shuffl:[9,13],side:1,smart:[0,4,12,13,14],sort:[4,9,13],spotfm:[7,8],spotframework:[0,12,14],spotifi:[0,1,4,7,8,12,14],spotify_client_id:13,spotify_client_secret:13,spotify_link:13,spotify_link_requir:9,spotify_us:13,spotifylink:5,spotifynetwork:12,spotnet:14,spotnetwork:14,stack:8,stat:[1,2,7,11],state:[1,2,4,5,6,12],statist:4,statu:5,store:12,str:[11,12,14],string:4,structur:[4,5,13],subject:[2,4,6,11,12,14],submiss:10,submit:[5,6],tab:[2,4,5],tag:[0,1,7,8,11,14],tag_id:[6,9,11,13],tag_refresh:9,tag_rout:9,tagcard:6,taggrid:6,taglist:6,tagnam:6,tagrout:6,tagview:6,target:2,task:[0,1,7,8,13],tasktyp:2,time_object:13,to_dict:13,to_stat:2,toast:6,token:10,token_expiri:13,tool:[4,8,12],top:[4,8],total_tim:13,total_time_m:13,total_user_scrobbl:13,track:[6,13],trigger:4,type:[4,6,8,9,10,12,13,14],upad:14,updat:[3,4,6,11,12,13,14],update_all_user_playlist:11,update_all_user_tag:11,update_playlist:11,update_tag:[7,8,11],updatestat:4,uri:[13,14],url:[4,6],user:[1,2,4,5,7,8,9,11,12,14],user_id:12,user_rout:9,usernam:[1,2,4,7,11,12,13,14],using:3,valid:[4,5,6,13],validate_arg:9,validate_json:9,valu:[4,13],view:[1,7],volum:9,walk:12,watch:[4,6],web:0,when:[12,14],whether:[1,6,13],wrap:[2,4]},titles:["Music Tools","React Frontend","Admin","Maths","Playlist","Settings","Tag","Music Tools Modules","Flask Backend","music.api","music.auth","music.cloud","music.db","music.model","music.tasks"],titleterms:{"function":[2,11],"new":[4,6],admin:[2,9],api:9,auth:10,backend:8,bar:3,card:[4,6],chang:5,chart:3,cloud:11,config:13,content:[9,10,11,12,13,14],create_playlist:14,databas:12,decor:9,edit:[4,6],flask:8,frontend:1,indic:0,last:5,link:5,list:[4,6],lock:2,math:3,model:13,modul:[7,8,9,10,11,12,13,14],music:[0,7,8,9,10,11,12,13,14],part_gener:12,password:5,pie:3,player:9,playlist:[4,13],react:1,refresh_lastfm_stat:14,root:8,router:[2,4,5,6],run_user_playlist:14,set:5,spotfm:9,spotifi:[5,9],stat:4,tabl:0,tag:[6,9,13],task:[2,11,14],tool:[0,7],update_tag:14,user:13,usernam:5,view:[4,6]}}) \ No newline at end of file diff --git a/src/MusicTools.Admin.html b/src/MusicTools.Admin.html new file mode 100644 index 0000000..8c0f9f0 --- /dev/null +++ b/src/MusicTools.Admin.html @@ -0,0 +1,259 @@ + + + + + + + + + Admin — Music Tools documentation + + + + + + + + + + + + + + + + + + + +
      +
      +
      + + +
      + +
      +

      Admin

      +
      +

      Router

      +
      +
      +class Admin(props)
      +

      Admin router component for hosting cards

      +
      +
      +Admin.handleChange(e, newValue)
      +

      Handle tab change event

      +
      +
      Arguments
      +
        +
      • e (*) – Event data

      • +
      • newValue (*) – New tab data

      • +
      +
      +
      +
      + +
      + +
      +
      +

      Lock

      +
      +
      +class Lock(props)
      +

      Account lock card component

      +
      +
      +Lock.getUserInfo()
      +

      Make user infor request of API

      +
      + +
      +
      +Lock.handleLock(event, username, to_state)
      +

      Make lock request of API

      +
      +
      Arguments
      +
        +
      • event (*) – Event data

      • +
      • username (*) – Subject username

      • +
      • to_state (*) – Target lock state

      • +
      +
      +
      +
      + +
      + +
      +
      +Row(props)
      +

      Grid of account cards with lock buttons

      +
      +
      Arguments
      +
        +
      • props (*) –

      • +
      +
      +
      Returns
      +

      Card component wrapped in grid cell

      +
      +
      +
      + +
      +
      +

      Functions

      +
      +
      +class Functions(props)
      +

      Admin functions card component

      +
      +
      +Functions.runAllUsers(event)
      +

      Make run all playlists request of API

      +
      +
      Arguments
      +
        +
      • event (*) – Event data

      • +
      +
      +
      +
      + +
      +
      +Functions.runStats(event)
      +

      Make run stats request of API

      +
      +
      Arguments
      +
        +
      • event (*) – Event data

      • +
      +
      +
      +
      + +
      + +
      +
      +

      Tasks

      +
      +
      +class Tasks(props)
      +

      Running tasks card component

      +
      +
      +Tasks.getTasks()
      +

      Get tasks from API

      +
      + +
      + +
      +
      +TaskType(props)
      +

      Grid of task cards

      +
      +
      Arguments
      +
        +
      • props (*) –

      • +
      +
      +
      Returns
      +

      Card compnent wrapped in grid cell

      +
      +
      +
      + +
      +
      + + +
      + +
      +
      + +
      +
      + + + + + + + \ No newline at end of file diff --git a/src/MusicTools.Maths.html b/src/MusicTools.Maths.html new file mode 100644 index 0000000..07d055f --- /dev/null +++ b/src/MusicTools.Maths.html @@ -0,0 +1,166 @@ + + + + + + + + + Maths — Music Tools documentation + + + + + + + + + + + + + + + + + + + +
      +
      +
      + + +
      + +
      +

      Maths

      +
      +

      Bar Chart

      +
      +
      +class BarChart(props)
      +

      Bar chart component using Chart.js

      +
      +
      +BarChart.componentDidMount()
      +

      Load data from react properties

      +
      + +
      +
      +BarChart.componentDidUpdate()
      +

      Re-apply data to chart on update

      +
      + +
      + +
      +
      +

      Pie Chart

      +
      +
      +class PieChart(props)
      +

      Pie chart component using Chart.js

      +
      +
      +PieChart.componentDidMount()
      +

      Load data from react properties

      +
      + +
      +
      +PieChart.componentDidUpdate()
      +

      Re-apply data to chart on update

      +
      + +
      + +
      +
      + + +
      + +
      +
      + +
      +
      + + + + + + + \ No newline at end of file diff --git a/src/MusicTools.MusicTools.html b/src/MusicTools.MusicTools.html deleted file mode 100644 index 5aeb057..0000000 --- a/src/MusicTools.MusicTools.html +++ /dev/null @@ -1,158 +0,0 @@ - - - - - - - - - MusicTools — Music Tools documentation - - - - - - - - - - - - - - - - - - - -
      -
      -
      - - -
      - -
      -

      MusicTools

      -
      -
      -class MusicTools(props)
      -

      Root component for app

      -
      -
      -MusicTools.componentDidMount()
      -

      Get user info from API on load

      -
      - -
      -
      -MusicTools.componentWillUnmount()
      -

      Cancel get user info request

      -
      - -
      -
      -MusicTools.getUserInfo()
      -

      Get user info from API

      -
      - -
      -
      -MusicTools.setOpen(bool)
      -

      Set whether side app drawer is open

      -
      -
      Arguments
      -
        -
      • bool (*) – Open state of side drawer

      • -
      -
      -
      -
      - -
      - -
      - - -
      - -
      -
      - -
      -
      - - - - - - - \ No newline at end of file diff --git a/src/MusicTools.Playlist.html b/src/MusicTools.Playlist.html index 71190fe..f0d4573 100644 --- a/src/MusicTools.Playlist.html +++ b/src/MusicTools.Playlist.html @@ -16,7 +16,7 @@ - + @@ -43,9 +43,30 @@

      Router for playlist lists page, includes new playlist page

      +

      For managing playlists list pages for diverting to new playlist page

      +
      +
      +class PlaylistRouter.View(props)
      +

      Playlist view structure with tabs for view/editing and statistics

      +
      +
      +PlaylistRouter.View.handleChange(e, newValue)
      +

      Handle tab change event

      +
      +
      Arguments
      +
        +
      • e (*) – Event args

      • +
      • newValue (*) – New tab object

      • +
      +
      +
      +
      + +
      + -
      -

      Playlists List

      +
      +

      Cards List

      class PlaylistsView(props)
      @@ -210,31 +231,8 @@
      -
      -

      Playlist Router

      -
      -
      -class PlaylistRouter.View(props)
      -

      Playlist view structure with tabs for view/editing and statistics

      -
      -
      -PlaylistRouter.View.handleChange(e, newValue)
      -

      Handle tab change event

      -
      -
      Arguments
      -
        -
      • e (*) – Event args

      • -
      • newValue (*) – New tab object

      • -
      -
      -
      -
      - -
      - -
      -
      -

      Playlist View

      +
      +

      View/Edit Card

      class Edit()
      @@ -429,8 +427,8 @@
      -
      -

      Playlist Stats View

      +
      +

      Stats Card

      class Count()
      @@ -476,28 +474,31 @@

      Navigation

      Contents:

      Related Topics

      -
      -

      Tags List

      +
      +

      Cards List

      class TagList(props)
      @@ -154,6 +155,125 @@
      +
      +
      +

      View/Edit Tag

      +
      +
      +class TagView(props)
      +

      Tag View card

      +
      +
      +TagView.componentDidMount()
      +

      Get tag info from API on load

      +
      + +
      +
      +TagView.getTag(error_toast=true)
      +

      Get tag info from API

      +
      +
      Arguments
      +
        +
      • error_toast (*) – Whether to show toast on network error

      • +
      +
      +
      +
      + +
      +
      +TagView.handleAdd()
      +

      Validate input, make tag part add request of API

      +
      +
      Returns
      +

      Nothing

      +
      +
      +
      + +
      +
      +TagView.handleChangeAddType(type)
      +

      Handle adding type drop down change

      +
      +
      Arguments
      +
        +
      • type (*) –

      • +
      +
      +
      +
      + +
      +
      +TagView.handleCheckChange(event)
      +

      Handle checkbox state changes, make network updates

      +
      +
      Arguments
      +
        +
      • event (*) – Event data

      • +
      +
      +
      +
      + +
      +
      +TagView.handleInputChange(event)
      +

      Handle input box state changes

      +
      +
      Arguments
      +
        +
      • event (*) – Event data

      • +
      +
      +
      +
      + +
      +
      +TagView.handleRemoveObj(music_obj, addType, event)
      +

      Handle remove watched part

      +
      +
      Arguments
      +
        +
      • music_obj (*) – Subject object to remove

      • +
      • addType (*) – Object type (tracks/albums/artists)

      • +
      • event (*) – Event data

      • +
      +
      +
      +
      + +
      +
      +TagView.handleRun(event)
      +

      Validate input and make tag refresh update of API

      +
      +
      Arguments
      +
        +
      • event (*) –

      • +
      +
      +
      +
      + +
      +
      +TagView.makeNetworkUpdate(changes)
      +

      Put tag info changes to API

      +
      +
      Arguments
      +
        +
      • changes (*) – Dictionary of changes to submit

      • +
      +
      +
      +
      + +
      +
      @@ -176,25 +296,29 @@

      Navigation

      Contents:

      Related Topics