From 679bcdd633b69ea077527e6843a52bcbab014662 Mon Sep 17 00:00:00 2001 From: Nitemice Date: Sun, 4 Oct 2020 16:37:59 +1100 Subject: [PATCH 1/4] Fix simple and csv export JSON needs an array to append into. CSV was misspelt. Also fixed extra newlines being added to CSV file on Windows. --- lastfm_backup.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lastfm_backup.py b/lastfm_backup.py index 2d229e0..db49766 100755 --- a/lastfm_backup.py +++ b/lastfm_backup.py @@ -6,7 +6,7 @@ import os.path import requests __author__ = 'Alexander Popov' -__version__ = '2.0.0' +__version__ = '2.0.1' __license__ = 'Unlicense' @@ -64,7 +64,7 @@ def scrobbling_export(tracks, username, export_format='is as'): f.write(data) elif export_format == 'simple': - _ = {} + _ = [] for track in tracks: _.append([ @@ -76,7 +76,7 @@ def scrobbling_export(tracks, username, export_format='is as'): sort_keys=True, ensure_ascii=False) f.write(data) - elif export_format == 'cvs': + elif export_format == 'csv': _ = [] for track in tracks: @@ -86,7 +86,7 @@ def scrobbling_export(tracks, username, export_format='is as'): int(track['date']['uts']) ]) - with open('%s.csv' % (username), 'w', encoding='utf-8') as f: + with open('%s.csv' % (username), 'w', encoding='utf-8', newline='') as f: data = csv.writer(f, quoting=csv.QUOTE_NONNUMERIC, delimiter=',') for row in _: data.writerow(row) From a0a84a212f763bf35fd286c07255c0c957a345d0 Mon Sep 17 00:00:00 2001 From: Nitemice Date: Sun, 4 Oct 2020 17:09:41 +1100 Subject: [PATCH 2/4] Added field names to export Added header row to CSV. Added field names for simple export. --- lastfm_backup.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/lastfm_backup.py b/lastfm_backup.py index db49766..d0f1341 100755 --- a/lastfm_backup.py +++ b/lastfm_backup.py @@ -6,7 +6,7 @@ import os.path import requests __author__ = 'Alexander Popov' -__version__ = '2.0.1' +__version__ = '2.1.0' __license__ = 'Unlicense' @@ -67,9 +67,10 @@ def scrobbling_export(tracks, username, export_format='is as'): _ = [] for track in tracks: - _.append([ - track['artist']['#text'], track['name'], track['date']['uts'] - ]) + _.append({'artist': track['artist']['#text'], + 'name': track['name'], + 'album': track['album']['#text'], + 'date': track['date']['uts']}) with open('%s.json' % (username), 'w', encoding='utf-8') as f: data = json.dumps(_, indent=4, @@ -78,6 +79,11 @@ def scrobbling_export(tracks, username, export_format='is as'): elif export_format == 'csv': _ = [] + _.append([ + 'artist', + 'track', + 'date' + ]) for track in tracks: _.append([ From abbf9df8728528a5f0a2f901fa8047a98b58c1f1 Mon Sep 17 00:00:00 2001 From: Nitemice Date: Sun, 4 Oct 2020 17:59:57 +1100 Subject: [PATCH 3/4] Minor export improvements Added album field to CSV. Write all records to CSV at once. Renamed "is as" export mode to "dump". It's more accurate and nicer with a single word. --- config.json.example | 2 +- lastfm_backup.py | 30 ++++++++++++++---------------- setup.py | 2 +- 3 files changed, 16 insertions(+), 18 deletions(-) diff --git a/config.json.example b/config.json.example index 3a25b32..c00263e 100644 --- a/config.json.example +++ b/config.json.example @@ -1,5 +1,5 @@ { "username" : "", "api_key" : "", - "export_format": "is as, simple, csv" + "export_format": "dump, simple, csv" } diff --git a/lastfm_backup.py b/lastfm_backup.py index d0f1341..8da87f5 100755 --- a/lastfm_backup.py +++ b/lastfm_backup.py @@ -54,10 +54,10 @@ def get_now_scrobbling(username, api_key): return(False) -def scrobbling_export(tracks, username, export_format='is as'): +def scrobbling_export(tracks, username, export_format='dump'): """ Save scrobbled track via various format """ - if export_format == 'is as': + if export_format == 'dump': with open('%s.json' % (username), 'w', encoding='utf-8') as f: data = json.dumps(tracks, indent=4, sort_keys=True, ensure_ascii=False) @@ -67,35 +67,33 @@ def scrobbling_export(tracks, username, export_format='is as'): _ = [] for track in tracks: - _.append({'artist': track['artist']['#text'], - 'name': track['name'], - 'album': track['album']['#text'], - 'date': track['date']['uts']}) + _.append({ + 'artist': track['artist']['#text'], + 'name': track['name'], + 'album': track['album']['#text'], + 'date': int(track['date']['uts']) + }) with open('%s.json' % (username), 'w', encoding='utf-8') as f: - data = json.dumps(_, indent=4, - sort_keys=True, ensure_ascii=False) + data = json.dumps(_, indent=4, sort_keys=True, ensure_ascii=False) f.write(data) elif export_format == 'csv': _ = [] - _.append([ - 'artist', - 'track', - 'date' - ]) for track in tracks: _.append([ track['artist']['#text'], track['name'], + track['album']['#text'], int(track['date']['uts']) ]) - with open('%s.csv' % (username), 'w', encoding='utf-8', newline='') as f: + with open('%s.csv' % (username), 'w', encoding='utf-8', + newline='') as f: data = csv.writer(f, quoting=csv.QUOTE_NONNUMERIC, delimiter=',') - for row in _: - data.writerow(row) + data.writerow(['artist', 'track', 'album', 'date']) + data.writerows(_) return(1) diff --git a/setup.py b/setup.py index a85c27a..3ccf0c4 100644 --- a/setup.py +++ b/setup.py @@ -17,5 +17,5 @@ setuptools.setup( classifiers=['License :: Public Domain', 'Programming Language :: Python :: 3', 'Operating System :: OS Independent'], - python_requires='>=3.0' + python_requires='>=3.2' ) From f799d31052754f10719640fcde329ee9628fe762 Mon Sep 17 00:00:00 2001 From: Nitemice Date: Sun, 4 Oct 2020 18:09:15 +1100 Subject: [PATCH 4/4] Improved README Fixed some spelling mistakes Added info on export formats --- README.md | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index f7df047..471ce8a 100644 --- a/README.md +++ b/README.md @@ -1,21 +1,26 @@ +# Last.fm Backup + ![Version](https://img.shields.io/pypi/v/lastfm-backup.svg?style=for-the-badge) ![License](https://img.shields.io/pypi/l/lastfm-backup.svg?style=for-the-badge) ![PyVersion](https://img.shields.io/pypi/pyversions/lastfm-backup.svg?style=for-the-badge) ### Features: -* simple -* three formats for export data +* Simple +* Three formats for export data: + 1. `dump` - JSON, direct from API + 2. `simple` - Artist, track name, album & date as JSON + 3. `csv` - Artist, track name, album & date as comma separated values ### How to use: * Stop scrobbling! -* [Get](http://www.last.fm/api/account/create) API Key. * Modify `config.json`. +* [Get API Key](http://www.last.fm/api/account/create). * Run `lastfm_backup.py`. * WAIT =) ### TODO: - [ ] web service [see lfmbak](https://github.com/iiiypuk/lfmbak) -- [ ] more output types (sqlite, csv) -- [ ] confirugurabled output +- [x] more output types (sqlite, csv) +- [ ] configurable output - [ ] continue backup -- [ ] multithreading +- [ ] multi-threading