Merge pull request #2586 from tigranl/gmusic

Add Google Music plugin
This commit is contained in:
Adrian Sampson 2017-06-14 18:52:20 -04:00
commit 4563e3b6dd
3 changed files with 143 additions and 0 deletions

93
beetsplug/gmusic.py Normal file
View file

@ -0,0 +1,93 @@
# -*- coding: utf-8 -*-
# This file is part of beets.
# Copyright 2017, Tigran Kostandyan.
#
# Permission is hereby granted, free of charge, to any person obtaining
# a copy of this software and associated documentation files (the
# "Software"), to deal in the Software without restriction, including
# without limitation the rights to use, copy, modify, merge, publish,
# distribute, sublicense, and/or sell copies of the Software, and to
# permit persons to whom the Software is furnished to do so, subject to
# the following conditions:
#
# The above copyright notice and this permission notice shall be
# included in all copies or substantial portions of the Software.
"""Uploads files to Google Play Music"""
from __future__ import print_function
import os.path
from beets.plugins import BeetsPlugin
from beets import ui
from beets import config
from beets.ui import Subcommand
from gmusicapi import Musicmanager, Mobileclient
from gmusicapi.exceptions import NotLoggedIn
import gmusicapi.clients
class Gmusic(BeetsPlugin):
def __init__(self):
super(Gmusic, self).__init__()
# Checks for OAuth2 credentials,
# if they don't exist - performs authorization
self.m = Musicmanager()
if os.path.isfile(gmusicapi.clients.OAUTH_FILEPATH):
self.m.login()
else:
self.m.perform_oauth()
def commands(self):
gupload = Subcommand('gmusic-upload',
help=u'upload your tracks to Google Play Music')
search = Subcommand('gmusic-songs',
help=u'list of songs in Google Play Music library'
)
search.parser.add_option('-t', '--track', dest='track',
action='store_true',
help='Search by track name')
search.parser.add_option('-a', '--artist', dest='artist',
action='store_true',
help='Search by artist')
gupload.func = self.upload
search.func = self.search
return [gupload, search]
def upload(self, lib, opts, args):
items = lib.items(ui.decargs(args))
files = [x.path.decode('utf-8') for x in items]
ui.print_('Uploading your files...')
self.m.upload(filepaths=files)
ui.print_('Your files were successfully added to library')
def search(self, lib, opts, args):
password = config['gmusic']['password']
email = config['gmusic']['email']
password.redact = True
email.redact = True
# Since Musicmanager doesn't support library management
# we need to use mobileclient interface
mobile = Mobileclient()
try:
mobile.login(email.as_str(), password.as_str(),
Mobileclient.FROM_MAC_ADDRESS)
files = mobile.get_all_songs()
except NotLoggedIn:
ui.print_('Error occured. Please check your email and password')
if not args:
for i, file in enumerate(files, start=1):
print(i, ui.colorize('blue', file['artist']),
file['title'], ui.colorize('red', file['album']))
else:
if opts.track:
self.match(files, args, 'title')
else:
self.match(files, args, 'artist')
@staticmethod
def match(files, args, search_by):
for file in files:
if ' '.join(ui.decargs(args)) in file[search_by]:
print(file['artist'], file['title'], file['album'])

48
docs/plugins/gmusic.rst Normal file
View file

@ -0,0 +1,48 @@
Gmusic Plugin
=============
This plugin allows you to manage your Google Play Music library with beets.
Installation
------------
The plugin requires `gmusic`_. You can install it using `pip`::
pip install gmusicapi
.. _gmusic: https://github.com/simon-weber/gmusicapi/
Usage
-----
To use the ``gmusic`` plugin, enable it in your configuration file.
Then, add your Google email and password to configuration file under a ``gmusic`` section, if you want to be able to search for songs in your library.
It's not necessary if you only upload files. ::
gmusic:
email: email
password: password
If you want to upload your tracks use ``gmusic-upload`` command::
beet gmusic-upload [ARGS...]
If no arguments are provided, it will upload your entire beet collection.
In case you want to search for songs in your Google Music library just use::
beet gmusic-songs [OPTS...] [ARGS...]
Options:
-a, --artist search by artist name
-t, --track search by track
For example::
beet gmusic-songs -a John Frusciante
beet gmusic-songs -t Black Hole Sun
If you want a list of all songs simply leave it without arguments and options.

View file

@ -58,6 +58,7 @@ like this::
ftintitle
fuzzy
freedesktop
gmusic
hook
ihate
importadded
@ -175,6 +176,7 @@ Miscellaneous
* :doc:`duplicates`: List duplicate tracks or albums.
* :doc:`export`: Export data from queries to a format.
* :doc:`fuzzy`: Search albums and tracks with fuzzy string matching.
* :doc:`gmusic`: Search and upload files to Google Play Music.
* :doc:`hook`: Run a command when an event is emitted by beets.
* :doc:`ihate`: Automatically skip albums and tracks during the import process.
* :doc:`info`: Print music files' tags to the console.