|
682 | 682 | end
|
683 | 683 |
|
684 | 684 | response = Soundcloud.get("/resolve", query: { url: "https://soundcloud.com/#{username}" })
|
685 |
| - if response.code == 302 |
686 |
| - uri = Addressable::URI.parse(response.json["location"]) |
687 |
| - return [404, "URL does not resolve to a user."] if !uri.path.start_with?("/users/") |
688 |
| - id = uri.path[/\d+/] |
| 685 | + if response.code == 200 |
| 686 | + data = response.json |
| 687 | + data = data["user"] if data.has_key?("user") |
| 688 | + return [404, "Can't identify the user."] if data["kind"] != "user" |
689 | 689 | elsif response.code == 404 && username.numeric?
|
690 | 690 | response = Soundcloud.get("/users/#{username}")
|
691 |
| - return [response.code, "Can't find a user with that id. Sorry."] if response.code == 404 |
| 691 | + return [response.code, "Can't find a user with that id. Sorry."] if response.code == 400 || response.code == 404 |
692 | 692 | raise(SoundcloudError, response) if !response.success?
|
693 |
| - id = response.json["id"] |
| 693 | + data = response.json |
694 | 694 | elsif response.code == 404
|
695 | 695 | return [response.code, "Can't find a user with that name. Sorry."]
|
696 | 696 | else
|
697 | 697 | raise(SoundcloudError, response)
|
698 | 698 | end
|
699 | 699 |
|
700 |
| - response = Soundcloud.get("/users/#{id}") |
701 |
| - raise(SoundcloudError, response) if !response.success? |
702 |
| - data = response.json |
703 |
| - |
704 | 700 | redirect Addressable::URI.new(path: "/soundcloud/#{data["id"]}/#{data["permalink"]}").normalize.to_s
|
705 | 701 | end
|
706 | 702 |
|
|
709 | 705 | url = "https://#{url}" if !url.start_with?("http:", "https:")
|
710 | 706 | response = Soundcloud.get("/resolve", query: { url: url })
|
711 | 707 | return [response.code, "URL does not resolve."] if response.code == 404
|
712 |
| - raise(SoundcloudError, response) if response.code != 302 |
713 |
| - uri = Addressable::URI.parse(response.json["location"]) |
714 |
| - return [404, "URL does not resolve to a track."] if !uri.path.start_with?("/tracks/") |
715 |
| - response = Soundcloud.get("#{uri.path}/stream") |
716 |
| - raise(SoundcloudError, response) if response.code != 302 |
717 |
| - media_url = response.json["location"] |
| 708 | + raise(SoundcloudError, response) if response.code != 200 |
718 | 709 |
|
719 |
| - if env["HTTP_ACCEPT"] == "application/json" |
720 |
| - response = Soundcloud.get("#{uri.path}") |
721 |
| - content_type :json |
722 |
| - data = response.json |
723 |
| - created_at = Time.parse(data["created_at"]) |
724 |
| - return { |
725 |
| - url: media_url, |
726 |
| - filename: "#{created_at.to_date} - #{data["title"]}.mp3".to_filename, |
727 |
| - }.to_json |
728 |
| - end |
| 710 | + data = response.json |
| 711 | + return [404, "URL does not resolve to a track."] if data["kind"] != "track" |
729 | 712 |
|
730 |
| - redirect media_url |
| 713 | + data_uri = Addressable::URI.parse(data["media"]["transcodings"][0]["url"]) |
| 714 | + response = Soundcloud.get(data_uri.path) |
| 715 | + raise(SoundcloudError, response) if response.code != 200 |
| 716 | + |
| 717 | + url = response.json["url"] |
| 718 | + fn = "#{Date.parse(data["created_at"])} - #{data["title"]}.mp3".to_filename |
| 719 | + |
| 720 | + "ffmpeg -i '#{url}' -acodec copy '#{fn}'" |
731 | 721 | end
|
732 | 722 |
|
733 | 723 | get %r{/soundcloud/(?<id>\d+)/(?<username>.+)} do |id, username|
|
|
737 | 727 | return [404, "That user no longer exist."] if response.code == 500 && response.body == '{"error":"Match failed"}'
|
738 | 728 | raise(SoundcloudError, response) if !response.success?
|
739 | 729 |
|
740 |
| - @data = response.json |
| 730 | + @data = response.json["collection"] |
741 | 731 | @username = @data[0]["user"]["permalink"] rescue CGI.unescape(username)
|
742 | 732 | @user = @data[0]["user"]["username"] rescue CGI.unescape(username)
|
743 | 733 |
|
|
0 commit comments