Our solution is more about maximizing the joy, where we try to select the songs that are most personally relevant to a user. “Maximize the joy” values relevance over democratic and coherent attributes. In other words, is it better to pick everyone’s favorite tracks, even if other people in the group wouldn’t like them, or is it better to pick the tracks that everyone is likely to like, even if their favorite songs never get selected? “Minimize the misery” is valuing democratic and coherent attributes over relevance. One of the core decisions we made for this product was whether it was better to “minimize the misery” or “maximize the joy”. Democratic: Does music that both users like rise to the top?.Equal: Are both users in the Blend represented equally?.Coherent: Does the playlist have flow, or do the tracks feel completely random and unrelated to each other?.This is especially important for track attribution - if we put a user’s profile image next to a song, we need to make sure that this specific user would agree the song listed is representative of their taste.Relevant: Does the track we’re selecting for that user reflect their taste? Or is it just a song they accidentally listened to once?.When we are working with multiple users, however, we have the challenge of taking more attributes into account. For Daily Mix, our attributes are familiarity and coherency. For example, with Discover Weekly, our main attribute is discovery. Most playlists are composed of a number of attributes and characteristics. We dealt with unique challenges both in the content creation process, and in the invitation flow, to create a Blend. A major complication we saw here was the increase of scale in the number of users we had to deal with. With Blend in particular, we were taking concepts from Family Mix and Duo Mix, and expanding them to a much larger user group. This means we can’t always lean on our past experiences, and often encounter new challenges that require new solutions. The products were well received, so we decided to expand this product line, creating a version of opt-in, automatic, shared, personalized playlists that could work for any two users.Īnytime we want to make a new playlist at Spotify, we’re aiming to do something different that we haven’t been able to accomplish before. These products create shared playlists for users on the same Family or Duo plan. Prior to Blend, the team worked on similar products, Family Mix and Duo Mix. We recently launched a new playlist initiative, Blend, where any user can invite any user to generate a playlist wherein the two users’ tastes are combined into one shared playlist. You can even control the pause / resume functionality by calling basePause() / baseResume().What does it take to go from an idea for a new playlist, to shipping that playlist to Spotify users all around the world? From inception, to prototyping, to QAing, and finally shipping, releasing a new playlist at Spotify is a long process full of new learnings every time. Intent i = new Intent(getApplicationContext(), LocalService.class) īindService(i, mConnection, Context.BIND_AUTO_CREATE) Īnd that's it, now you have background sound in all the activities that are extended from ActivityBase. supporting component replacement by other applications). we know will be running in our own process (and thus won't be class name because we want a specific service implementation that Establish a connection with the service. Because it is running in our same process, we should never unexpectedly disconnected - that is, its process crashed. Public void onServiceDisconnected(ComponentName className) MBoundService = ((LocalService.LocalBinder) service).getService() cast its IBinder to a concrete class and directly access it. service that we know is running in our own process, we can established, giving us the service object we can use to This is called when the connection with the service has been Public void onServiceConnected(ComponentName className, IBinder service) Private ServiceConnection mConnection = new ServiceConnection() Private boolean mIsBound = void onCreate(Bundle void onStart() I am using a class named DJ for this purpose. Then let it know if you are moving within the app or out of it. Keep the player in the background as a static reference.
0 Comments
Leave a Reply. |
AuthorWrite something about yourself. No need to be fancy, just an overview. ArchivesCategories |