Skip to content

Commit

Permalink
feat: port soundcloud calls
Browse files Browse the repository at this point in the history
  • Loading branch information
moul committed Jan 14, 2019
1 parent e2b7530 commit d49375c
Show file tree
Hide file tree
Showing 10 changed files with 5,606 additions and 457 deletions.
3 changes: 2 additions & 1 deletion Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,8 @@ PROTOS = $(call rwildcard, ./, *.proto)
OUR_PROTOS = $(filter-out $(call rwildcard,vendor//,*.proto),$(PROTOS))
GENERATED_FILES = \
$(patsubst %.proto,%.pb.go,$(PROTOS)) \
$(call rwildcard ./, *.gen.go)
$(call rwildcard .//, *.gen.go) \
$(call rwildcard .//, *.pb.gw.go)
PROTOC_OPTS = -I/protobuf:vendor:.
RUN_OPTS ?=

Expand Down
405 changes: 134 additions & 271 deletions api/api.pb.go

Large diffs are not rendered by default.

4 changes: 2 additions & 2 deletions api/api.pb.gw.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

22 changes: 14 additions & 8 deletions api/api.proto
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import "google/api/annotations.proto";
import "github.com/gogo/protobuf/gogoproto/gogo.proto";
//import "google/protobuf/timestamp.proto";
import "pkg/crew/crew.proto";
import "pkg/soundcloud/soundcloud.proto";

option go_package = "ultre.me/calcbiz/api";
option (gogoproto.sizer_all) = true;
Expand Down Expand Up @@ -41,11 +42,11 @@ service Server {
rpc SpreadshirtAll(Void) returns (SpreadshirtAllOutput) { option (google.api.http) = {get: "/api/spreadshirt/all"}; }
rpc Wotd(Void) returns (WotdOutput) { option (google.api.http) = {get: "/api/wotd"}; }
rpc AlternateLogo(Void) returns (AlternateLogoOutput) { option (google.api.http) = {get: "/api/alternate-logo"}; }
rpc SoundcloudMe(Void) returns (SoundcloudMeOutput) { option (google.api.http) = {get: "/api/soundcloud/me"}; }
rpc SoundcloudPlaylists(Void) returns (SoundcloudPlaylistsOutput) { option (google.api.http) = {get: "/api/soundcloud/playlists"}; }
rpc SoundcloudPlaylist(SoundcloudPlaylistInput) returns (SoundcloudPlaylistOutput) { option (google.api.http) = {get: "/api/soundcloud/playlists/{playlist_id}"}; }
rpc SoundcloudTracks(Void) returns (SoundcloudTracksOutput) { option (google.api.http) = {get: "/api/soundcloud/tracks"}; }
rpc SoundcloudTrack(SoundcloudTrackInput) returns (SoundcloudTrackOutput) { option (google.api.http) = {get: "/api/soundcloud/tracks/{track_id}"}; }
rpc SoundcloudMe(Void) returns (calcbiz.soundcloud.User) { option (google.api.http) = {get: "/api/soundcloud/me"}; }
rpc SoundcloudPlaylists(Void) returns (calcbiz.soundcloud.Playlists) { option (google.api.http) = {get: "/api/soundcloud/playlists"}; }
rpc SoundcloudPlaylist(SoundcloudPlaylistInput) returns (calcbiz.soundcloud.Playlist) { option (google.api.http) = {get: "/api/soundcloud/playlists/{playlist_id}"}; }
rpc SoundcloudTracks(Void) returns (calcbiz.soundcloud.Tracks) { option (google.api.http) = {get: "/api/soundcloud/tracks"}; }
rpc SoundcloudTrack(SoundcloudTrackInput) returns (calcbiz.soundcloud.Track) { option (google.api.http) = {get: "/api/soundcloud/tracks/{track_id}"}; }

// SoundcloudAlbums
// Airtable...
Expand Down Expand Up @@ -75,10 +76,15 @@ message RecettatorOutput { /* TODO */ }
message DashboardOutput { /* TODO */ }
message SpreadshirtRandomOutput { /* TODO */ }
message SpreadshirtAllOutput { /* TODO */ }
message SoundcloudMeOutput { /* TODO */ }
message SoundcloudPlaylistsOutput { /* TODO */ }
message SoundcloudPlaylistOutput { /* TODO */ }
message SoundcloudTracksOutput { /* TODO */ }
message SoundcloudTrackOutput { /* TODO */ }
message SoundcloudPlaylistInput { string playlist_id = 1; }
message SoundcloudTrackInput { string track_id = 1; }

message SoundcloudPlaylistInput {
uint64 playlist_id = 1;
}

message SoundcloudTrackInput {
uint64 track_id = 1;
}
1 change: 1 addition & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ require (
go.uber.org/multierr v1.1.0 // indirect
go.uber.org/zap v1.9.1
golang.org/x/net v0.0.0-20190110044637-be1c187aa6c6
google.golang.org/appengine v1.2.0 // indirect
google.golang.org/genproto v0.0.0-20190108161440-ae2f86662275
google.golang.org/grpc v1.17.0
ultre.me/kryptos v0.0.0-20181023194748-240fe1a16033
Expand Down
35 changes: 7 additions & 28 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -43,7 +43,7 @@ func main() {
app.Before = func(c *cli.Context) error {
config := zap.NewDevelopmentConfig()
config.Level.SetLevel(zap.DebugLevel)
config.DisableStacktrace = true
config.DisableStacktrace = false
config.EncoderConfig.EncodeLevel = zapcore.CapitalColorLevelEncoder
l, err := config.Build()
if err != nil {
Expand Down Expand Up @@ -108,8 +108,8 @@ func serverOptionsFromCliContext(c *cli.Context) serverOptions {
GRPCBind: c.String("grpc-bind"),
HTTPBind: c.String("http-bind"),
ServiceOptions: svc.Options{
SoundcloudUserID: c.Int("soundcloud-client-id"),
SoundcloudClientID: c.String("soundcloud-user-id"),
SoundcloudUserID: c.Int("soundcloud-user-id"),
SoundcloudClientID: c.String("soundcloud-client-id"),
},
}
}
Expand Down Expand Up @@ -146,7 +146,10 @@ func startHTTPServer(ctx context.Context, opts *serverOptions) error {
box := packr.NewBox("./static")
mux.Handle("/", http.FileServer(box))

return http.ListenAndServe(opts.HTTPBind, handlers.LoggingHandler(os.Stderr, mux))
handler := handlers.LoggingHandler(os.Stderr, mux)
handler = handlers.RecoveryHandler(handlers.PrintRecoveryStack(true))(handler)

return http.ListenAndServe(opts.HTTPBind, handler)
}

func startGRPCServer(ctx context.Context, opts *serverOptions) error {
Expand Down Expand Up @@ -201,27 +204,3 @@ func startGRPCServer(ctx context.Context, opts *serverOptions) error {
zap.L().Info("starting gRPC server", zap.String("bind", opts.GRPCBind))
return grpcServer.Serve(listener)
}

/*
r := chi.NewRouter()
//r.Use(middleware.RequestID)
//r.Use(middleware.RealIP)
r.Use(middleware.Logger)
r.Use(middleware.Recoverer)
//r.Use(middleware.URLFormat)
r.Use(middleware.Timeout(5 * time.Second))
})
// static files
box := packr.NewBox("./static")
r.Handle("/", http.FileServer(box))
// FIXME: handle socket.io
http.Handle("/", r)
log.Infof("Listening and serving HTTP on %s", c.String("bind-address"))
return http.ListenAndServe(c.String("bind-address"), nil)
}
*/
198 changes: 173 additions & 25 deletions pkg/soundcloud/soundcloud.go
Original file line number Diff line number Diff line change
@@ -1,24 +1,24 @@
package calcsoundcloud
package soundcloud

import (
"math/rand"
"net/url"
"strings"

"github.com/shazow/memoizer"
"github.com/yanatan16/golang-soundcloud/soundcloud"
gosoundcloud "github.com/yanatan16/golang-soundcloud/soundcloud"
)

type CALCSoundcloud struct {
client *soundcloud.Api
type Soundcloud struct {
client *gosoundcloud.Api
clientID string
userID uint64
cache memoizer.Memoize
}

func New(clientID string, userID uint64) CALCSoundcloud {
return CALCSoundcloud{
client: &soundcloud.Api{
func New(clientID string, userID uint64) Soundcloud {
return Soundcloud{
client: &gosoundcloud.Api{
ClientId: clientID,
},
clientID: clientID,
Expand All @@ -29,50 +29,198 @@ func New(clientID string, userID uint64) CALCSoundcloud {
}
}

func (s *CALCSoundcloud) EscapeString(input string) string {
func (s *Soundcloud) EscapeString(input string) string {
return strings.Replace(input, s.clientID, "<SOUNDCLOUD_CLIENT_ID>", -1)
}

func (s *CALCSoundcloud) Me() (*soundcloud.User, error) {
func (s *Soundcloud) Me() (*User, error) {
user, err := s.cache.Call(s.client.User(s.userID).Get, url.Values{})
return user.(*soundcloud.User), err
if err != nil {
return nil, err
}
return fromSoundcloudUser(user.(*gosoundcloud.User)), nil
}

func (s *CALCSoundcloud) Playlists() ([]*soundcloud.Playlist, error) {
func (s *Soundcloud) GetPlaylists() (*Playlists, error) {
playlists, err := s.cache.Call(s.client.User(s.userID).Playlists, url.Values{})
return playlists.([]*soundcloud.Playlist), err
if err != nil {
return nil, err
}
return fromSoundcloudPlaylists(playlists.([]*gosoundcloud.Playlist)), nil
}

func (s *CALCSoundcloud) Playlist(playlistID uint64) (*soundcloud.Playlist, error) {
inline := func(playlistID uint64) (*soundcloud.Playlist, error) {
func (s *Soundcloud) GetPlaylist(playlistID uint64) (*Playlist, error) {
inline := func(playlistID uint64) (*gosoundcloud.Playlist, error) {
return s.client.Playlist(playlistID).Get(nil)
}
playlist, err := s.cache.Call(inline, playlistID)
return playlist.(*soundcloud.Playlist), err
if err != nil {
return nil, err
}
return fromSoundcloudPlaylist(playlist.(*gosoundcloud.Playlist)), nil
}

func (s *CALCSoundcloud) Track(trackID uint64) (*soundcloud.Track, error) {
inline := func(trackID uint64) (*soundcloud.Track, error) {
func (s *Soundcloud) GetTrack(trackID uint64) (*Track, error) {
inline := func(trackID uint64) (*gosoundcloud.Track, error) {
return s.client.Track(trackID).Get(nil)
}
track, err := s.cache.Call(inline, trackID)
return track.(*soundcloud.Track), err
if err != nil {
return nil, err
}
return fromSoundcloudTrack(track.(*gosoundcloud.Track)), nil
}

func (s *Soundcloud) GetRandomTrack() (*Track, error) {
tracks, err := s.GetTracks()
if err != nil {
return nil, err
}

return tracks.Tracks[rand.Intn(len(tracks.Tracks))], nil
}

func (s *CALCSoundcloud) RandomTrack() (*soundcloud.Track, error) {
tracks, err := s.tracks()
func (s *Soundcloud) GetRandomPlaylist() (*Playlist, error) {
playlists, err := s.GetPlaylists()
if err != nil {
return nil, err
}

return tracks[rand.Intn(len(tracks))], nil
return playlists.Playlists[rand.Intn(len(playlists.Playlists))], nil
}

func (s *CALCSoundcloud) tracks() ([]*soundcloud.Track, error) {
func (s *Soundcloud) GetTracks() (*Tracks, error) {
tracks, err := s.cache.Call(s.client.User(s.userID).Tracks, url.Values{})
return tracks.([]*soundcloud.Track), err
if err != nil {
return nil, err
}
return fromSoundcloudTracks(tracks.([]*gosoundcloud.Track)), nil
}

func fromSoundcloudPlaylists(input []*gosoundcloud.Playlist) *Playlists {
playlists := &Playlists{}
for _, playlist := range input {
playlists.Playlists = append(playlists.Playlists, fromSoundcloudPlaylist(playlist))
}
return playlists
}

func fromSoundcloudTracks(input []*gosoundcloud.Track) *Tracks {
tracks := &Tracks{}
for _, track := range input {
tracks.Tracks = append(tracks.Tracks, fromSoundcloudTrack(track))
}
return tracks
}

func (s *CALCSoundcloud) Tracks() ([]*soundcloud.Track, error) {
return s.tracks()
func fromSoundcloudPlaylist(input *gosoundcloud.Playlist) *Playlist {
return &Playlist{
ID: input.Id,
CreatedAt: input.CreatedAt,
Title: input.Title,
Sharing: input.Sharing,
EmbeddableBy: input.EmbeddableBy,
PurchaseUrl: input.PurchaseUrl,
ArtworkUrl: input.ArtworkUrl,
Description: input.Description,
Duration: input.Duration,
Genre: input.Genre,
SharedToCount: input.SharedToCount,
TagList: input.TagList,
ReleaseDay: uint32(input.ReleaseDay),
ReleaseMonth: uint32(input.ReleaseMonth),
ReleaseYear: uint32(input.ReleaseYear),
Streamable: input.Streamable,
Downloadable: input.Downloadable,
Ean: input.EAN,
PlaylistType: input.PlaylistType,
Tracks: fromSoundcloudTracks(input.Tracks).Tracks,
Uri: input.Uri,
Label: fromSoundcloudUser(input.Label),
LabelId: input.LabelId,
LabelName: input.LabelName,
User: fromSoundcloudUser(input.User),
UserId: input.UserId,
Permalink: input.Permalink,
PermalinkUrl: input.PermalinkUrl,
}
}

func fromSoundcloudTrack(input *gosoundcloud.Track) *Track {
return &Track{
ID: input.Id,
CreatedAt: input.CreatedAt,
Title: input.Title,
Sharing: input.Sharing,
EmbeddableBy: input.EmbeddableBy,
PurchaseUrl: input.PurchaseUrl,
ArtworkUrl: input.ArtworkUrl,
Description: input.Description,
Duration: input.Duration,
Genre: input.Genre,
SharedToCount: input.SharedToCount,
TagList: input.TagList,
ReleaseDay: uint32(input.ReleaseDay),
ReleaseMonth: uint32(input.ReleaseMonth),
ReleaseYear: uint32(input.ReleaseYear),
Streamable: input.Streamable,
Downloadable: input.Downloadable,
State: input.State,
License: input.License,
TrackType: input.TrackType,
WaveformUrl: input.WaveformUrl,
DownloadUrl: input.DownloadUrl,
StreamUrl: input.StreamUrl,
VideoUrl: input.VideoUrl,
Bpm: float32(input.Bpm),
Commentable: input.Commentable,
ISRC: input.ISRC,
KeySignature: input.KeySignature,
CommentCount: input.CommentCount,
DownloadCount: input.DownloadCount,
PlaybackCount: input.PlaybackCount,
FavoritingsCount: input.FavoritingsCount,
OriginalFormat: input.OriginalFormat,
OriginalContentSize: input.OriginalContentSize,
AssetData: input.AssetData,
ArtworkData: input.ArtworkData,
UserFavorite: input.UserFavorite,
Uri: input.Uri,
Label: fromSoundcloudUser(input.Label),
LabelId: input.LabelId,
LabelName: input.LabelName,
User: fromSoundcloudUser(input.User),
UserId: input.UserId,
Permalink: input.Permalink,
PermalinkUrl: input.PermalinkUrl,
}
}

func fromSoundcloudUser(input *gosoundcloud.User) *User {
if input == nil {
return nil
}
return &User{
ID: input.Id,
Username: input.Username,
AvatarURL: input.AvatarUrl,
Country: input.Country,
FullName: input.FullName,
City: input.City,
Description: input.Description,
DiscogsName: input.DiscogsName,
MyspaceName: input.MyspaceName,
Website: input.Website,
WebsiteTitle: input.WebsiteTitle,
Online: input.Online,
TrackCount: input.TrackCount,
PlaylistCount: input.PlaylistCount,
FollowersCount: input.FollowersCount,
FollowingsCount: input.FollowingsCount,
PublicFavoritesCount: input.PublicFavoritesCount,
AvatarData: input.AvatarData,
Uri: input.Uri,
Permalink: input.Permalink,
PermalinkURL: input.PermalinkUrl,
}
}
Loading

0 comments on commit d49375c

Please sign in to comment.