diff --git a/.csslintrc b/.csslintrc deleted file mode 100644 index 1c791fbd17..0000000000 --- a/.csslintrc +++ /dev/null @@ -1,4 +0,0 @@ -{ - "gradients": false, - "ids": false -} diff --git a/Gruntfile.js b/Gruntfile.js index 31361cc07e..422e9b13db 100644 --- a/Gruntfile.js +++ b/Gruntfile.js @@ -6,7 +6,6 @@ module.exports = function(grunt) { var jsConnectorFiles = ['connectors/v2/*.js', 'connectors/22tracks.js', 'connectors/archive.js', 'connectors/bandcamp.js', 'connectors/blinkboxmusic.js', 'connectors/ambientsleepingpill.js']; // intentionally does not contain all files yet var jsCoreFiles = ['Gruntfile.js', 'popup.js', 'core/**/*.js', 'options/options.js', 'popups/*.js']; var jsonFiles = ['*.json', '.jshintrc']; - var htmlFiles = ['*.html', 'options/*.html', 'popups/*.html', 'dialogs/**/*.html']; var cssFiles = ['options/options.css', 'popups/base.css', 'dialogs/base.css']; grunt.initConfig({ @@ -30,7 +29,7 @@ module.exports = function(grunt) { lintspaces: { all: { src: [ - jsCoreFiles, jsConnectorFiles, cssFiles, htmlFiles + jsCoreFiles, jsConnectorFiles, cssFiles ], options: { @@ -45,14 +44,6 @@ module.exports = function(grunt) { sample: { src: [ jsonFiles ] } - }, - csslint: { - options: { - csslintrc: '.csslintrc' - }, - strict: { - src: [cssFiles] - } } }); @@ -61,7 +52,6 @@ module.exports = function(grunt) { grunt.loadNpmTasks('grunt-contrib-compress'); grunt.loadNpmTasks('grunt-lintspaces'); grunt.loadNpmTasks('grunt-jsonlint'); - grunt.loadNpmTasks('grunt-contrib-csslint'); - grunt.registerTask('lint', ['jshint', 'csslint']); + grunt.registerTask('lint', ['jshint']); grunt.registerTask('default', ['lint', 'lintspaces', 'jsonlint']); }; diff --git a/connectors/8tracks.js b/connectors/8tracks.js new file mode 100644 index 0000000000..1bb805379f --- /dev/null +++ b/connectors/8tracks.js @@ -0,0 +1,140 @@ +/* + * Chrome-Last.fm-Scrobbler 8tracks Connector + * + * Matt Runkle - matt[at]mrunkle[dot]com + * + */ + +/*** Configuration ***/ + +// Additions to this div will trigger update +WATCHED_CONTAINER = "#tracks_played"; + +// Returns the currently playing artist name +function getArtist( ) { + return cleanLabel( $("#now_playing div.title_artist > span.a:first").text() ); +} + +// Returns the currently playing track title +function getTrack( ) { + return cleanLabel( $("#now_playing div.title_artist > span.t:first").text() ); +} + +function getAlbum( ) { + return cleanLabel( $("#now_playing div.album > span.detail:first").text() ); +} + +// Returns the number of pixels denoting the time expired in the song +function getPercentDone( ) { + var width = parseInt( $("div#player_progress_bar").width() ); + return parseInt( $("div#player_progress_bar_meter").width() ) / width; +} + +// Perform some common cleanup of artist/song/album strings +function cleanLabel( label ) { + label = label.replace( '&', '&' ); + return $.trim( label ); +} + +/*** Scrobbler Interface ***/ +LAST_TRACK = ""; +TIMEOUT = ""; + +TIME_PERCENT = 10; +START_TIME = 0; + +// Since we can't just pull the song duration from the DOM +// we need to estimate. Luckily there is a nice progress bar +function tryScrobble() { + var ratio = getPercentDone(); + + if ( ratio > (1/TIME_PERCENT) ) { + // Measured enough, estimate time and scrobble + var endTime = new Date().getTime(); + var elapsed = (endTime - START_TIME) / 1000; + + TIMEOUT = ""; + START_TIME = 0; + updateNowPlaying(elapsed); + return; + } + + // Set timeout based on about how long we have left, max 50s / percent + TIMEOUT = setTimeout( tryScrobble, Math.min(500 / ratio, 50000 / TIME_PERCENT) ); +} + +// Validates and scrobbles the currently playing song +function updateNowPlaying(elapsed) { + elapsed = Math.floor(elapsed); + var duration = elapsed * TIME_PERCENT; + var title = getTrack(); + var artist = getArtist(); + var album = getAlbum(); + var newTrack = title + " " + artist; + + // Update scrobbler if necessary + if ( newTrack != " " && newTrack != LAST_TRACK ) { + //console.log("Submitting a now playing request. artist: "+artist+", title: "+title+", album: " + album + ", duration: " + duration); + + LAST_TRACK = newTrack; + chrome.runtime.sendMessage({type: 'validate', artist: artist, track: title}, function(response) { + if (response != false) { + // submit the validated song for scrobbling + var song = response; + chrome.runtime.sendMessage({type: 'nowPlaying', artist: song.artist, track: song.track, + album: (album === "") ? null : album, currentTime: elapsed, duration: duration}); + } else { + // on failure send nowPlaying 'unknown song' + console.log( "Song validation failed!" ); + chrome.runtime.sendMessage({type: 'nowPlaying', currentTime: elapsed, duration: duration}); + } + }); + } +} + +function triggerUpdate() { + var nowPlaying = getTrack() + " " + getArtist(); + + if ( nowPlaying != " " && nowPlaying != LAST_TRACK ) { + START_TIME = new Date().getTime(); + + // Stop any non-scrobbled songs (i.e. song skipped) + if( TIMEOUT != "" ) { + clearTimeout( TIMEOUT ); + } + + // Schedule the next scrobble + TIMEOUT = setTimeout( tryScrobble, 500 ); + + return; + } +} + +// Attach listener for song changes, filter out duplicate event firings +$(function(){ + console.log("8tracks module starting up"); + + // Attach listener to "recently played" song list + $(WATCHED_CONTAINER).live('DOMNodeInserted', function(e) { + setTimeout( triggerUpdate, 500 ); // let player update + }); + + $(window).unload(function() { + chrome.runtime.sendMessage({type: 'reset'}); + return true; + }); +}); + +/** + * Listen for requests from scrobbler.js + */ +chrome.runtime.onMessage.addListener( + function(request, sender, sendResponse) { + switch(request.type) { + // background calls this to see if the script is already injected + case 'ping': + sendResponse(true); + break; + } + } +); \ No newline at end of file diff --git a/connectors/archive.js b/connectors/archive.js new file mode 100644 index 0000000000..204480416b --- /dev/null +++ b/connectors/archive.js @@ -0,0 +1,112 @@ +/* + * Chrome-Last.fm-Scrobbler archive.org Connector by Malachi Soord + * (based on George Pollard's bandcamp connctor) + * v0.1 + */ +'use strict'; + +var lastTrack = null; + +$(function () { + // bind page unload function to discard current "now listening" + cancel(); +}); + +var durationElapsed = '#jw6_controlbar_elapsed'; +var durationTotal = '#jw6_controlbar_duration'; +var durationRegex = /(\d+):(\d+)/; + +function parseDuration(elapsed, total) { + try { + var mEla = durationRegex.exec(elapsed); + var mTot = durationRegex.exec(total); + return { + current: parseInt(mEla[1], 10) * 60 + parseInt(mEla[2], 10), + total: parseInt(mTot[1], 10) * 60 + parseInt(mTot[2], 10) + }; + } catch (err) { + return 0; + } +} + +function parseArtist() { + return $('span.key:contains("Artist/Composer:"), span.key:contains("Band/Artist:")').next().text(); +} + +function parseTitle() { + + // Get title directly from player + var title = $('.playing > .ttl').text(); + + // Some titles are stored as artist - track # - title so strip out non-title elements + var parts = title.split('-'); + if (parts.length === 3 && parts[0].trim() === parseArtist()) { + title = parts[2].trim(); + } + + return title; +} + +function parseAlbum() { + var album = $('.x-archive-meta-title').text(); + + // Remove artist from album + var parts = album.split('-'); + if (parts.length > 0 && parts[0].trim() === parseArtist()) { + album = album.substr(album.indexOf('-') + 1).trim(); + } + + return album; +} + +function cancel() { + $(window).unload(function () { + // reset the background scrobbler song data + chrome.runtime.sendMessage({ + type: 'reset' + }); + return true; + }); +} + +// console.log('Archive.org: loaded'); + +$(durationElapsed).live('DOMSubtreeModified', function () { + + var duration = parseDuration($(durationElapsed).text(), $(durationTotal).text()); + + // console.log('duration - ' + duration.current + ' / ' + duration.total); + + if (duration.current > 0) { // it's playing + + var artist = parseArtist(); + var track = parseTitle(); + var album = parseAlbum(); + + if (lastTrack !== track) { + lastTrack = track; + + console.log('Archive.org: scrobbling - Artist: ' + artist + '; Album: ' + album + '; Track: ' + track + '; duration: ' + duration.total); + chrome.runtime.sendMessage({ + type: 'validate', + artist: artist, + track: track + }, function (response) { + if (response !== false) { + chrome.runtime.sendMessage({ + type: 'nowPlaying', + artist: response.artist, + track: response.track, + duration: duration.total, + album: album + }); + } else { + chrome.runtime.sendMessage({ + type: 'nowPlaying', + duration: duration.total + }); + } + }); + } + } +}); diff --git a/connectors/turntable.js b/connectors/turntable.js new file mode 100644 index 0000000000..2da6dc4184 --- /dev/null +++ b/connectors/turntable.js @@ -0,0 +1,95 @@ +/* + * Chrome-Last.fm-Scrobbler TurnTable.FM Connector + * + * Matt Runkle - matt[at]mrunkle[dot]com + * + * Inspired by Pandora connector, written by Jordan Perr, jordan[at]jperr[dot]com + */ + +/*** Configuration ***/ + +// Additions to this div will trigger update +TT_WATCHED_CONTAINER = "div#song-log"; + +// Returns the currently playing artist name +function TT_getArtist( ) { + var details = $("div#song-log div.details span:first").html(); + return TT_cleanLabel( details.replace(/^| div:nth-child(6) > div > div.col-sm-8.thats-left > h1').text().trim() || null; - }; - - Connector.getArtist = function() { - return parseArtist(); - }; - - Connector.getTrack = function() { - var track = $('.jwrowV2.playing .ttl').text(); - - var parts = track.split('-'); - if (parts.length === 3 && parts[0].trim() === parseArtist()) { - track = parts[2].trim(); - } - - return track; - }; - - Connector.isPlaying = function() { - return !$('video')[0].paused; - }; - - Connector.getTrackArt = function() { - return $('#theatre-ia > div > div > div.row > div.col-xs-12.col-sm-6.col-md-5.col-lg-4 > center > img').attr('src') || null; - }; - - function parseArtist() { - var artist = $('#wrap > div:nth-child(6) > div > div.col-sm-8.thats-left > div:nth-child(3) > a').text(); - - if (artist.length === 0) { - artist = $('#wrap > div:nth-child(6) > div > div.col-sm-8.thats-left > div:nth-child(3) > span.value > a').text(); - } - - return artist; - } -} - -function bindLegacy() { - - Connector.playerSelector = '#avplaydiv'; - - Connector.currentTimeSelector = '#jw6_controlbar_elapsed'; - - Connector.getAlbum = function() { - var album = $('.x-archive-meta-title').text(); - - // Remove artist from album - var parts = album.split('-'); - if (parts.length > 0 && parts[0].trim() === parseArtist()) { - album = album.substr(album.indexOf('-') + 1).trim(); - } - - return album; - }; - - Connector.getArtist = function() { - return parseArtist(); - }; - - Connector.getTrack = function() { - // Get title directly from player - var title = $('.playing > .ttl').text(); - - // Some titles are stored as artist - track # - title so strip out non-title elements - var parts = title.split('-'); - if (parts.length === 3 && parts[0].trim() === parseArtist()) { - title = parts[2].trim(); - } - - return title; - }; - - Connector.isPlaying = function() { - return !$('video')[0].paused; - }; - - Connector.getTrackArt = function() { - return $('#col1 > div:nth-child(1) > div:nth-child(2) > img').attr('src') || null; - }; - - function parseArtist() { - return $('span.key:contains("Artist/Composer:"), span.key:contains("Band/Artist:")').next().text(); - } -} diff --git a/connectors/v2/audiosplitter.js b/connectors/v2/audiosplitter.js deleted file mode 100644 index a3402147a4..0000000000 --- a/connectors/v2/audiosplitter.js +++ /dev/null @@ -1,25 +0,0 @@ -'use strict'; - -/* global Connector */ - -Connector.playerSelector = '.player'; - -Connector.trackSelector = '.p-song-info > a'; - -Connector.getArtist = function () { - var text = $('.p-artist').text(); - return text.length !== 0 ? text.substring(2) : null; -}; - -Connector.getCurrentTime = function() { - return $('span.p-time.ng-binding').text().split('/')[0].trim(); -}; - -Connector.isPlaying = function() { - return !$('a.as-icon.as-icon-play').hasClass('ng-hide'); -}; - -Connector.getUniqueID = function ( ) { - var text = $('.p-song-info > a').attr('href'); - return text.length > 8 ? text.substring(8) : null; -}; diff --git a/connectors/v2/mixcloud.js b/connectors/v2/mixcloud.js index 215bd5eef1..6a2ac02039 100644 --- a/connectors/v2/mixcloud.js +++ b/connectors/v2/mixcloud.js @@ -2,7 +2,23 @@ /* global Connector */ -Connector.playerSelector = 'div.player-current-audio'; +/* In lieu of playerSelector, custom detection of player state changes to allow loading and scrubbing to be ignored. + .player-handle:active occurs when user is scrubbing + .loading-state.spin classes are attached to play button during load +*/ +var observer = new window.MutationObserver(function () { + if (!$('.player-handle:active')[0] && !$('.loading-state.spin')[0]) { + Connector.onStateChanged(); + } +}); +var observeTarget = document.querySelector('div.player-current-audio'); +var config = { + childList: true, + subtree: true, + attributes: true, + characterData: true +}; +observer.observe(observeTarget, config); Connector.artistSelector = '.current-artist .ng-binding'; @@ -11,11 +27,3 @@ Connector.trackSelector = '.current-track'; Connector.isPlaying = function () { return $('.player-control.pause-state').is(':visible'); }; - -/* Ignore changes while loading and scrubbing. - * .player-handle:active occurs when user is scrubbing - * .loading-state.spin classes are attached to play button during load -*/ -Connector.isStateChangeAllowed = function () { - return (!$('.player-handle:active')[0] && !$('.loading-state.spin')[0]); -}; diff --git a/connectors/v2/novoeradio.js b/connectors/v2/novoeradio.js deleted file mode 100644 index e6f0226df4..0000000000 --- a/connectors/v2/novoeradio.js +++ /dev/null @@ -1,10 +0,0 @@ -'use strict'; - -/* global Connector */ - -Connector.playerSelector = '.player-container'; -Connector.trackSelector = '.player-container > div.play-author > div > div.label-play-author > p.author.ng-binding'; -Connector.artistSelector = '.player-container > div.play-author > div > div.label-play-author > p.label-m.ng-binding'; -Connector.isPlaying = function() { - return ($('.player-container > div.play-author > a > div > svg.icon.icon-play').css('display') == 'none'); -}; diff --git a/connectors/v2/slacker2.js b/connectors/v2/slacker2.js index dffe25961c..6874b00baa 100644 --- a/connectors/v2/slacker2.js +++ b/connectors/v2/slacker2.js @@ -17,13 +17,3 @@ Connector.getDuration = function () { return Connector.stringToSeconds($(Connector.currentTimeSelector).text() || '') + Connector.stringToSeconds($('#progressContainer span:last').text() || ''); }; - -Connector.trackArtImageSelector = 'td.art img'; - -/* At end of song, current time becomes "0:00" for a brief time before changing song info - * which the controller treats as a rewind and a notification is displayed. - * To overcome this, don't allow state change if current time is 0:00. - */ -Connector.isStateChangeAllowed = function () { - return $(Connector.currentTimeSelector).text() !== '0:00'; -}; diff --git a/connectors/v2/tradiio.js b/connectors/v2/tradiio.js deleted file mode 100644 index 10df590b7a..0000000000 --- a/connectors/v2/tradiio.js +++ /dev/null @@ -1,21 +0,0 @@ -'use strict'; - -/* global Connector */ - -Connector.playerSelector = '.leftmusicplayer'; - -Connector.artistSelector = '.leftmusicplayer .player-artist-name'; - -Connector.trackSelector = '.leftmusicplayer .musicname a:first'; - -Connector.playButtonSelector = '.leftmusicplayer .section-controls .btn-play'; - -Connector.getDuration = function() { - return Connector.stringToSeconds($('.leftmusicplayer .songDuration').text()) || null; -}; - -Connector.currentTimeSelector = '.leftmusicplayer .songDuration.s-progress'; - -Connector.getTrackArt = function () { - return $('.leftmusicplayer .cover-small img').attr('src').replace('-square.jpg', '-normal.jpg'); -}; diff --git a/core/connectors.js b/core/connectors.js index 16efc2de8e..cfd6099b3d 100644 --- a/core/connectors.js +++ b/core/connectors.js @@ -220,6 +220,12 @@ define(function() { js: ['connectors/plugdj.js'] }, + { + label: 'Turntable', + matches: ['*://turntable.fm/*'], + js: ['connectors/turntable.js'] + }, + { label: 'Slacker (iframe)', matches: ['*://www.slacker.com/webplayer/index_embed.vm'], @@ -260,8 +266,7 @@ define(function() { { label: '8tracks', matches: ['*://8tracks.com/*'], - js: ['connectors/v2/8tracks.js'], - version: 2 + js: ['connectors/8tracks.js'] }, { @@ -414,8 +419,7 @@ define(function() { { label: 'Archive.org', matches: ['*://archive.org/details/*'], - js: ['connectors/v2/archive.js'], - version: 2 + js: ['connectors/archive.js'] }, { @@ -543,27 +547,6 @@ define(function() { matches: ['*://kollekt.fm/*'], js: ['connectors/v2/kollekt.js'], version: 2 - }, - - { - label: 'audiosplitter.fm', - matches: ['*://audiosplitter.fm/*'], - js: ['connectors/v2/audiosplitter.js'], - version: 2 - }, - - { - label: 'novoeradio.by', - matches: ['*://www.novoeradio.by/*'], - js: ['connectors/v2/novoeradio.js'], - version: 2 - }, - - { - label: 'Tradiio', - matches: ['*://*tradiio.com/*'], - js: ['connectors/v2/tradiio.js'], - version: 2 } ]; diff --git a/core/content/connector.js b/core/content/connector.js index cbfef590a6..e5e2482a7f 100644 --- a/core/content/connector.js +++ b/core/content/connector.js @@ -214,16 +214,6 @@ var BaseConnector = window.BaseConnector || function () { return this.trackArtImageSelector === null ? null : $(this.trackArtImageSelector).attr('src'); }; - /** - * Default implementation of a check to see if a state change is allowed. - * MutationObserver will ignore mutations while this function returns false. - * - * Override this method to allow certain states to be ignored, for example if an advert is playing. - * @return {Boolean} - */ - this.isStateChangeAllowed = function () { - return true; - }; // --- state & api ------------------------------------------------------------------------------------------------- diff --git a/core/content/starter.js b/core/content/starter.js index 0e51931b42..bb44fbf437 100644 --- a/core/content/starter.js +++ b/core/content/starter.js @@ -11,7 +11,7 @@ (function () { // intentionally global lock to avoid multiple execution of this function if (window.STARTER_LOADED !== undefined) { - console.warn('Web Scrobbler: Starter already loaded'); + console.warn('starter already loaded'); return; } window.STARTER_LOADED = true; @@ -34,29 +34,16 @@ if (Connector.playerSelector !== null) { console.log('Web Scrobbler: Setting up observer'); - var observeTarget = document.querySelector(Connector.playerSelector); - - if (observeTarget !== null) { - var observer = new window.MutationObserver(function () { - if (Connector.isStateChangeAllowed()) { - Connector.onStateChanged(); - } - }); + var observer = new MutationObserver(Connector.onStateChanged); - var config = { - childList: true, - subtree: true, - attributes: true, - characterData: true - }; - observer.observe(observeTarget, config); - } - // Some pages (looking at you Google Music!) may do some crazy navigation API tricks before loading the final page, - // in which case we won't usually find the player. Instead of letting the observer to fire an error we just - // log it and hope that the next navigation event will trigger a new injection. Unload event is still hooked though. - else { - console.warn('Web Scrobbler: Player element (' + Connector.playerSelector + ') was not found in the page.'); - } + var observeTarget = document.querySelector(Connector.playerSelector); + var config = { + childList: true, + subtree: true, + attributes: true, + characterData: true + }; + observer.observe(observeTarget, config); } /** * Player selector is not provided, current connector needs to detect state changes on its own diff --git a/manifest.json b/manifest.json index 87d22713fa..bc4960e888 100644 --- a/manifest.json +++ b/manifest.json @@ -1,6 +1,6 @@ { "name": "Last.fm Scrobbler", - "version": "1.49", + "version": "1.48", "description": "Scrobble music all around the web!", "icons": { diff --git a/options/options.css b/options/options.css index 6712ee2d58..ff704e6484 100644 --- a/options/options.css +++ b/options/options.css @@ -1,6 +1,6 @@ body { background-color: #e3e3e3; - margin: 30px 0 0 0; + margin: 0; } h1, h2, h3, h4, h5 { @@ -26,6 +26,10 @@ h1 i { margin-right: 20px; } +h4 { + margin-top: 30px; +} + ul { list-style: none; } @@ -38,7 +42,7 @@ input[type=checkbox] { margin-top: 0; } -.indent { +p.indent { padding-left: 30px; } @@ -70,7 +74,7 @@ a.conn-config:hover { border-bottom: none; } -.conn-conf-patterns .list-unstyled { +.conn-conf-patterns ul.list-unstyled { margin-left: 0; } diff --git a/options/options.html b/options/options.html index f655ec2bd4..165a55c156 100644 --- a/options/options.html +++ b/options/options.html @@ -1,231 +1,226 @@ - - Options for Last.fm Scrobbler + + Options for Last.fm Scrobbler - - - + + + - - - + + + -
-
- -
-
-
- -
-
-

General

-
    -
  • - - -
  • -
  • - - -
  • -
  • - - -
  • -
- -

YouTube

-
    -
  • - - -
  • -
- - -

Supported websites

-

- Click the checkbox to enable/disable -

    -
  • - - - -
  • - -
-

- - -

Last.fm account connection

-

- Sometimes re-authenticating the extension fixes problems with scrobbling -
- -

-
-
-
- -
- -
-
-

How do I temporarily disable scrobbling?

- -

- You can do that by clicking the icon in the omnibox (address bar). To enable scrobbling again, click the - icon one more time. - The scrobbling will continue for the next song.
- As of version 1.17, you can also disable scrobbling for specific site for some reason. But the global - disabling always takes priority. -

- -

The song was not recognized! Can you fix it?

- -

- Actually YOU can fix it :)
-
- When a song cannot be recognized (and thus scrobbled) a gray icon with question mark appears at the right - side of the omnibox (address bar). - By clicking it a small window pops out where you can input the right song information.
-
- - (The data you input are not stored anywhere, so the next time you play the song, you'll have to enter the data again. This feature is still - work in progress. I'm not sure it is the right way to go for an extension to fix music websites errors. I'd be much happier to see websites - implement some kind of music tagging - just like YouTube partially did.) - -

- -

Will you add support for scrobbling at  ____ ?

- -

- Possibly, but most likely no. I make the Scrobbler in my free time and that's why I manage only Youtube - support - I simply don't use any other web music service. Nevertheless, it is really easy to create a connector - and add support for a new website. You can simply fork the GitHub - repository and send me a pull request. There is also a wiki page on the GitHub describing the extension - core. -

- -

Will you add  ____  functionality?

- -

- Possibly, if it makes sense. A great example is functionality to correct the song title if it is not - recognized. - This wasn't possible in earlier versions, but can be done since 1.0, because a lot of people was asking for - it and I also think it is useful.
- But if you want me to add some not-that-useful-but-really-cool functions, you'll probably get disappointed. -

- -

Is the scrobbler available for the Firefox?

- -

- It is not and it won't be until Firefox supports Chromium extensions. Like Opera 15+ does. -

- -

Who is the author?

- -

- My name is David Šabata, I graduated from IT at the Brno University of Technology, Czech Republic. I am - obsessed with automating - tedious tasks and that's probably why this whole extension was created. -

-
-
-
- -
- -
-
-
    -
  • - Github - Report an issue and contribute -
  • - -
  • - Twitter - Keep up with the updates and for quick chat -
  • - -
  • - Last.fm - Compare taste and just say hi! -
  • - -
  • - LinkedIn - See what my professional-life occupation is -
  • - -
  • - My web - See what else I've done -
  • - -
  • - Privacy - View the privacy policy -
  • -
- -
-
-
- -
- - -
- -
- - -
- -
- -
-
-

1.49

-
    -
  • Fixed Google Music scrobbling
  • -
  • Improved Slacker scrobbling
  • -
  • Improved MixCloud scrobbling
  • -
  • Added Audiosplitter.fm scrobbling
  • -
  • Added Novoeradio.by scrobbling
  • -
  • Switched 8Tracks to new connector (v2)
  • -
  • Switched Archive.org to new connector (v2)
  • -
  • Switched SoundCloud to new connector (v2)
  • -
  • Removed Turntable.fm connector
  • -
+

+
+
+ +
+ + +
+ +
+ +
+
+

General

+
    +
  • + + +
  • +
  • + + +
  • +
  • + + +
  • +
+ +

YouTube

+
    +
  • + + +
  • +
+ + +

Supported websites

+

+ Click the checkbox to enable/disable +

    +
  • + + + +
  • + +
+

+ + +

Last.fm account connection

+

+ Sometimes re-authenticating the extension fixes problems with scrobbling +
+ +

+
+
+
+ +
+ +
+
+

How do I temporarily disable scrobbling?

+ +

+ You can do that by clicking the icon in the omnibox (address bar). To enable scrobbling again, click the + icon one more time. + The scrobbling will continue for the next song.
+ As of version 1.17, you can also disable scrobbling for specific site for some reason. But the global + disabling always takes priority. +

+ +

The song was not recognized! Can you fix it?

+ +

+ Actually YOU can fix it :)
+
+ When a song cannot be recognized (and thus scrobbled) a gray icon with question mark appears at the right + side of the omnibox (address bar). + By clicking it a small window pops out where you can input the right song information.
+
+ + (The data you input are not stored anywhere, so the next time you play the song, you'll have to enter the data again. This feature is still + work in progress. I'm not sure it is the right way to go for an extension to fix music websites errors. I'd be much happier to see websites + implement some kind of music tagging - just like YouTube partially did.) + +

+ +

Will you add support for scrobbling at  ____ ?

+ +

+ Possibly, but most likely no. I make the Scrobbler in my free time and that's why I manage only Youtube + support - I simply don't use any other web music service. Nevertheless, it is really easy to create a connector + and add support for a new website. You can simply fork the GitHub + repository and send me a pull request. There is also a wiki page on the GitHub describing the extension + core. +

+ +

Will you add  ____  functionality?

+ +

+ Possibly, if it makes sense. A great example is functionality to correct the song title if it is not + recognized. + This wasn't possible in earlier versions, but can be done since 1.0, because a lot of people was asking for + it and + I also think it is useful.
+ But if you want me to add some not-that-useful-but-really-cool functions, you'll probably get disappointed. +

+ +

Is the scrobbler available for the Firefox?

+ +

+ It is not and it won't be until Firefox supports Chromium extensions. Like Opera 15+ does. +

+ +

Who is the author?

+ +

+ My name is David Šabata, I graduated from IT at the Brno University of Technology, Czech Republic. I am + obsessed with automating + tedious tasks and that's probably why this whole extension was created. +

+
+
+
+ +
+ +
+
+
    +
  • + Github + Report an issue and contribute +
  • + +
  • + Twitter + Keep up with the updates and for quick chat +
  • + +
  • + Last.fm + Compare taste and just say hi! +
  • + +
  • + LinkedIn + See what my professional-life occupation is +
  • + +
  • + My web + See what else I've done +
  • + +
  • + Privacy + View the privacy policy +
  • +
+ +
+
+
+ +
+ + +
+ +
+ + +
+ +
+ +
+

1.48

  • Fixed Google Music album scrobbling
  • @@ -297,8 +292,8 @@

    1.43

  • You can now define custom URL patterns for connectors
-

1.42

-
    +

    1.42

    +
    • Fixed IndieShuffle scrobbling
    • Fixed Plug.DJ scrobbling
    • Fixed SoundCloud scrobbling
    • @@ -306,350 +301,352 @@

      1.42

    • Improved BandCamp scrobbling and added support for BandCamp Discovery
    • Improved Pleer scrobbling
    • Deezer connector now supports new website design
    • -
    • +
    • Switched Google Music to v2 connector
      This new format introduces some cool features like artist thumbnails in notifications, not scrobbling paused tracks or re-scrobbling a song when jumping from its end to its beginning.
      If all goes well, other sites will switch to v2 connectors too.
    • -
    +
-

1.41

-
    +

    1.41

    +
    • Fixed 22Tracks scrobbling
    • Fixed Yandex scrobbling
    • Fixed Zvooq scrobbling
    • Improved Pandora scrobbling
    • Added Ambient Sleeping Pill connector
    • Added luoo.net connector
    • -
    • Another attempt to fix reappearing auht notifications
    • -
    - -

    1.40

    -
      -
    • Fixed authentication issues
    • -
    - -

    1.39

    -
      -
    • Fixed Amazon scrobbling
    • -
    • Fixed PLEX scrobbling
    • -
    • Fixed TuneIn scrobbling
    • -
    • Improved Bandcamp scrobbling
    • -
    • Added Blinkbox Music connector
    • -
    • Added music.163.com connector
    • +
    • Another attempt to fix reappearing auht notifications
    • +
    + +

    1.40

    +
      +
    • Fixed authentication issues
    • +
    + +

    1.39

    +
      +
    • Fixed Amazon scrobbling
    • +
    • Fixed PLEX scrobbling
    • +
    • Fixed TuneIn scrobbling
    • +
    • Improved Bandcamp scrobbling
    • +
    • Added Blinkbox Music connector
    • +
    • Added music.163.com connector
    • Switched to new Chrome notifications
    • -
    +

1.38

-
    -
  • Fixed Amazon Web Player scrobbling
  • -
  • Fixed Deezer scrobbling
  • -
  • Fixed Rdio scrobbling
  • -
  • Fixed Slacker scrobbling
  • -
  • Added Soundozer connector
  • -
  • Toggle-all to enable/disable connectors
  • -
- -

1.37

-
    -
  • Fixed VK scrobbling
  • -
  • Fixed Gaana scrobbling
  • -
  • Fixed Yandex scrobbling
  • -
  • Fixed Prostopleer scrobbling
  • -
  • Added Odnoklassniki connector
  • -
  • Added Pitchfork Advance connector
  • -
  • Added Archive.org connector
  • -
  • Added Bleep connector
  • -
- -

1.36

-
    -
  • Improved SoundCloud scrobbling (including sets)
  • -
  • Improved BandCamp scrobbling
  • -
  • Improved Baidu scrobbling
  • -
- -

1.35

-
    -
  • Improved YouTube scrobbling
    YouTube is now in progres of switching all modern browser users to HTML5 player. If you experience problems with scrobbling, switch to HTML5 player manually here
  • -
  • Improved BBC stations scrobbling
  • -
  • Added PLEX connector
  • -
  • Added TuneIn connector
  • -
  • Added Mixcloud connector
  • -
  • Added Xiami connector
  • -
  • Added NRK Radio connector
  • -
  • Added ReverbNation connector
  • -
- -

1.34

-
    -
  • Fixed Songza scrobbling
  • -
  • Improved VK scrobbling
  • -
  • Improved Gaana scrobbling
  • -
  • Improved Music Unlimited scrobbling
  • -
- -

1.33

-
    -
  • Fixed SoundCloud scrobbling (multiple notifications are known issue)
  • -
  • Fixed Music Unlimited scrobbling
  • -
- -

1.32

-
    -
  • Added Gaana connector
  • -
  • Added Music Unlimited connector
  • -
  • Added ProstoPleer connector
  • -
  • Added Radioplayer (co.uk) connector
  • -
  • Added Yandex connector
  • -
  • Other minor changes and fixes
  • -
- -

1.31

-
    -
  • Added Beats Music connector
  • -
  • Added Digitally Imported connector
  • -
  • Added Sullen Ural connector
  • -
  • Will no longer scrobbled ads on Spotify
  • -
  • Updated Myspace connector for more stability
  • -
- -

1.30

-
    -
  • Added 8Tracks connector
  • -
  • Added Baidu Music connector
  • -
  • Added Focus@will connector
  • -
  • Added HillyDilly connector
  • -
  • Added Le Tournedisque connector
  • -
  • Added Moje Polskie Radio connector
  • -
  • Added Music Douban connector
  • -
  • Added Novaplanet connector
  • -
  • Added Radioplus.be connector
  • -
  • Added Reddit Playlister connector
  • -
  • Added Rdio connector
  • -
  • Added Songza connector
  • -
  • Added Xbox Music connector
  • -
  • Added support for YouTube's Feather layout
  • -
  • Added support for Amazon player at co.uk domain
  • -
  • Fixed Spotify Web Player connector
  • -
  • Fixed iHeart Radio connector
  • -
  • Revamped options page
  • -
  • Started the extension's official Twitter account
  • -
  • Bumped the version number a little more than usual; just to feel better
  • -
  • Other minor changes and fixes, see GitHub for details
  • -
- -

1.22

-
    -
  • Fix vk.com lags (thanks Marat Enotov for assistance)
  • -
- -

1.21

-
    -
  • Fix poor performance on Pandora, Grooveshark and Google Music (vk.com fix is in progress - see - this to help me out) -
  • -
  • Reworked YouTube connector to be faster and more stable
  • -
  • Amazon now scrobbles album name
  • -
  • Grooveshark connector does not care for your login anymore. Disable it in extension's options if you use - Grooveshark's built-in scrobbling -
  • -
- -

1.20

-
    -
  • Added AOL Radio connector (by Joe Crawford)
  • -
  • Added Daytrotter connector (by tomkrall)
  • -
  • Amazon connector now supports Spanish domain too
  • -
  • Album name scrobbling (only Google Music for now)
  • -
  • Other minor changes, see GitHub - for details -
  • -
- -

1.19

-
    -
  • Fixed Spotify connector
  • -
  • Fixed Plug.dj connector
  • -
  • Fixed Jango connector
  • -
- -

1.18

-
    -
  • Button to re-authenticate the extension with Last.fm
  • -
  • Fixed race condition bug introduced in 1.17
  • -
- -

1.17

-
    -
  • Opera Next (Opera 15+) is supported now!
  • -
  • Options to enable/disable scrobbling on specific sites
  • -
  • A new omnibox icon signalizing the current site is supported, event if it is disabled
  • -
  • Option to prevent notifications from auto hiding
  • -
  • The scrobbler will work along with the HTTPS Everywhere extension (and its alternatives)
  • -
  • Updated MySpace connector to the one and only design
  • -
  • Fixed Google Music scrobbling again
  • -
  • Removed FFtunes connector, as the site has died
  • -
  • Other minor fixes and obsolete functionality cleanup
  • -
- -

1.16

-
    -
  • Fixed Google Music scrobbling (by Matt Runkle)
  • -
  • Fixed some ampersand issues
  • -
- -

1.15

-
    -
  • Grooveshark scrobbling disabled for logged-in users
  • -
  • Fixed Google Play scrobbling (both by Matt Runkle)
  • -
- -

1.14

-
    -
  • New MySpace support (by Ed Rackham)
  • -
  • Plug.dj support (by Anton Stroganov)
  • -
  • Turntable.fm support (by Matt Runkle)
  • -
  • Slacker.com support (by Joe Crawford)
  • -
  • Amazon connector works for German domain too
  • -
  • Grooveshark connector is back in the game
  • -
  • Bugfixes & connectors updates
  • -
- -

1.13

-
    -
  • SoundCloud support (by vintitres)
  • -
  • Spotify support (by Damien Alexandre)
  • -
  • You can now choose to be notified when song starts playing and/or is scrobbled
  • -
  • Bugfixes & connectors updates
  • -
- -

1.12

-
    -
  • Tuba.fm support (by Michal Rumanek)
  • -
  • Amazon Player fixes (by Scott Bale)
  • -
  • Bugfixes & connectors updates
  • -
- -

1.11

-
    -
  • Indieshuffle.com support (by Titus Ramczykowski)
  • -
  • No longer stripping (whatever remix) off the YouTube clip titles
  • -
  • Bugfixes & connectors updates
  • -
- -

1.10

-
    -
  • What's new section :-)
  • -
  • Fixed scrobbling on VK.com (by Alex)
  • -
  • YouTube title recognition improved
  • -
  • Weborama.fm, Megalyrics.ru, 22tracks.com support
    (by Natalia) -
  • -
  • iHeart.com support (by fiv3isaliv3)
  • -
-
-
-
- -
- -
-
-

- Last.fm Scrobbler was created for people who listen to music - online through their browser, and would like to keep an updated playback - history using last.fm's scrobbling service. -

- -

- As I don't visit many other websites with video content, the development of - connectors for other websites will be mostly up to you. Feel free to - send a pull request at GitHub. -
- Don't worry, even if no-one contributes I will still keep YouTube scrobbling working myself. -

- -

- And since we all love music and Last.fm, you can also stop by at - my Last.fm profile to compare taste or maybe leave a kind - message :-) -

- - -

Contributors

- - I'm happy to say, that there are number of great people contributing to this extension!
- There used to be a list of them at this very page, but it grew quickly in size. Also it listed mostly - major contributors (authors of connectors) while not mentioning minor, but also very important ones (fixes and other improvements).
-
- To give proper credit to everyone and to avoid duplicit information, you can now find the list of contributors right at the Github -
-
-
- -
- -
-
-

- Unlike other extensions, this one does not contain any flashing banners or sneaky ads. -

-

- I develop this extension in my free time, with source wide open and I am and will be doing it for free. -

-

- But still please consider donating a few bucks to keep me motivated and to make sure I always have enough pizza and coffee for late night programming -

- -
-
- - - - -
-
-
-
-
- -
- - -
- -
+
    +
  • Fixed Amazon Web Player scrobbling
  • +
  • Fixed Deezer scrobbling
  • +
  • Fixed Rdio scrobbling
  • +
  • Fixed Slacker scrobbling
  • +
  • Added Soundozer connector
  • +
  • Toggle-all to enable/disable connectors
  • +
+ +

1.37

+
    +
  • Fixed VK scrobbling
  • +
  • Fixed Gaana scrobbling
  • +
  • Fixed Yandex scrobbling
  • +
  • Fixed Prostopleer scrobbling
  • +
  • Added Odnoklassniki connector
  • +
  • Added Pitchfork Advance connector
  • +
  • Added Archive.org connector
  • +
  • Added Bleep connector
  • +
+ +

1.36

+
    +
  • Improved SoundCloud scrobbling (including sets)
  • +
  • Improved BandCamp scrobbling
  • +
  • Improved Baidu scrobbling
  • +
+ +

1.35

+
    +
  • Improved YouTube scrobbling
    YouTube is now in progres of switching all modern browser users to HTML5 player. If you experience problems with scrobbling, switch to HTML5 player manually here
  • +
  • Improved BBC stations scrobbling
  • +
  • Added PLEX connector
  • +
  • Added TuneIn connector
  • +
  • Added Mixcloud connector
  • +
  • Added Xiami connector
  • +
  • Added NRK Radio connector
  • +
  • Added ReverbNation connector
  • +
+ +

1.34

+
    +
  • Fixed Songza scrobbling
  • +
  • Improved VK scrobbling
  • +
  • Improved Gaana scrobbling
  • +
  • Improved Music Unlimited scrobbling
  • +
+ +

1.33

+
    +
  • Fixed SoundCloud scrobbling (multiple notifications are known issue)
  • +
  • Fixed Music Unlimited scrobbling
  • +
+ +

1.32

+
    +
  • Added Gaana connector
  • +
  • Added Music Unlimited connector
  • +
  • Added ProstoPleer connector
  • +
  • Added Radioplayer (co.uk) connector
  • +
  • Added Yandex connector
  • +
  • Other minor changes and fixes
  • +
+ +

1.31

+
    +
  • Added Beats Music connector
  • +
  • Added Digitally Imported connector
  • +
  • Added Sullen Ural connector
  • +
  • Will no longer scrobbled ads on Spotify
  • +
  • Updated Myspace connector for more stability
  • +
+ +

1.30

+
    +
  • Added 8Tracks connector
  • +
  • Added Baidu Music connector
  • +
  • Added Focus@will connector
  • +
  • Added HillyDilly connector
  • +
  • Added Le Tournedisque connector
  • +
  • Added Moje Polskie Radio connector
  • +
  • Added Music Douban connector
  • +
  • Added Novaplanet connector
  • +
  • Added Radioplus.be connector
  • +
  • Added Reddit Playlister connector
  • +
  • Added Rdio connector
  • +
  • Added Songza connector
  • +
  • Added Xbox Music connector
  • +
  • Added support for YouTube's Feather layout
  • +
  • Added support for Amazon player at co.uk domain
  • +
  • Fixed Spotify Web Player connector
  • +
  • Fixed iHeart Radio connector
  • +
  • Revamped options page
  • +
  • Started the extension's official Twitter account
  • +
  • Bumped the version number a little more than usual; just to feel better
  • +
  • Other minor changes and fixes, see GitHub for details
  • +
+ +

1.22

+
    +
  • Fix vk.com lags (thanks Marat Enotov for assistance)
  • +
+ +

1.21

+
    +
  • Fix poor performance on Pandora, Grooveshark and Google Music (vk.com fix is in progress - see + this to help me out) +
  • +
  • Reworked YouTube connector to be faster and more stable
  • +
  • Amazon now scrobbles album name
  • +
  • Grooveshark connector does not care for your login anymore. Disable it in extension's options if you use + Grooveshark's built-in scrobbling +
  • +
+ +

1.20

+
    +
  • Added AOL Radio connector (by Joe Crawford)
  • +
  • Added Daytrotter connector (by tomkrall)
  • +
  • Amazon connector now supports Spanish domain too
  • +
  • Album name scrobbling (only Google Music for now)
  • +
  • Other minor changes, see GitHub + for details +
  • +
+ +

1.19

+
    +
  • Fixed Spotify connector
  • +
  • Fixed Plug.dj connector
  • +
  • Fixed Jango connector
  • +
+ +

1.18

+
    +
  • Button to re-authenticate the extension with Last.fm
  • +
  • Fixed race condition bug introduced in 1.17
  • +
+ +

1.17

+
    +
  • Opera Next (Opera 15+) is supported now!
  • +
  • Options to enable/disable scrobbling on specific sites
  • +
  • A new omnibox icon signalizing the current site is supported, event if it is disabled
  • +
  • Option to prevent notifications from auto hiding
  • +
  • The scrobbler will work along with the HTTPS Everywhere extension (and its alternatives)
  • +
  • Updated MySpace connector to the one and only design
  • +
  • Fixed Google Music scrobbling again
  • +
  • Removed FFtunes connector, as the site has died
  • +
  • Other minor fixes and obsolete functionality cleanup
  • +
+ +

1.16

+
    +
  • Fixed Google Music scrobbling (by Matt Runkle)
  • +
  • Fixed some ampersand issues
  • +
+ +

1.15

+
    +
  • Grooveshark scrobbling disabled for logged-in users
  • +
  • Fixed Google Play scrobbling (both by Matt Runkle)
  • +
+ +

1.14

+
    +
  • New MySpace support (by Ed Rackham)
  • +
  • Plug.dj support (by Anton Stroganov)
  • +
  • Turntable.fm support (by Matt Runkle)
  • +
  • Slacker.com support (by Joe Crawford)
  • +
  • Amazon connector works for German domain too
  • +
  • Grooveshark connector is back in the game
  • +
  • Bugfixes & connectors updates
  • +
+ +

1.13

+
    +
  • SoundCloud support (by vintitres)
  • +
  • Spotify support (by Damien Alexandre)
  • +
  • You can now choose to be notified when song starts playing and/or is scrobbled
  • +
  • Bugfixes & connectors updates
  • +
+ +

1.12

+
    +
  • Tuba.fm support (by Michal Rumanek)
  • +
  • Amazon Player fixes (by Scott Bale)
  • +
  • Bugfixes & connectors updates
  • +
+ +

1.11

+
    +
  • Indieshuffle.com support (by Titus Ramczykowski)
  • +
  • No longer stripping (whatever remix) off the YouTube clip titles
  • +
  • Bugfixes & connectors updates
  • +
+ +

1.10

+
    +
  • What's new section :-)
  • +
  • Fixed scrobbling on VK.com (by Alex)
  • +
  • YouTube title recognition improved
  • +
  • Weborama.fm, Megalyrics.ru, 22tracks.com support
    (by Natalia) +
  • +
  • iHeart.com support (by fiv3isaliv3)
  • +
+
+
+
+ +
+ +
+
+

+ Last.fm Scrobbler was created for people who listen to music + online through their browser, and would like to keep an updated playback + history using last.fm's scrobbling service. +

+ +

+ As I don't visit many other websites with video content, the development of + connectors for other websites will be mostly up to you. Feel free to + send a pull request at GitHub. +
+ Don't worry, even if no-one contributes I will still keep YouTube scrobbling working myself. +

+ +

+ And since we all love music and Last.fm, you can also stop by at + my Last.fm profile to compare taste or maybe leave a kind + message :-) +

+ + +

Contributors

+ + I'm happy to say, that there are number of great people contributing to this extension!
+ There used to be a list of them at this very page, but it grew quickly in size. Also it listed mostly + major contributors (authors of connectors) while not mentioning minor, but also very important ones (fixes and other improvements).
+
+ To give proper credit to everyone and to avoid duplicit information, you can now find the list of contributors right at the Github +
+
+
+ +
+ +
+
+

+ Unlike other extensions, this one does not contain any flashing banners or sneaky ads. +

+

+ I develop this extension in my free time, with source wide open and I am and will be doing it for free. +

+

+ But still please consider donating a few bucks to keep me motivated and to make sure I always have enough pizza and coffee for late night programming +

+ +
+
+ + + + +
+
+
+
+
+ +
+ + +
+ +
diff --git a/package.json b/package.json index 3dc57735fe..cb0f5cf7d1 100644 --- a/package.json +++ b/package.json @@ -12,7 +12,6 @@ "grunt": "~0.4.5", "grunt-cli": "~0.1.13", "grunt-contrib-compress": "~0.9.1", - "grunt-contrib-csslint": "^0.4.0", "grunt-contrib-jshint": "~0.10.0", "grunt-jsonlint": "^1.0.4", "grunt-lintspaces": "^0.5.1", diff --git a/popups/base.css b/popups/base.css index 8a750265e3..29b50dd87d 100644 --- a/popups/base.css +++ b/popups/base.css @@ -14,17 +14,11 @@ h1, h2, h3, h4, h5 { } a { + color: #000; text-decoration: none; border-bottom: 1px solid #d51007; - font-size: 0.75em; - color: #333; - border: none; } a:hover { color: #d51007; } - -#wrapper { - width: 290px; -} diff --git a/popups/go_play_music.html b/popups/go_play_music.html index be8a3a4b7a..3e7326cb96 100644 --- a/popups/go_play_music.html +++ b/popups/go_play_music.html @@ -7,6 +7,18 @@ + + +