Right now, Spotify doesn't have plans to implement a detailed changelog with both changes and reasoning behind it for every app update. You can add your support to this idea to let Spotify know that it's something that you'd like to see. Vnic mac addresses manual. Hey @JRSofty, Thanks for coming to the Community. Right now, Spotify doesn't have plans to implement a detailed changelog with both changes and reasoning behind it for every app update. You can add your support to this idea to let Spotify know that it's something that you'd like to see.
v2.1.4 (UNRELEASED)¶
Maintenance release.
- Add support for Python 3.9. No changes was required, but the test suite nowruns on this version too. (PR: #203)
v2.1.3 (2019-12-29)¶
Maintenance release.
- Document that the playlists API is broken. If it is used, emit a warning to notifythe user of the playlist functionality.
- Update project links.
v2.1.2 (2019-12-10)¶
Maintenance release.
- Silently abort libspotify
sp_*_release()
function calls that happenduring process shutdown, after pyspotify’s global lock is freed. (Fixes:#202)
v2.1.1 (2019-11-17)¶
Maintenance release.
- Add support for Python 3.8. No changes was required, but the test suite nowruns on this version too.
- Switch from Travis CI to CircleCI.
v2.1.0 (2019-07-08)¶
This is police mac download. Maintenance release.
- Drop support for Python 3.3 and 3.4, as both has reached end of life.
- Add support for Python 3.6 and 3.7. No changes was required, but the testsuite now runs on these versions too.
- On Python 3, import
Iterable
,MutableSequence
, andSequence
fromcollections.abc
instead ofcollections
.This fixes a deprecation warning on Python 3.7 and prepares for Python 3.8. - Document that the search API is broken. If it is used, raise an exceptioninstead of sending the search to Spotify, as that seems to disconnect yoursession. (Fixes: #183)
- Format source code with Black.
v2.0.5 (2015-09-22)¶
Bug fix release.
- To follow up on the previous release, the getters for the proxy configs nowconvert empty strings in the
sp_session_config
struct back toNone
. Thus, the need to set these configs to empty strings in thestruct to make sure the cached settings are cleared from disk are now aninternal detail, hidden from the user of pyspotify. - Make
tracefile
default toNone
and set toNULL
in the libspotify config struct. If it is set to an empty string bydefault, libspotify will try to use a file with an empty filename for cacheand fail with “LibError: Unable to open trace file”. Now empty strings areset asNULL
in thesp_session_config
struct. (Fixes: mopidy-spotify#70) - libspotify segfaults if the
device_id
config is set to an empty string.We now avoid this segfault ifdevice_id
is set to anempty string by setting thedevice_id
field in libspotify’ssp_session_config
struct toNULL
instead. - As some test tools (like coverage.py 4.0) no longer support Python 3.2, we nolonger test pyspotify on Python 3.2. Though, we have not done anything tointentionally break support for Python 3.2 ourselves.
v2.0.4 (2015-09-15)¶
Bug fix release. Eplan license manager arcgis.
- It has been observed that libspotify will reuse cached proxy settings fromprevious sessions if the proxy fields on the
sp_session_config
struct areset toNULL
. When thesp_session_config
fields are set to an emptystring, the cached settings are updated. When attributes onspotify.Config
are set toNone
, we now set the fields onsp_session_config
to empty strings instead ofNULL
.
v2.0.3 (2015-09-05)¶
Bug fix release. Manufacture date by serial number.
- Make moving a playlist to its own location a no-op instead of causing anerror like libspotify does. (Fixes: #175)
- New better installation instructions. (Fixes: #174)
v2.0.2 (2015-08-06)¶
Bug fix release.
- Use
sp_session_starred_for_user_create(session,username)
instead ofsp_playlist_create(session,link)
to get starred playlists by URI. Theprevious approach caused segfaults under some circumstances. (Fixes:mopidy-spotify#60)
v2.0.1 (2015-07-20)¶
Bug fix release.
- Make
spotify.Session.get_playlist()
acquire the global lock beforemodifying the global playlist cache. - Make
Playlist
andPlaylistContainer
register callbacks with libspotify if and only if a Python event handler isadded to the object. Previously, we always registered the callbacks withlibspotify. Hopefully, this will remove the preconditions for the crashes in#122, #153, and #165.
v2.0.0 (2015-06-01)¶
pyspotify 2.x is a full rewrite of pyspotify. While pyspotify 1.x is aCPython C extension, pyspotify 2.x uses CFFI to wrap the libspotify C library. It workson CPython 2.7 and 3.2+, as well as PyPy 2.6+. pyspotify 2.0 makes 100% of thelibspotify 12.1.51 API available from Python, going far beyond the API coverageof pyspotify 1.x.
The following are the changes since pyspotify 2.0.0b5.
Dependency changes¶
- Require cffi >= 1.0. (Fixes: #133, #160)
- If you’re using pyspotify with PyPy you need version 2.6 or newer as olderversions of PyPy come with a too old cffi version. For PyPy3, you’ll probablyneed the yet to be released PyPy3 2.5.
ALSA sink¶
- Changed the
spotify.AlsaSink
keyword argumentcard
todevice
to align with pyalsaaudio 0.8. - Updated to work with pyalsaaudio 0.8 which changed the signature of
alsaaudio.PCM
.spotify.AlsaSink
still works withpyalsaaudio 0.7, but 0.8 is recommended at least for Python 3 users, as itfixes a memory leak present on Python 3 (see #127). (Fixes:#162)
v2.0.0b5 (2015-05-09)¶
A fifth beta with a couple of bug fixes.
Minor changes¶
- Changed
spotify.Link.as_playlist()
to also support creating playlistsfrom links with typespotify.LinkType.STARRED
. - Changed all
load()
methods to raisespotify.Error
instead ofRuntimeError
if the session isn’t logged in. - Changed from nose to py.test as test runner.
Bug fixes¶
- Work around segfault in libspotify when
spotify.Config.cache_location
is set toNone
and then used to create a session. (Fixes:#151) - Return a
spotify.PlaylistPlaceholder
object instead of raising anexception if the playlist container contains an element of typePLACEHOLDER
. (Fixes: #159)
v2.0.0b4 (2015-01-13)¶
The fourth beta includes a single API change, a couple of API additions, andotherwise minor tweaks to logging.
pyspotify 2.x has been verified to work on PyPy3, and PyPy3 is now part of thetest matrix.
Minor changes¶
Spotify Changelog Mac Pro
- Added
spotify.Link.url
which returns anhttps://open.spotify.com/..
URL for the link object. - Adjusted
info
,warning
, anderror
level log messages to includethe word “Spotify” or “pyspotify” for context in applications not includingthe logger name in the log.debug
level messages have not been changed,as it is assumed that more details, including the logger name, is included indebug logs. - Added
spotify.player.Player.state
which is maintained by calls tothe variousPlayer
methods.
Bug fixes¶
- Fix
spotify.Playlist.reorder_tracks()
. It now accepts a list oftrack indexes instead of a list of tracks. This makes it possible toreorder any of multiple identical tracks in a playlist and is consistent withspotify.Playlist.remove_tracks()
. (Fixes: #134) - Fix pause/resume/stop in the
examples/shell.py
example. (PR:#140) - Errors passed to session callbacks are now logged with the full error typerepresentation, instead of just the integer value. E.g. where previouslyonly “8” was logged, we now log “<ErrorType.UNABLE_TO_CONTACT_SERVER: 8>”.
v2.0.0b3 (2014-05-04)¶
The third beta includes a couple of changes to the API in the name ofconsistency, as well as three minor improvements.
Also worth noticing is that with this release, pyspotify 2.x has been indevelopment for a year and a day. Happy birthday, pyspotify 2!
Refactoring: Connection cleanup¶
Parts of
spotify.Session
and spotify.Session.offline
has beenmoved to spotify.Session.connection
:set_connection_type()
has been replaced bysession.connection.type
,which now also allows reading the current connection type.set_connection_rules()
has been replaced by:The new attributes allow reading the current connection rules, so yourapplication don’t have to keep track of what rules it has set.session.connection_state
has been replaced bysession.connection.state
Refactoring: position vs index¶
Originally, pyspotify named everything identically with libspotify and havethus ended up with a mix of the terms “position” and “index” for the sameconcept. Now, we use “index” all over the place, as that’s also the name usedin the Python world at large. This changes the signature of three methods,which may affect you if you use keyword arguments to call the methods. There’salso a number of affected events, but these changes shouldn’t stop your codefrom working.
Affected functions include:
spotify.Playlist.add_tracks()
now takesindex
instead ofposition
.spotify.Playlist.remove_tracks()
now takesindexes
instead ofpositions
.spotify.Playlist.reorder_tracks()
now takesnew_index
instead ofnew_position
.
Affected events include:
Minor changes¶
load()
methods now return the object if it is already loaded, even ifstate
isn’tLOGGED_IN
. Previously, aRuntimeError
was raised requiring the session to be logged in andonline before loading already loaded objects.spotify.Playlist.tracks
now implements thecollections.MutableSequence
contract, supporting deleting items withdelplaylist.tracks[i]
, adding items withplaylist.tracks[i]=track
, etc.spotify.Session.get_link()
and all other methods accepting SpotifyURIs now also understand open.spotify.com and play.spotify.com URLs.
v2.0.0b2 (2014-04-29)¶
The second beta is a minor bug fix release.
Bug fixes¶
![Spotify changelog mac os Spotify changelog mac os](/uploads/1/3/3/9/133934484/102309848.jpg)
- Fix
spotify.Playlist.remove_tracks
. It now accepts a list oftrack positions instead of a list of tracks. This makes it possible toremove any of multiple identical tracks in a playlist. (Fixes: #128)
Minor changes¶
- Make all objects compare as equal and have the same hash if they wrap thesame libspotify object. This makes it possible to find the index of a trackin a playlist by doing
playlist.tracks.index(track)
, whereplaylist.tracks
is a custom collection always returning newTrack
instances. (Related to: #128) spotify.Config.ca_certs_filename
now works on systems wherelibspotify has this field. On systems where this field isn’t present inlibspotify, assigning to it will have no effect. Previously, assignment tothis field was a noop on all platforms because the field is missing fromlibspotify on OS X.
v2.0.0b1 (2014-04-24)¶
pyspotify 2.x is a full rewrite of pyspotify. While pyspotify 1.x is aCPython C extension, pyspotify 2.x uses CFFIto make 100% of the libspotify C library available from Python. It works onCPython 2.7 and 3.2+, as well as PyPy 2.1+.
Since the previous release, pyspotify has become thread safe. That is,pyspotify can safely be used from multiple threads. The added thread safetymade an integrated event loop possible, which greatly simplifies the usage ofpyspotify, as can be seen from the updated example in
examples/shell.py
.Audio sink helpers for ALSA and PortAudio have been added, together withupdated examples that can play music. A number of bugs have been fixed, and atthe time of the release, there are no known issues.The pyspotify 2.0.0b1 release marks the completion of all planned features forpyspotify 2.x. The plans for the next releases are focused on fixing bugs asthey surface, incrementally improving the documentation, and integratingfeedback from increased usage of the library in the wild.
Feature: Thread safety¶
- Hold the global lock while we are working with pointers returned bylibspotify. This ensures that we never call libspotify from another threadwhile we are still working on the data returned by the previous libspotifycall, which could make the data garbage.
- Ensure we never edit shared data structures without holding the global lock.
Feature: Event loop¶
- Add
spotify.EventLoop
helper thread that reacts toNOTIFY_MAIN_THREAD
events and callsprocess_events()
for you when appropriate. - Update
examples/shell.py
to be a lot simpler with the help of the newevent loop.
Feature: Audio playback¶
- Add
spotify.AlsaSink
, an audio sink for playback through ALSA onLinux systems. - Add
spotify.PortAudioSink
, an audio sink for playback throughPortAudio on most platforms, including Linux, OS X, and Windows. - Update
examples/shell.py
to use the ALSA sink to play music. - Add
examples/play_track.py
as a simpler example of audio playback.
Refactoring: Remove global state¶
To prepare for removing all global state, the use of the module attribute
spotify.session_instance
has been replaced with explicit passing of thesession object to all objects that needs it. To allow for this, the followingnew methods have been added, and should be used instead of their oldequivalents:spotify.Session.get_link()
replacesspotify.Link
.spotify.Session.get_track()
replacesspotify.Track
.spotify.Session.get_local_track()
replacesspotify.LocalTrack
.spotify.Session.get_album()
replacesspotify.Album
.spotify.Session.get_artist()
replacesspotify.Artist
.spotify.Session.get_playlist()
replacesspotify.Playlist
.spotify.Session.get_user()
replacesspotify.User
.spotify.Session.get_image()
replacesspotify.Image
.spotify.Session.get_toplist()
replacesspotify.Toplist
.
Refactoring: Consistent naming of Session
members¶
With all the above getters added to the
spotify.Session
object, itmade sense to rename some existing methods of Session
forconsistency:spotify.Session.starred_for_user()
is replaced byget_starred()
.spotify.Session.starred
to get the currently logged in user’s starredplaylist is replaced byget_starred()
without anyarguments.spotify.Session.get_published_playlists()
replacespublished_playlists_for_user()
. As previously, itreturns the published playlists for the currently logged in user if nousername is provided.
Refactoring: Consistent naming of threading.Event
objects¶
All
threading.Event
objects have been renamed to be consistentlynamed across classes.Spotify Changelog Mac Os
spotify.AlbumBrowser.loaded_event
replacesspotify.AlbumBrowser.complete_event
.spotify.ArtistBrowser.loaded_event
replacesspotify.ArtistBrowser.complete_event
.spotify.Image.loaded_event
replacesspotify.Image.load_event
.spotify.InboxPostResult.loaded_event
replacesspotify.InboxPostResult.complete_event
.spotify.Search.loaded_event
replacesspotify.Search.complete_event
.spotify.Toplist.loaded_event
replacesspotify.Toplist.complete_event
.
![Changelog Changelog](/uploads/1/3/3/9/133934484/965536686.jpg)
Refactoring: Change how to register image load listeners¶
pyspotify has two main schemes for registering listener functions:
- Objects that only emit an event when it is done loading, like
AlbumBrowser
,ArtistBrowser
,InboxPostResult
,Search
, andToplist
, accept a single callback as acallback
argument to its constructor or constructor methods. - Objects that have multiple callback events, like
Session
,PlaylistContainer
, andPlaylist
, acceptthe registration and unregistration of one or more listener functions foreach event it emits. This can happen any time during the object’s life cycle.
Due to pyspotify’s close mapping to libspotify’s organization,
Image
objects used to use a third variant with two methods,add_load_callback()
andremove_load_callback()
, for adding and removing loadcallbacks. These methods have now been removed, and Image
accepts a callback
argument to its constructor and constructor methods:spotify.Album.cover()
accepts acallback
argument.spotify.Artist.portrait()
accepts acallback
argument.spotify.ArtistBrowser.portraits()
is now a method and accepts acallback
argument.spotify.Link.as_image()
accepts acallback
argument.spotify.Playlist.image()
is now a method and accepts acallback
argument.spotify.Session.get_image()
accepts acallback
argument.
Bug fixes¶
- Remove multiple extra
sp_link_add_ref()
calls, potentially causingmemory leaks in libspotify. - Add missing error check to
spotify.Playlist.add_tracks()
. - Keep album, artist, image, inbox, search, and toplist objects alive untiltheir complete/load callbacks have been called, even if the library userdoesn’t keep any references to the objects. (Fixes: #121)
- Fix flipped logic causing crash in
spotify.Album.cover_link()
. (Fixes:#126) - Work around segfault in libspotify if
private_session
is set before the session islogged in and the first events are processed. This is a bug in libspotifywhich has been reported to Spotify through their IRC channel. - Multiple attributes on
Track
raised an exception ifaccessed before the track was loaded. They now returnNone
orsimilar as documented. - Fix segfault when creating local tracks without all arguments specified.
NULL
was used as the placeholder instead of the empty string. - Support negative indexes on all custom sequence types. For example,
collection[-1]
returns the last element in the collection. - We now cache playlists when created from URIs. Previously, only playlistscreated from
sp_playlist
objects were cached. This avoids a potentiallylarge number of wrapper object recreations due to a flood of updates to theplaylist when it is initially loaded. Combined with having registered acallback for the libspotifyplaylist_update_in_progress
callback, thiscould cause deep call stacks reaching the maximum recursion depth. (Fixes:#122)
Minor changes¶
- Add
spotify.get_libspotify_api_version()
andspotify.get_libspotify_build_id()
. - Running
pythonsetup.pytest
now runs the test suite. - The tests are now compatible with CPython 3.4. No changes to theimplementation was required.
- The test suite now runs on Mac OS X, using CPython 2.7, 3.2, 3.3, 3.4, andPyPy 2.2, on every push to GitHub.
v2.0.0a1 (2014-02-14)¶
pyspotify 2.x is a full rewrite of pyspotify. While pyspotify 1.x is aCPython C extension, pyspotify 2.x uses CFFIto wrap the libspotify C library. It works on CPython 2.7 and 3.2+, as well asPyPy 2.1+.
This first alpha release of pyspotify 2.0.0 makes 100% of the libspotify12.1.51 API available from Python, going far beyond the API coverage ofpyspotify 1.x.
pyspotify 2.0.0a1 has an extensive test suite with 98% line coverage. All testspass on all combinations of CPython 2.7, 3.2, 3.3, PyPy 2.2 running on Linux oni386, amd64, armel, and armhf. Mac OS X should work, but has not been testedrecently.
This release does not provide: Can you get a google task app on mac.
- thread safety,
- an event loop for regularly processing libspotify events, or
- audio playback drivers.
These features are planned for the upcoming prereleases.
Development milestones¶
Spotify Changelog Mac App
- 2014-02-13: Playlist callbacks complete. pyspotify 2.x now covers 100% ofthe libspotify 12 API. Docs reviewed, quickstart guide extended. Redundantgetters/setters removed.
- 2014-02-08: Playlist container callbacks complete.
- 2014-01-31: Redesign session event listening to a model supporting multiplelisteners per event, with a nicer API for registering listeners.
- 2013-12-16: Ensure we never call libspotify from two different threads at thesame time. We can’t assume that the CPython GIL will ensure this for us, aswe target non-CPython interpreters like PyPy.
- 2013-12-13: Artist browsing complete.
- 2013-12-13: Album browsing complete.
- 2013-11-29: Toplist subsystem complete.
- 2013-11-27: Inbox subsystem complete.
- 2013-10-14: Playlist subsystem almost complete.
- 2013-06-21: Search subsystem complete.
- 2013-06-10: Album subsystem complete.
- 2013-06-09: Track and artist subsystem complete.
- 2013-06-02: Session subsystem complete, with all methods.
- 2013-06-01: Session callbacks complete.
- 2013-05-25: Session config complete.
- 2013-05-16: Link subsystem complete.
- 2013-05-09: User subsystem complete.
- 2013-05-08: Session configuration and creation, with login and logout works.
- 2013-05-03: The Python object
spotify.lib
is a working CFFI wrapperaround the entire libspotify 12 API. This will be the foundation for morepythonic APIs. The library currently works on CPython 2.7, 3.3 and PyPy 2.