gmgetalbum.py
· 1.9 KiB · Python
Raw
#!/usr/bin/env python3
import gmusicapi
import os
from argparse import ArgumentParser
import requests
from mutagen import File
gmusic = gmusicapi.Mobileclient()
gmusic.login(os.environ["GMUSICAPI_EMAIL"], os.environ["GMUSICAPI_PASSWORD"], os.environ["GMUSICAPI_MACADDR"])
def get_track(track_id):
track = gmusic.get_track_info(track_id)
try:
os.makedirs(os.path.join(track["artist"], track["album"]))
except:
pass
fn = os.path.join(track["artist"], track["album"], "{trackNumber:0>2} {artist} - {title}.mp3".format(**track).replace("/", "-"))
print(fn, end="")
with open(fn, "wb") as f:
f.write(requests.get(gmusic.get_stream_url(track["storeId"])).content)
f = File(fn, easy=True)
for x in ["title", "artist", "album", "trackNumber"]:
if track[x]:
f[x.lower()] = str(track[x]).zfill(2)
f.save()
print("\r" + fn + " done")
def get_album(album_id):
album = gmusic.get_album_info(album_id, include_tracks=True)
return album
def get_artist(artist_id):
artist = gmusic.get_artist_info(artist_id, include_albums=True)
return artist
def main():
parser = ArgumentParser()
parser.add_argument("id", nargs="+")
args = parser.parse_args()
to_get = []
for _id in args.id:
if _id[0] == "A":
artist = get_artist(_id)
for album in artist["albums"]:
album = get_album(album["albumId"])
for track in album["tracks"]:
to_get.append(track["storeId"])
elif _id[0] == "B":
album = get_album(_id)
for track in album["tracks"]:
to_get.append(track["storeId"])
elif _id[0] == "T":
to_get.append(_id)
print("Queued {} items".format(len(to_get)))
for trid in to_get:
get_track(trid)
return 0
if __name__ == "__main__":
import sys
sys.exit(main())
| 1 | #!/usr/bin/env python3 |
| 2 | |
| 3 | import gmusicapi |
| 4 | import os |
| 5 | from argparse import ArgumentParser |
| 6 | import requests |
| 7 | from mutagen import File |
| 8 | |
| 9 | gmusic = gmusicapi.Mobileclient() |
| 10 | gmusic.login(os.environ["GMUSICAPI_EMAIL"], os.environ["GMUSICAPI_PASSWORD"], os.environ["GMUSICAPI_MACADDR"]) |
| 11 | |
| 12 | def get_track(track_id): |
| 13 | track = gmusic.get_track_info(track_id) |
| 14 | try: |
| 15 | os.makedirs(os.path.join(track["artist"], track["album"])) |
| 16 | except: |
| 17 | pass |
| 18 | fn = os.path.join(track["artist"], track["album"], "{trackNumber:0>2} {artist} - {title}.mp3".format(**track).replace("/", "-")) |
| 19 | print(fn, end="") |
| 20 | with open(fn, "wb") as f: |
| 21 | f.write(requests.get(gmusic.get_stream_url(track["storeId"])).content) |
| 22 | f = File(fn, easy=True) |
| 23 | for x in ["title", "artist", "album", "trackNumber"]: |
| 24 | if track[x]: |
| 25 | f[x.lower()] = str(track[x]).zfill(2) |
| 26 | f.save() |
| 27 | print("\r" + fn + " done") |
| 28 | |
| 29 | def get_album(album_id): |
| 30 | album = gmusic.get_album_info(album_id, include_tracks=True) |
| 31 | return album |
| 32 | |
| 33 | def get_artist(artist_id): |
| 34 | artist = gmusic.get_artist_info(artist_id, include_albums=True) |
| 35 | return artist |
| 36 | |
| 37 | def main(): |
| 38 | parser = ArgumentParser() |
| 39 | parser.add_argument("id", nargs="+") |
| 40 | args = parser.parse_args() |
| 41 | to_get = [] |
| 42 | for _id in args.id: |
| 43 | if _id[0] == "A": |
| 44 | artist = get_artist(_id) |
| 45 | for album in artist["albums"]: |
| 46 | album = get_album(album["albumId"]) |
| 47 | for track in album["tracks"]: |
| 48 | to_get.append(track["storeId"]) |
| 49 | elif _id[0] == "B": |
| 50 | album = get_album(_id) |
| 51 | for track in album["tracks"]: |
| 52 | to_get.append(track["storeId"]) |
| 53 | elif _id[0] == "T": |
| 54 | to_get.append(_id) |
| 55 | print("Queued {} items".format(len(to_get))) |
| 56 | for trid in to_get: |
| 57 | get_track(trid) |
| 58 | return 0 |
| 59 | |
| 60 | if __name__ == "__main__": |
| 61 | import sys |
| 62 | sys.exit(main()) |