{"action":"created","issue":{"url":"https://api.github.com/repos/david-sabata/web-scrobbler/issues/755","labels_url":"https://api.github.com/repos/david-sabata/web-scrobbler/issues/755/labels{/name}","comments_url":"https://api.github.com/repos/david-sabata/web-scrobbler/issues/755/comments","events_url":"https://api.github.com/repos/david-sabata/web-scrobbler/issues/755/events","html_url":"https://github.com/david-sabata/web-scrobbler/pull/755","id":104480950,"number":755,"title":"YouTube album/playlist recognition & scrobbling","user":{"login":"janbaykara","id":237556,"avatar_url":"https://avatars.githubusercontent.com/u/237556?v=3","gravatar_id":"","url":"https://api.github.com/users/janbaykara","html_url":"https://github.com/janbaykara","followers_url":"https://api.github.com/users/janbaykara/followers","following_url":"https://api.github.com/users/janbaykara/following{/other_user}","gists_url":"https://api.github.com/users/janbaykara/gists{/gist_id}","starred_url":"https://api.github.com/users/janbaykara/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/janbaykara/subscriptions","organizations_url":"https://api.github.com/users/janbaykara/orgs","repos_url":"https://api.github.com/users/janbaykara/repos","events_url":"https://api.github.com/users/janbaykara/events{/privacy}","received_events_url":"https://api.github.com/users/janbaykara/received_events","type":"User","site_admin":false},"labels":[{"url":"https://api.github.com/repos/david-sabata/web-scrobbler/labels/2:%20FEATURE","name":"2: FEATURE","color":"0b02e1"},{"url":"https://api.github.com/repos/david-sabata/web-scrobbler/labels/3:%20CONNECTOR","name":"3: CONNECTOR","color":"eb6420"}],"state":"open","locked":false,"assignee":null,"milestone":null,"comments":21,"created_at":"2015-09-02T13:27:03Z","updated_at":"2015-10-17T20:06:34Z","closed_at":null,"pull_request":{"url":"https://api.github.com/repos/david-sabata/web-scrobbler/pulls/755","html_url":"https://github.com/david-sabata/web-scrobbler/pull/755","diff_url":"https://github.com/david-sabata/web-scrobbler/pull/755.diff","patch_url":"https://github.com/david-sabata/web-scrobbler/pull/755.patch"},"body":"Closes #122, #655\r\n\r\nThis PR adds recognition of youtube playlists, by searching for lists of timestamp'd songs in the description. As `currentTime` goes on, it will scrobble the relevant track. It also adds generic, complementary `Connector` functionality for parsing playlists if one is recognised.\r\n\r\n#### Connector class changes:\r\n* **New:** `Connector.setThrottleInterval()` - optionally throttles `Connector.stateChangedWorker()`\r\n* **New:** `Connector.getPlaylist()` - looks for & returns a standardised playlist Object of tracks\r\n* **New:** `Connector.playlistIncrementCheck()` - gets the current track, by comparing `Connector.getPlaylist()` against `Connector.getCurrentTime()`\r\n* **Changed:** `Connector.stateChangedWorker()` - now scrobbles identified tracks from `Connector.getPlaylist()` via `Connector.playlistIncrementCheck()`, if a playlist is identified.\r\n\r\n##### Should work with:\r\n* https://youtube.com/watch?v=iyMZl8glVYw (gets `artist` from YouTube title, `track`s from playlist)\r\n* https://youtube.com/watch?v=N-3qILKnSrM (HH:MM:SS timestamps)\r\n* https://youtube.com/watch?v=EzjX0QE_l8U (compilation of different artistTrack)\r\n* https://youtube.com/watch?v=YKkOxFoE5yo (enclosed timestamps + manual timestamp recognition)\r\n* https://youtube.com/watch?v=VFOF47nalCY (funky HTML entities + false-positive artistTrack ID'ing)\r\n* https://youtube.com/watch?v=RW3li2XWgoM (strange jumble of number, timestamp, track name)\r\n* https://youtube.com/watch?v=i5mQ_m5zm6U (PRESERVE lots of numbers all over the place)\r\n* https://youtube.com/watch?v=4Xg1usuLpsM (Gets playlist from a comment)\r\n* https://www.youtube.com/watch?v=9-NFosnfd2c (Removes ridiculous other duration timestamps)\r\n\r\n##### Should **not** work with:\r\n* https://youtube.com/watch?v=EfcY9oFo1YQ (incorrect timestamps => invalid playlist)\r\n* https://youtube.com/watch?v=YqeW9_5kURI (a normal, single-track video)"},"comment":{"url":"https://api.github.com/repos/david-sabata/web-scrobbler/issues/comments/148948089","html_url":"https://github.com/david-sabata/web-scrobbler/pull/755#issuecomment-148948089","issue_url":"https://api.github.com/repos/david-sabata/web-scrobbler/issues/755","id":148948089,"user":{"login":"fedorg","id":4352852,"avatar_url":"https://avatars.githubusercontent.com/u/4352852?v=3","gravatar_id":"","url":"https://api.github.com/users/fedorg","html_url":"https://github.com/fedorg","followers_url":"https://api.github.com/users/fedorg/followers","following_url":"https://api.github.com/users/fedorg/following{/other_user}","gists_url":"https://api.github.com/users/fedorg/gists{/gist_id}","starred_url":"https://api.github.com/users/fedorg/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/fedorg/subscriptions","organizations_url":"https://api.github.com/users/fedorg/orgs","repos_url":"https://api.github.com/users/fedorg/repos","events_url":"https://api.github.com/users/fedorg/events{/privacy}","received_events_url":"https://api.github.com/users/fedorg/received_events","type":"User","site_admin":false},"created_at":"2015-10-17T20:06:34Z","updated_at":"2015-10-17T20:06:34Z","body":"Sure thing, I'll try to simplify the code as I go."}}