Closed SamSJohnson closed 10 years ago
Last time I checked the lyrics were “protected” with JavaScript voodoo. Does the mobile client (Android/iOS) support lyrics?
Thanks for the quick reply. Sorry if this isn't totally coherent, but it's 3:00 a.m. If you need me to explain anything further let me know and I'll get back to you after I sleep a bit.
Yes, I am seeing them below the songs when the album art is small. (Nexus 5 4.4.4 Pandora 5.4) The lyrics for the currently playing song are apparently licensed from LyricFind Inc. The terms of service are "Usage of Lyrics is limited to your personal, non-commercial use in accordance with the terms of this Agreement. You may not reproduce (other than as authorized for your own personal usage), publish, transmit, distribute, publicly display, rent or lend, modify, create derivative works from, sell or participate in the sale of or exploit in any way, in whole or in part, directly or indirectly, any of the Lyrics so provided. You agree that you are not granted any so-called "karaoke" or "sing-along" rights to Lyrics and you shall not seek to or remove any vocal track from a sound recording that shall be associated with a Lyric provided to you. You agree not to assign, transfer or transmit any Lyrics to any third party. You agree that you shall not seek to or do anything that will defeat, evade or circumvent any efforts that may be made to protect the Lyrics from any unauthorized usage." Licensee also agrees that except as specifically authorized herein, the foregoing restrictions apply to their use of Lyrics."
Screenshot for clarity of Pandora's mobile layout: If you tap show more it goes to a screen showing all the lyrics and a link to the TOS above.
Interesting. The old XMLRPC API used to have four lines of a song’s lyrics in its responses body, but pianobar does not use this API any more and I’m not aware of any method for JSON returning lyrics, so it could be a simple WebView.
Can you send me either
1) a network traffic dump (unless encrypted) that includes a) a station change (load new playlist) and b) a tap on the “show more” link? 2) the current Android app’s .apk
Since 1) usually contains sensitive information (auth token) I suggest sending an encrypted email to lars@6xq.net (GPG: 08D8092A)
Alright, you should get the encrypted email soon. I repeated the steps two or three times and when I analyzed the .pcap file, it looked like the pertinent information includes url's which look something like this. http://www.pandora.com/content/mobile/track_detail.vm?fulllyrics=1&token=cf05eeafa347116a425ba2910f7abf8b&pat=VIA5uGCnmpxCLvcGfgRxc9qvAVpegrJ%2FEyEC5zp4m%2FCUN8rbFycPaM3A%3D%3D If the fulllyrics tag isn't present, when the url loads, it doesn't have all of the lyrics shown, just the first four lines as you have apparently seen before. Expect the full traffic dump from ssjssjssjssjssjssjssjssj@gmail.com (GPG: 1599B3BE)
http://www.pandora.com/content/mobile/track_detail.vm?fulllyrics=1&token=cf05eeafa347116a425ba2910f7abf8b&pat=XXX Yep, that’s what we’re looking for. There are two more:
and
The latter actually requests the lyrics, which are – I remembered it correctly – “protected” by a simple XOR cipher:
-- snip -- {"x":function(x) { if (document == null || window == null) return null; var k="baihxeowsmxrqaor"; var r = ""; for(var i=0; i < x.length; i++) { r += a(x.charCodeAt(i) ^ k.charCodeAt(i % k.length)); } return r;},"stat":"ok","credits":"Publisher: Lyrics © BMG RIGHTS MANAGEMENT US, LLC\nSongwriter: STEVEN TYLER","lyrics":"'\u0017\f\u001a\u0001E\u001b\u001e\u001e\bX\u0005\u0019\u0004\u0001R+A\u0005\u0007\u0017\u000eO\u001e\u001dM\f\u001a\u0014A\u0002\u001b\u0010\u0013\u0006\u001ar$\u0003\u001bS\u0019\u0010\u0017\u0002\u0004O\u001e\u000b\u000f\f\u001bX\n\u0001W\u001e\u0014X\u0014\u0010\u0002\nR\u0005\u0004\u001d\u001c\u0011\u000b\bW\u0010\u0001\u001d\u0013\u0003\u0004\u001dx6\t\fH\b\u0004\u001c\u0003S\u0004\u000bR\u0016\u000e\u0001\u0017h(\u001dH\u000f\u0000\u0001\u0003S\u000f\u0001^Q\r\u0006\u0019\u0007A\r\u001d\u000b\u000eO\u0003\u001cM\u001c\u0013\u0006\u000fe;\u0011\u000fN\u001cX\u0011\u0007\u0016\u0007M\f\u001a\u0014A\u0018\u0013\u001bk,\u001e\u001d\u0017\u0016\u0015\u001c\t\u0001U\u0002A\b\u001d\u0016A\u001d\u0000\u001dE\u000b\u0002\u0016\u001eX\u001b\u001fA\u0003\u001b\u0004\u0004I\u001c\u0017E\u001f\u0016\ngr;Q\n\u0001\u001d\u0015A\u0007\u0007\u001a\n\u000b\u000eS\u0006\u0016\u001d\u0006\u0012e%\n\u0004\u001b\rX\f\u001bW\u0010\u0002\u0015\u0017\u0002A\u000e\u001c\u0006A\u001e\u0000\u001d\u0017\nW\u001a\u0019X\u0015\u001e\u0004\u001cx+A\u0002\u0006\u0017\u0012O\u001e\u0007J\u000bR\u0014\u0017\n\u0000\u001b\u0003\u0006\f\u0001E\u001c\u001e\u001dg!\u001d\u0004A\b\u001d\u0016A\u001d\u0007X\t\u0000\u0004\u0016M\f\u001dQ\n\u0001\u001d\u0015A\u0001\u0007\u000fE\u001b\u0018S\u001a\u0011\u001cQke:\u0003\r\u000fH\u0015\u001cO\u001b\u001a\u000b\u001dx8\u0012O\u0010\r\u000e\u0002\u001bTE\u0018\u0005\u001a\u0019\f\u0017\u001fA\u001f\u0013\u0005\u0004\u001ab4\f\u0019\u0012S\f\u0016\u0016Q\r\n\u0013\u0010\u000fI\u000e\n\n\u0002W\u0015\u0002\u0017\u001e\u0002A\u000e\u001c\u0006k/\u001a\u0017\bO\u0004\u0012\n\u001d\u0001{8\u0000\u0007B\n\u0007\u0007\u000fE\u0006\u0003T\u001eX\u0006\u0003\u0014\n^B\u000e\u0001b9\t\u0003W\u0007\u0005\u001d\u0001\u0014A\t\u0017\u0007\r\u0000\u0006\u001f\u0016O\u0014\u001c\u0000\u001dR\u0013\u0000\f\u0019B\u0015\u0006H\u0001\n\u001a}y>\u0011\u001c\u0016A\u0018\u001b\u0016\tI\u0005\u001dIO\u0004\u001a\u0003\u001fR\u0017\u000e\u001dR\u0016\t\fH\u0001\u0000\u000e\u0005\u0000g+\u001b\u001f\u0006O\u0014\r\u0013I\u001c\u0010\u0000O\u001b\u0012\u0018\u001f\u001a\u0005\u0004\u001d^B\u0012\u0000\u0006\u001fE\t\u0018\u0001M\f\u001a\u0014A\u001b\u0017\u0003\u0013\u001ab+\f\u0001\u0010S\u001a\u0011\u0006\u0019A\u0002\u0017NA\u0003\u001d\u000b\u0011O\u0011\u001c\u001fX\u0006\u001e\u0005\u000e\u000bh,\b\u0011\u001a\u0000O\u0003\u001c\u0000\u0017\u0000\u0003\u000e\u0018^B\u0015\u0001\rX\u0002\u0000\u0018\u0017M4\u001d\u0003\u0005O\u0005\u000b\r\u0005H\f\u0004\u0004\u0012S\u0014\u0017\u0007Q\u0000\u0018\u0013\u001bkc1\u001d\u0004\u0007[S\u001e\u0011\u001c\u0016A\u0018\u001b\u0016\tI\u0005\u001dIO\u0004\u001a\u0003\u001fR\u0017\u000e\u001dR\u0016\t\fH\u0001\u0000\u000e\u0005y>\u0011\u001c\u0016A\t\u001d\u0010A\u001d\u0000\u001dE\u0003\u0016\u0006\n\u0010\u0006\u0014\u0013CR\u0011\b\u0007\u000fX\u0003\u0000\u0005S\u0019\u0010\u0017Q\u0015\n\u0013\u0010k:\u0001\u0016\u0002O\u0000\u001a\u0019\u0010R\u001c\u0004CR\b\u0014\u001a\u001cX\u0003\u0000\u0005S\u0019\u0017\u0016\u0010\u0018e?\u0003\u0018\u000b\rX\u0011\u0000\u001a\u001c\u001f\n\u001d\u0006MO\u0006\n\u0004I\u000f\u0017\n\u000bW?\u0002\n\u0016Q\u0016\u0006\u001e\u000eA\u001d\t\u0013\u0000O\u000e\u001c\u0018X\u0013\u0006\u0000\u0016xh%\u001b\r\u0019\bO\u0018\u001dg<\u0000\u0014\u0000\u0002R\r\u000fc,\n\u0000\u000e\u001aS\u0002\u0016x5\u0013\n\u0013\u000fA\u001c\u0006\f\f\u0003W\n\u0002\r\u0000Q\u0005\u001d\u0017\u0003\f\u001aH\u001b\n\u0002\u0012S\u0019\n\u0007\u0014k+\u0000\u0007\u0000\u0004H\u0017\u000be3\u0001\b\u0019\u001fQ\u000e\u0001x&\u0013\f\t\u0015E\u0000\u0019y)\n\u0017\u0010\fO\u0007\f\u0015\u0000\u0004X\u001c\u0000\u0002\u0001M\u001c\u0000\u0014\u0000\u0002\u0001B\u0002\u0006\u0005\u001dE\u001b\u0005\u0006\br6\u0003\u0004\u000e\u001fB\u000e\u0007b<\u0017\n\u0016\u001eM\u0017\u001c{%\u001d\u0017\u0003\fI\u0007\u0016o+\u0005\u0016\f\u0015R\u001e\u000fe6\u0010\u0004\b\u0005X\n\u0001}7\u001f\u001d\u0013\u001cA\u0000\u001ch%\u001b\r\u0019\bO\u0018\u001dgr!\u0018\u000f\bR\u0015\b\u001d\u0000X\b\n[S\u001e\u0011\u001c\u0016A\t\u001d\u0010A\u001d\u0000\u001dE\u0016\u0012\u0012\u001fr!\u0018\u000f\bR\u0004\u000e\u001bH\f\r\nW\u001f\f\r\u0015\u0019\u0015\n\u0000NA\u001a\u0001\u0016\u0002O\u0011\u001c\u001fX\u0006\u0019\u0004O\u0006\u0007\u0000\u001bb+\f\u0001\u0010S\u001a\u0011\u0006\u0019A\u0002\u0017NA\u0003\u001d\u000b\u0011O\u0011\u001c\u001fX\u0006\u001e\u0005\u000e\u000bh,\b\u0011\u001a\u0000O\u0003\u001c\u0000\u0017\u0000\u0003\u000e\u0018^B\u0015\u0001\rX\u0002\u0000\u0018\u0017M4\u001d\u0003\u0005O\u0005\u000b\r\u0005H\f\u0004\u0004\u0012S\u0014\u0017\u0007Q\u0000\u0018\u0013\u001bk:\u0001\u0016\u0002O\u0000\u001a\u0019\u0010R\u001c\u0004CR\u0011\b\u0007\u000fX\u0003\u0000\u0005S\u0019\u0010\u0017Q\u0018\n\u0013\u0010k:\u0001\u0016\u0002O\u0011\u001c\u001fX\u0006\u0019\u0004O\u001e\u0003\u0014\u000e\u0000\f\u0000\u001d[S\u001e\u0011\u001c\u0016A\t\u001d\u0010A\u001d\u0000\u001dE\u001b\u0012\u0012\u001fr!\u0018\u000f\bR\u0015\b\u001d\u0000X\b\n[S\u0007\r\u0001\u0005A\t\u001d\u0010A\u001d\u0007\u001c\u0004\u0016}>\f\u0001\u0010\u0014A\u001b\u001d\u000f\u000e\u001b\u001a\u0017\u0012CW\u0007\u0005\u001dR\u0016\u000e\u0000\u0016B-\u0006\u001a\u001cE\u0018\u001e\u001f\u0001X\u0006\u0010\n\nR\u001b\u000e\u001cH\u0019\u0012\u000e\u000e"} -- snap --
We could parse and decrypt this, but there’s always the chance that Pandora starts changing the “protection” and I don’t want to play this cat and mouse game. Plus we’d have to parse track_detail.vm to get the parameters lyricId and check.
Unfortunately the JSON API pianobar is using does not implement the method “lyrics.getLyrics” (returns code 14) → no lyrics for pianobar.
Darn. Thanks for looking into it for me though. :smile:
I'm not sure how possible this is. Being able to instantly see the lyrics for most songs is one of my favorites of Pandora's website. I was thinking that it might be possible, if Pandora allows it, to get those lyrics much as the song explanations are handled. Is it possible?