Posts: 5
Threads: 1
Joined: Jul 2018
Hello,
I am looking to create and share a MusicBrainz Picard plugin that pulls information that automatically rates your music library using info from Last.FM API. However, I am not a very experienced programmer and am not sure how to get the data I need.
I am looking to get the listeners and playcount values from Last.FM GetInfo webservice:
http://ws.audioscrobbler.com/2.0/?method...6e8e33f2ee
I was able to get this data using xml.etree.ElementTree and pylast libraries in python, but I do not know how to get these to work with MusicBrainz Picard.
I wanted to see if anybody had any other ideas to get those values.
Thank you!
Posts: 7,326
Threads: 123
Joined: Sep 2016
(Jul-26-2018, 08:49 PM)zaz102 Wrote: I wanted to see if anybody had any other ideas to get those values. A common way is to use Requests and BS.
1 2 3 4 5 6 7 8 9 10 |
from bs4 import BeautifulSoup
import requests
url_get = requests.get(url)
soup = BeautifulSoup(url_get.content, 'html.parser' )
listeners = soup.find( 'listeners' ).text
play_count = soup.find( 'playcount' ).text
print (listeners)
print (play_count)
|
Output: 1058399
14397145
Posts: 5
Threads: 1
Joined: Jul 2018
Thanks. This is where I am ignorant though.
I extracted the BS4 library and copied it into my plugin's folder. I was expecting for it to pick it up, but it does not. Instead, I get an error message "ImportError: No module named bs4".
Note that I do not want to install the library the traditional way since it will be used as a plugin. From my experience, MusicBrainz Picard does not pick it up that way.
Any ideas how to have it be picked up by the application.
Posts: 5
Threads: 1
Joined: Jul 2018
In order to import the bs4 library, I tried adding the code:
import sys
sys.path.append('./bs4')
import bs4
I am receiving the same error message.
My path is:
testplugin\
testplugin.py
bs4
Any ideas?
Posts: 7,326
Threads: 123
Joined: Sep 2016
(Jul-27-2018, 06:36 PM)zaz102 Wrote: Any ideas? Can do it in a more dirty way using no 3-party modules,can make it easier if using this in a plugin.
1 2 3 4 5 6 7 8 |
import urllib.request
import re
site = url.read().decode( 'utf-8' )
listeners = re.search( '<listeners>(\d+)' , site).group( 1 )
play_count = re.search( '<playcount>(\d+)' , site).group( 1 )
print (listeners, play_count)
|
Output: 1058705 14402632
Posts: 5
Threads: 1
Joined: Jul 2018
Thank you for your help.
Interestingly enough, the plugin still couldn't find it, but I was able to get it work by copying the library into the plugin folder.
Also, I had to remove the request part from urllib. See below:
import urllib
url = urllib.urlopen('http://ws.audioscrobbler.com/2.0/?method=artist.getinfo&artist=Cher&api_key=0a8b8f968b285654f9b4f16e8e33f2ee')
Not sure why I had to make the changes above, but it's working so I am very happy. Thanks again!
Posts: 7,326
Threads: 123
Joined: Sep 2016
Jul-28-2018, 10:12 AM
(This post was last modified: Jul-28-2018, 10:12 AM by snippsat.)
(Jul-28-2018, 02:58 AM)zaz102 Wrote: Not sure why I had to make the changes above, but it's working so I am very happy. Thanks again! Because you(or library) use Python 2,i always write code for Python 3 if not specify that code has to be for Python 2.
If it's this library you use MusicBrainz Picard,so do it use Python 3,also a 3 :: Only tag.
Here form setup.py:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
'classifiers' : [
'License :: OSI Approved :: GNU General Public License v2 or later (GPLv2+)' ,
'Development Status :: 5 - Production/Stable' ,
'Programming Language :: Python :: 3' ,
'Programming Language :: Python :: 3 :: Only' ,
'Programming Language :: Python :: 3.5' ,
'Programming Language :: Python :: 3.6' ,
'Operating System :: Microsoft :: Windows' ,
'Operating System :: MacOS' ,
'Operating System :: POSIX :: Linux' ,
'Topic :: Multimedia :: Sound/Audio' ,
'Topic :: Multimedia :: Sound/Audio :: Analysis'
]
}
|
If it woks then all is okay
Posts: 5
Threads: 1
Joined: Jul 2018
You have already helped me so much, but I have one more question.
For the URL request, I actually have artist (Cher) as a variable. It seems when the request is made to the website, it's doesn't properly encode the variable. This becomes apparent when there is a special character (e.g. Sonny & Cher). I believe it is coming up as "&" rather than percent-encoding it to "%26". I tried messing around with urlencode, urlquote, and replace, but I am obviously not doing it correctly. Any ideas on how to solve this issue?
Posts: 7,326
Threads: 123
Joined: Sep 2016
1 2 3 4 5 6 7 8 9 10 |
>>> from urllib.parse import urlencode
>>>
>>> artist = 'Sonny & Cher'
>>> s = urlencode({ 'artist' : artist})
>>> s
'artist=Sonny+%26+Cher'
>>>
>>> s.split( '=' )[ 1 ]
'Sonny+%26+Cher'
|
|