From 5659f2c4d7305d13e8a420ff11ea0754764b14f4 Mon Sep 17 00:00:00 2001 From: Xevion Date: Sun, 27 Oct 2019 19:17:53 -0500 Subject: [PATCH] README.md with update to requirements --- README.md | 61 +++++++++++++++++++++++++++++++++++++++++++++++ graph.png | Bin 0 -> 35097 bytes main.py | 1 + process.py | 6 ++--- requirements.txt | 16 ++++++------- 5 files changed, 72 insertions(+), 12 deletions(-) create mode 100644 README.md create mode 100644 graph.png diff --git a/README.md b/README.md new file mode 100644 index 0000000..5c62c5c --- /dev/null +++ b/README.md @@ -0,0 +1,61 @@ +# spotify-data + +## About + +The purpose of this repository/project is to capture my liked songs from my Spotify account, and then create a stacked bar graph representing my explicit vs non explicit songs. + +Yes, the project is super simple and doesn't have that much usefulness, but it's the first time I've genuinely used `matplotlib` or `logger` in a serious context and it was definitely interesting. + +## Demonstration + +![Output Matplotlib Stacked Bar-graph](./graph.png) + +```python +> python main.py +INFO:root:Pulling data from Spotify +INFO:root:Authorizing with Spotify via Spotipy +WARNING:root:May require User Interaction to authenticate properly! +INFO:root:Authorized with Spotify via Spotipy +WARNING:root:Clearing all files in tracks folder for new files +INFO:root:Cleared folder, ready to download new track files +INFO:root:Requesting 0 to 50 +INFO:root:Received 0 to 50 +INFO:root:Saved at "\tracks\saved-tracks-0-50.json" (150K) +INFO:root:Requesting 50 to 100 +INFO:root:Received 50 to 100 +INFO:root:Saved at "\tracks\saved-tracks-50-100.json" (151K) +INFO:root:Requesting 100 to 150 +INFO:root:Received 100 to 150 +INFO:root:Saved at "\tracks\saved-tracks-100-150.json" (146K) +INFO:root:Requesting 150 to 200 +INFO:root:Received 150 to 200 +INFO:root:Saved at "\tracks\saved-tracks-150-200.json" (147K) +............................................................... +INFO:root:Requesting 850 to 900 +INFO:root:Received 850 to 900 +INFO:root:Saved at "\tracks\saved-tracks-850-900.json" (143K) +INFO:root:Requesting 900 to 950 +INFO:root:Received 900 to 919 +INFO:root:Saved at "\tracks\saved-tracks-900-919.json" (55K) +INFO:root:Requested and saved 919 tracks split over 19 files (2 MB) +INFO:root:Reading track files +INFO:root:Read and parse 19 track files +INFO:root:Combining into single track file for ease of access +INFO:root:File combined with 919 items +INFO:root:Processing file... +INFO:root:Processed data, creating plot from data +INFO:root:Saving the figure to the 'export' folder +INFO:root:Showing plot to User +INFO:root:Done +> +``` + +# Requirements + +The requirements for this project are outlined in the [requirements.txt](requirements.txt) file. + +You can use the `pip` tool to instantly download and install all required modules via `pip install -r requirements.txt`. + +## License + +This project uses the GNU General Public License, see the [LICENSE](./LICENSE) file for more information. \ No newline at end of file diff --git a/graph.png b/graph.png new file mode 100644 index 0000000000000000000000000000000000000000..4fb051dabff9e67e0cdaaac2428fc61f9ca8e5f3 GIT binary patch literal 35097 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 UcqC`@m?aY9xuynjv+Z{M4@gUyng9R* literal 0 HcmV?d00001 diff --git a/main.py b/main.py index 7fc7675..c4b2a73 100644 --- a/main.py +++ b/main.py @@ -27,4 +27,5 @@ def refresh(): logging.info('Spotify data deemed to be recent enough (under {} seconds old)'.format(cache['expires_in'])) else: pull.main() + main() \ No newline at end of file diff --git a/process.py b/process.py index 66806a5..90c1535 100644 --- a/process.py +++ b/process.py @@ -104,7 +104,7 @@ def copy(months, safe, explicit): ])) def main(): - logging.basicConfig(level=logging.INFO) + # logging.basicConfig(level=logging.INFO) logging.info("Reading track files") files = get_files() logging.info(f"Read and parse {len(files)} track files") @@ -113,6 +113,4 @@ def main(): data.sort(key=lambda item : dateutil.parser.parse(item['added_at']).timestamp(), reverse=True) logging.info(f'File combined with {len(data)} items') logging.info('Processing file...') - process_data(data) - -main() \ No newline at end of file + process_data(data) \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index 2603974..09af153 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,8 +1,8 @@ -hurry.filesize==0.9 -pyperclip==1.7.0 -numpy==1.17.3 -spotipy==2.4.4 -matplotlib==3.1.1 -Pillow==6.2.1 -python_dateutil==2.8.0 -hurry==1.1 +hurry.filesize +pyperclip +numpy +spotipy +matplotlib +Pillow +python_dateutil +hurry \ No newline at end of file