Project Name | Stars | Downloads | Repos Using This | Packages Using This | Most Recent Commit | Total Releases | Latest Release | Open Issues | License | Language |
---|---|---|---|---|---|---|---|---|---|---|
Tizonia Openmax Il | 1,450 | 3 years ago | 125 | lgpl-3.0 | C | |||||
Command-line cloud music player for Linux with support for Spotify, Google Play Music, YouTube, SoundCloud, TuneIn, iHeartRadio, Plex servers and Chromecast devices. | ||||||||||
Soundcloud2000 | 1,350 | 1 | 4 years ago | 1 | October 23, 2013 | 28 | mit | Ruby | ||
A terminal client for https://soundcloud.com | ||||||||||
Harmony | 804 | 6 years ago | 49 | |||||||
:musical_note: Sleek music player for Spotify, SoundCloud, Google Play Music and your local files | ||||||||||
Espera | 232 | 6 years ago | 36 | mit | C# | |||||
Espera is a media player that plays your music, YouTube videos, SoundCloud songs and has a special "party mode". | ||||||||||
Playx | 180 | 3 years ago | 3 | mit | Python | |||||
Search and play any song from terminal | ||||||||||
Playemjs | 87 | 2 | 4 | 2 years ago | 21 | December 10, 2021 | 12 | mit | JavaScript | |
▶️ Streams a list of tracks from Youtube, Soundcloud, Vimeo... | ||||||||||
Cloudradio | 84 | 4 years ago | 4 | mit | PHP | |||||
cloudradio is a web app that plays all songs from the soundcloud charts | ||||||||||
Fusecloud | 73 | 6 years ago | 1 | mit | JavaScript | |||||
A music player made with Fuse | ||||||||||
Music Discord Bot | 67 | 9 months ago | 5 | gpl-3.0 | Python | |||||
A music Discord bot with more than 30+ commands which allows to play music on your server efficiently. Supports Youtube, Spotify, Deezer and Soundcloud links. Skips intros and blanks in the music with Sponsorblock. | ||||||||||
Audioshield Playmusic | 51 | 5 years ago | 5 | JavaScript | ||||||
A Proxy server for Audioshield that replaces Soundcloud support with Play Music support |
Invoke is a full stack web application inspired by soundcloud. It utilizes Ruby on Rails on the backend, a PostgreSQL database, and React.js with a Redux architectural framework on the frontend.
Using a top level react component, Invoke allows you to listen to music whilst seamlessly navigating the site. I have used the react-waveform library in order to dynamically generate waveforms based on the song that is currently playing. The waveforms were a tricky feature to implement, given that they need to communicate effectively with the top level component in order for the positions to sync on both the waveform and the playbar. In order to allow for seamless play, I added two new fields to my audio reducer - a 'token' field, that would be responsible for determining whether the track was currently playing or paused, and a request field, which would be then used by my playbar component to provide the current playbar time to the other component.
The default state for my audio reducer:
const defaultState = {
track_url: "",
user_id: null,
id: null,
token: "",
request: ""
}
The action in my playbar that would provide the playback time:
if (nextProps.audio.request === "REQUEST-TIME"){
this.props.provideAudioPlaybackTime(this.music.currentTime)
}
Below is a gif of the continuous and responsive play in action:
This was perhaps one of the hardest logical challenges when building this website. My playbar dynamically sets the width of the progress component based upon the current playtime of the song in progress. Additionally, I have allowed the user to click on any position on the playbar, as well as to make it draggable, which will result in a change of the current time, and will update the corresponding waveform accordingly.
In order to get the playbar to resize as intended, I used the following code:
let duration = this.music.duration;
let currentTime = this.music.currentTime;
this.fullduration.innerText = (this.timeshow(this.music.duration))
let newval = currentTime/duration;
let res = newval.toLocaleString("en", {minimumFractionDigits: 10, style: "percent"})
this.playbar.style.width = res;
this.timeelapased.innerText = `${this.timeshow(currentTime)}`
let ballval = newval * this.playbarholder.clientWidth
this.ball.style.left = (ballval) + 'px';
The logged in homepage is a pseudo-index container which will show you all the songs posted by the users that you have followed. This page renders multiple waveforms, and is comprised on a number of 'SongplayContainers'. This page will allow you to dynamically choose songs and render waveforms. By clicking play on one song, another will stop.
The code snippet which handles song change:
if (nextProps.audio.token === "PLAYING" && nextProps.audio.id === this.props.song.id) {
this.setState({playing: true, volume: 0, pos: nextProps.audio.time})
} else if (nextProps.audio.token === "PAUSED" && nextProps.audio.id === this.props.song.id) {
this.setState({playing: false, volume: 0, pos: nextProps.audio.time})
} else if(nextProps.audio.id !== this.props.song.id){
this.setState({playing: false, volume: 0, pos: 0})
}
An image of the logged in homepage.
Each User and Song, when created, will be given their own show page. Song show pages will allow for comments on the song, as well as play, and User show pages will allow for play of all of their uploaded songs.
Users can comment on songs, and like them also. My comment feature uses the current music playback time when commenting on the song in question in order to attribute a timestamp to the comment in question based on the song. If the song is not playing, users are assigned a random timestamp, as is the case on SoundCloud.
This app features both user and song CRUD.
I have currently implemented state search, but implementing full database search is the goal.
These will be integral features if the app were ever to be used by the mass market
I would like to make a discover and smart song feature based on the Echo Nest API
It would make sense to store the waveform data for each song in the relevant song model, so that the waveform data does not need to be generated every time the waveform is loaded up.