Giter Site home page Giter Site logo

shuttle's Introduction

Shuttle Music Player

License: GPL v3 API Build Status Discord Chat

Shuttle is an open source, local music player for Android.

Shuttle comes in two flavours:

The free version includes an option to upgrade via an IAP, which unlocks the features otherwise available in Shuttle+.

Status

Shuttle is no longer actively maintained. The successor, S2 is under active development here: https://github.com/timusus/Shuttle2

The codebase in this repository is very old and unwieldy. The foundations were written when I was first learning java, around 10 years ago. It has become too much of a maintenance burden to try to keep up-to-date, so I've decided to archive the repository.

Features
  • Local playback only (based on the MediaStore)
  • Built in equalizer
  • Sleep timer
  • Folder browser
  • Scrobbling
  • Widgets
  • Theming
  • Album-artist support
  • Artwork scraping (Last.FM & iTunes)
  • Tag editing
  • Folder browsing
  • Chromecast

Contributing:

See the Contributing document. This is/will become a good resource if you're just wondering how the app works.

History:

Shuttle started some time in early 2012, as a project to learn Java (and programming in general). Initially, it was based off of the Random Music Player sample project by Google. I clearly recall how happy I was when I managed to wrangle that project to play a song of my choosing!

After lots of blog reading and trial and error, I eventually stumbled upon Googles Default Music Player. At the time I had no idea what I was doing, but for better or worse, I made a habit of not copying classes, but writing the code out myself. This tedious process lasted a while, but it was my way of trying to ensure I understood what was going on when I copied a class into my app.

Initially, Shuttle was relased as AMP (another.music.player). A patent troll threatened legal action if I didn't change the name (don't want a native Android app getting confused with an audio codec!) and I was naive enough to comply - and so the name was changed.

As I developed Shuttle, I received a lot of really positive feedback from reddit (/r/android). I continued to work on customisation of holo-based themes and looked on in awe as Shuttle ticked over to install number 10.

I eventually discovered Cyanogenmod, and the then-famous Apollo Music Player, which seemed to solve a few problems I wasn't able to solve myself. I discovered the beautiful thing that is open source software, and found out that someone else had already solved these problems for me, and I was allowed to copy them! That someone else was Andrew Neal, the developer of Apollo Music Player. Initially via email, then to hangouts and now on Slack, Andrew unwittingly became my mentor. I attribute a large portion of Shuttle's success to both Andrew and his app Apollo.

Shuttle continued to gain momentum over the years. Holo was phased out and something post-Holo-pre-Material came in. I celebrated 500,000 downloads with an actual cake sometime in 2014. I got a job as an Android developer.. Glide came out, RXJava became popular and Material design came in.

I've continued to work on Shuttle at times daily, at the least weekly, ever since its initial release. It's come a hell of a long way since day one. It is my proudest accomplishment. It now has about 5 million downloads!

Motivation for Open Source:

Without open source, Shuttle wouldn't exist, and I probably wouldn't be an Android developer. One of my motivations for open sourcing this project is to 'give back'. Maybe Shuttle can be to someone else what Apollo Music Player was to me.

Secondly, I don't feel like I'm able to dedicate as much time to the project as I have in the past. Each year that goes by, I feel like there's just more for me to do and less time do it. I'm hoping that there are some enthusiastic developers out there who like Shuttle, and would like to improve it in some way.

License

Shuttle Music Player is released under the GNU General Public License v3.0 (GPLv3), which can be found here: License

shuttle's People

Contributors

adneal avatar amagh avatar aorobator avatar bezman avatar daykod avatar excuta avatar faho avatar farmerbb avatar fxsalazar avatar geecko86 avatar geozac avatar gmattis avatar jnpatel2811 avatar khang-nt avatar larsdroid avatar lastbulletbender avatar nickcapurso avatar nyancrimew avatar rfazi avatar technacity avatar technickel-dev avatar timusus avatar tkashkin avatar willcoughlin avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

shuttle's Issues

Add build instructions

Currently there is not much information on building this. It would be nice to have some basic information like Java version (7 or 8?) and Android SDK packages required. This would help new would-be contributors get started.

Crash when inverting notifications on SDK < 21

  • Shuttle version:
    1.6.4+
  • Device, OS:
    OS running Android < 21
  • Description of bug:
    After choosing 'invert notifications' from the settings, the app will crash when attempting to display the notification.

There is no notification_template_base_inverse and notification_template_big_base_inverse, so the MusicService crashes when referencing it

Opus Support

Shuttle Version : Dev and store
Device: Pixel XL 7.1.1
Description: The app doesn't show any .opus files (http://opus-codec.org/). These files are in the ogg format but have a different extension. As far as I know, the Android platform has supported the codec since 5.0.
Steps: Add any .opus file to the devices Music directory. Open app.
Expected: The opus file would be an item in any list
Outcome: The file is not in any list

I'm interested in contributing so I'll start looking into what needs to be added for this but I'm making this issue to keep track of this feature.

Streaming support and cassette integration

Hi,

I am working on cassette a self-hosted spotify alternative where you can download and stream music in your browser. I would like to know if some kind of integration is possible. For now it is only possible to stream and listen to music in the browser, do you think it is possible to stream in the app and maybe sync? I am primarly a js dev, and although I first learned Java, Android is still rather new to me.

Thanks

Plugin infrastructure

Can there be a plugin infrastructure (much like Muzei). The following points can be made as the pluggable-entry into the app.

  1. Media source
  2. Playlist source (think dynamic playlist)
  3. Player Controller

(These are not an exhaustive list and has to be taken as mere suggestions.)

The reason for this is that, the player core will be remaining clean, lean & the additional functionalities will be available via the plugin system.

The users can mix and match what they want and what they like.

So people who doesn't have spotify/google play music, will have an app that is lean without that bloat, and others can install a plugin for the same.

Feature: Beep when song is changed via headset button

One feature from Vanilla Music I really like is the option to beep when I change songs via double-pressing my headset's button.

The reason for this is that, with songs often starting with a few seconds of silence or fade-in, it's difficult to tell if I've paused or skipped.

Since both applications are GPLv3, you might be able to crib parts of their implementation - see https://github.com/vanilla-music/vanilla/blob/master/src/ch/blinkenlights/android/vanilla/MediaButtonReceiver.java.

Feature: Replay gain

There have been many requests for volume normalisation over the years. Currently considering using a 3rd party Media Player such as SuperPowered (but it has limited filetype support)

Artwork in notification blinks

A user (trying shuttle for the first time) reported a small bug directly to me, including a screen recording.

"not a big thing..but why that artwork blinks when play/pause"

shuttle_blink

"Play (album)" doesn't work as expected

Description:
This is a "2 in 1" report:

  1. If I want to play an album it plays the first song, but doesn't play the next song and repeats the song.
  2. If I swipe to the next song on the bottom panel it shuffles to the next song instead of the next song.

Steps To Reproduce:

  1. Go to a album.
  2. Press overflow button
  3. Press play

Expected result:

  1. The play function plays the album track by track.
  2. Swiping right should play the next song of the album and not shuffle if I didn't select shuffle anywhere.

Edit: After a fresh install I'm seeing now that this has to do with another bug. Shuffle & one repeat were probably activated, but the icons didn't show. Where now I have coloured "active" icons there was nothing displayed before.

Still keeping it open, because if I use the overflow button to select "play album" it should probably overwrite/ignore these settings here.

WhatsApp image download starts music

I have the following problem with Shuttle+: When I download an image in a WhatsApp group chat the music starts playing. What could cause this?

I'm on Moto Z Play running Android 6.0.1 and have the 1.6.4 version of Shuttle+

Submit to F-Droid

I don't know what's involved here. I'd like to do this, but it would be great if I could get some help, as I have even more on my plate than usual having just released Shuttle as an open source app.

https://f-droid.org/contribute/

Feature: Smart playlists

The ability to pick certain criteria, and have Shuttle automatically populate a playlist to match would be great. Particularly 'songs in this genre, from year x to year y'. That type of thing.

I've done some work on this, so I'll push it to a branch later on.

Button to re-scan library

One of the only missing features in comparison to other local players is to purposefully re-scan the music library for newly added (or removed?) content.

Add tests

There are 0 tests in Shuttle. I would almost be ashamed except - well, I don't exactly how to write unit tests, and I don't know what to test. If someone could add a couple of tests to give me an idea of how it's done, I'll gladly start building upon them.

UI Improvements: Now Playing Screen

See 8840755 Now playing UI changes: Initial commit

This is a work in progress, aimed to rework the Now Playing screen with a couple of changes:

The album art is now full-bleed to the top of the screen. A text protection scrim is used to make the contents of the toolbar visible.

The ‘up next’ queue is no longer shown via a FAB, but rather an additional sliding panel at the bottom of the screen.

Much of the work for this fairly major UI change has been undertaken in this commit, however, the landscape mode is completely nerfed. I’ve got some designs/ideas for how the now playing screen should look in landscape mode, but it’s quite different from portrait, so there’s a fair bit of work to be done. The unfinished landscape stuff is a pretty big hurdle for finalising this change.

There are still some bugs to iron out as well, including:

1.) The toolbar doesn’t always respond to the panel slide, sometimes it remains opaque when it should be transparent

2.) The queue seems to disappear, not exactly sure under what circumstances at the moment.

3.) Plenty of others I've forgotten.

Screenshots (portrait):

1
2

Landscape Mockup:

landscape

Feature: Crossfade

My guess is this would be done by managing two MediaPlayer instances, and their volume. Needs to be implemented in such a way that Gapless still works p roperly for those who don't use crossfade.

Improved equalizer

The current EQ is based off of CyanogenMods EQ (which I believe is based off the native Android EQ). It's buggy, doesn't work for everyone, and doesn't sound that good on most devices.

Not sure if there's much that can be done here, within the bounds of the native EQ. Might have to consider 3rd party Audio Players (like Superpowered).

List-grid UI bug

Shuttle version:

v1.6.4

Device, OS:

Moto G (2015), LineageOS 14.1

Description of bug:

List views of Albums and Artists become list-grid hybrid on launch

Steps to reproduce:

  1. Change the album 'view as' mode to grid.
  2. Change the album 'grid size' to 2
  3. Change the album 'view as' mode back to list.
  4. Close & reopen the app.

Video

Expected outcome:

Expected a single-column list.

Observations/Actual Result:

Observed a list with number of columns matching that of Grid Size

Show Changelog on App Launch

When a new version of the app is launched for the first time, it would be good to show the changelog, with an option to close, and perhaps a checkbox with 'don't show changelog on launch' or something..

An entry will also need to be made in Settings to toggle this option.

UI Improvements: Expandable Albums

On the Artist Detail Screen, the idea is to move away from a horizontal list of albums with a vertical list of songs, and instead, move towards a vertical list of albums, which expand/collapse to show the songs. By default, the albums would be expanded.

This work is well underway, and available to see on the branch expandable-albums. See a55f2df Expandable albums: Initial commit

It currently looks like this:

screenshot1

But might potentially look like this:

screenshot2

Unfortunately, I've lost the PSD I used to create this design :(

In any case, this needs some input from a designer!

Extracted from the commit message, here's where this currently stands:

The idea is to use an ExpandableRecyclerView when listing the albums belonging to an artist. The albums are displayed vertically instead of horizontally, and they expand/collapse to show/hide their songs.

Part of the work is done here, but there are some bugs, and some loose ends to tie off.

1.) The album year is displayed, but the MediaStore fails to extract album year info correctly for a lot of albums, so we end up displaying ‘0’, which looks bad.

2.) How should sorting work, now that songs are always grouped by their albums?

3.) The song list item UI needs to change, there’s no point listing the artist and album name in the song item, as both of those things are known by looking at the parent album and it’s parent artist.

4.) There’s an issue with what looks to be the ‘refreshAdapterItems’ appending duplicates to the bottom of the list whenever it’s fired.

5.) There also seems to be an issue with the parallax header thing, the offset grows as you expand/collapse albums - so there’s lots of whitespace at the top of the list.

6.) The UI just needs work in general. Need to talk to a designer.

Bluetooth control not working after connection

  • Version: 1.6.3 (Upgraded)

  • Device: OnePlus 3T (was happening on OnePlus One as well)

  • OS version: Android 7.0 (was happening on previous versions as well)

  • Description: After connecting phone to bluetooth device (tried with headphones and bluetooth in a car), it's not possible to control the player. Simply any playback controls (play/pause, next/prev, is not responding). But after you play a song from widget/app, then it's possible to control it via bluetooth. If you first play a song and later connect to bluetooth, it's possible to control it.

  • Outcome: I assume that the reason it's happening is, that when you connect bluetooth device and app was not running, the broadcast receiver for bluetooth controls is not registered, therefore it can't control the app.

Remember track position

It would be great if the track's position could be remembered. This would make using Shuttle for audiobooks much easier as the tracks tend to be fairly long. One audiobook player goes so far as to show you a pie chart icon on each album. Although in Shuttle's context that is probably only useful when the track's genre is Audiobooks or the album's length is many hours long.

Thanks for having a look!

Audiobook Player:
audiobook player - pie chart icon

use all the space for covers without cropping

Hey there,

all my covers have a 1:1 resolution (500x500, 600x600 etc.).
Would it be possible to make the bar with the media buttons smaller, so no cropping is necessary?

My phone is a HTC One M8.

Search is not working

Nothing is found when searching for artist, no matter how unique the name is. I have tried multiple names with no success.

Error:Execution failed for task ':app:processAmazonFreeReleaseGoogleServices'.

Sir please help me solve this issue.

File google-services.json is missing. The Google Services Plugin cannot function without it.
Searched Location:
C:\Users\user\Shuttle\app\src\amazonFree\release\google-services.json
C:\Users\user\Shuttle\app\src\release\amazonFree\google-services.json
C:\Users\user\Shuttle\app\src\amazonFree\google-services.json
C:\Users\user\Shuttle\app\src\release\google-services.json
C:\Users\user\Shuttle\app\google-services.json

UI Improvements

This is a catch-all ticket for UI improvements. I'll spawn tickets for specific details.

Ideally, UI changes can be discussed here (or in the child tickets), so we can share screenshots and discuss.

I've already started on some fairly major UI redesigns, which I'll publish on separate branches, and describe here later on.

Album Shuffle

Please add a feature to play a random album (similar to shuffle, but by album rather than song). Alternatively, the ability to create a playlist with all albums in random order. In each case, songs within the album would play in standard order.

Artist/Album Issue

I've had an issue for a long while where a large number of artists are missing from the artist tab, and instead are all stored under one artist's name. What I realized all those songs have in common is they have no album name, and therefore are given the default album name "music". I would ask that you either fix this sorting issue, or you just remove the "music" album tag all together, because the app is regestering
all songs with the album name "music" under the same artist in the artist tab. Below are two images to show what I mean.

image1

image2

Add accessibility description to Notification controls

The Notification controls (referenced in MusicService.java), are missing their content descriptions, which is bad for accessibility.

These content descriptions need to be included (see PlayerFragment.java for reference)

Set dev branch as default branch

The default branch is considered the “base” branch in your repository, against which all pull requests and code commits are automatically made, unless you specify a different branch.
Quoting from GitHub Repo settings

Would make it a lot clearer that the branch PRs should go on is the dev branch. It also makes sense having it as the default branch as it is always up to date with the latest development.

Bug: Shuttle Crashes when re-ordering a playlist

Description
It is possible to drag a song in a playlist above the album preview. As soon as I'm dragging it back down, Shuttle crashes.
screenshot_2017-03-01-11-28-49

Reproduction

  1. Go to a playlist and drag a track above the album preview
  2. Drag it below the album preview
  3. Shuttle should crash

Software version
I'm using Shuttle 1.6.4 (upgraded) on a my LG G3 (d855) running Android 6.0

Weaning off of the MediaStore

The MediaStore is the worst thing about Shuttle. It's buggy. Slow to update. It doesn't scan certain paths. Often it doesn't pickup song/album year information. It doesn't tidy up genres when they no longer exist. Worst of all, it makes the FileBrowser almost useless. Shuttle is coupled so tightly to the MediaStore that a song cannot be played unless it is present in the MediaStore.

I've started working on this under a separate library: https://github.com/timusus/MediaProvider but it's barely underway (WIP).

Setup Travis for CI/CD

It would be good to have Travis running to ensure at the very least, Shuttle is compiling after merging changes. Eventually the aim is to have it running tests.

Even better if Travis can build APK's, to automate the release cycle.

With a dark substratum theme, the now playing notification is unreadable.

Title pretty much says everything, i'm using 7.1.1, I don't really think logs are necessary as its easily testable.

Just play a song, look at the notification, while using a dark substratum theme.

A simple tickbox that asks whether or not you're using a dark theme would fix this, but i'm sure there are other, better ways to auto-detect.

Publish APK on Github?

Would you consider publishing the .apk file here at Github – for folks without Playstore access?

Cleaning up / modernising the codebase

I'd like to start using dependency injection, mostly just to get an understanding of how to use it. There's plenty more RX-ifying to be done as well.

I'll start spawning some tickets to cover specific details including:

  • Reworking the old and crappy theming engine

  • Not reusing layout resources (need to use includes a bit more)

  • More to come..

Equalizer toggle not showing 'off' state

  • Shuttle Version: 1.6.4
  • Device, OS: Unknown
  • OS version: Unknown
  • Description: The Equalizer toggle (in EqualizerActivity) remains the same colour whether it's on or off.
  • Steps to reproduce: Open the Equalizer, switch the equalizer on and then off again.
  • Observations: N/A
    -Screenshot:
    http://imgur.com/a/unIwK

'Ghost' notification

User reported issue:

  • Shuttle Version: ?, 1.6.3, 1.6.4
  • Device, OS: Nexus 6p
  • OS version: Stock 7.0
  • Description: Ghost notification is happening again. Not sure what's actually triggering it. Occurs maybe 3/5 times I swipe away the notification. I'm not swiping the app away from recents either.
  • Steps to reproduce: Unknown
  • Observations: N/A

So, to elaborate on this bug:

It seems like the playback notification can appear after the user has already paused the player & dismissed the notification. I'll add some more details as they come to light.

Report No. 2:

The player had auto paused after the bluetooth disconnected, i swiped the notification away and it came back as the ghost notification

Variable Playback speed

Hi,
Thanks for opening the source code for your app!
Could you please add a playback speed feature to Shuttle? I'm used to listening to my podcasts at x1.50.
I know VLC has this feature.

Thanks anyways.

feature request: Endless/infinite mode

I hope that feature requests are allowed 😄

One thing I discovered with a media player was called the "endless" mode. Means that when I listen to a playlist and the playlist finished the app searches for tracks in my db with same or close-to Genres/BPM etc. Like if I have a playlist with like 20 tracks with the Genre DnB it searches automatically for tracks with the Genre DnB in my db so the music never stops. Would be cool to have that.

Inverted notification controls not visible

User report:

  • Shuttle version:
    1.6.4+
  • Device, OS:
    Any, Presumably < API 24
  • Description of bug:
    After choosing the 'invert notification icons/text' option from settings, the buttons become hardly visible (device uses dark background color for notification drawer).

More optional information on widgets like bitrate and codecs

I would really love to be able to show the bitrate and extension/codec of the currently playing media on the Shuttle widgets. Gone Mad Music Player handles this well, with variables, but that music player is just a bit over the top for me.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.