abdulazizali77 / sloooop Goto Github PK
View Code? Open in Web Editor NEWAB Looper web extension for Spotify
License: GNU Lesser General Public License v3.0
AB Looper web extension for Spotify
License: GNU Lesser General Public License v3.0
Observe the play button and trigger fetch when it is clicked
node_modules/.bin/browserify -t babelify -d src/background/index.js > build/background.bundle.js
internal/modules/cjs/loader.js:605
throw err;
^
Error: Cannot find module 'babel-core'
at Function.Module._resolveFilename (internal/modules/cjs/loader.js:603:15)
at Function.Module._load (internal/modules/cjs/loader.js:529:25)
at Module.require (internal/modules/cjs/loader.js:657:17)
at require (internal/modules/cjs/helpers.js:22:18)
at Object.<anonymous> (D:\sloop\node_modules\babelify\index.js:2:14)
at Module._compile (internal/modules/cjs/loader.js:721:30)
at Object.Module._extensions..js (internal/modules/cjs/loader.js:732:10)
at Module.load (internal/modules/cjs/loader.js:620:32)
at tryModuleLoad (internal/modules/cjs/loader.js:560:12)
at Function.Module._load (internal/modules/cjs/loader.js:552:3)
make: *** [Makefile:35: build/background.bundle.js] Error 1
Will upload HAR file
When the use is not logged in, the auth flow will forward to a login page first
before the client authorization.
chrome-extension://coidlglmibkdkmnedmgblamammmnjdon/contentscript.bundle.js:27664 Uncaught (in promise) TypeError: Failed to execute 'observe' on 'MutationObserver': parameter 1 is not of type 'Node'. at observePlaybackPosition (chrome-extension://coidlglmibkdkmnedmgblamammmnjdon/contentscript.bundle.js:27664) at setupObservers (chrome-extension://coidlglmibkdkmnedmgblamammmnjdon/contentscript.bundle.js:27676) at chrome-extension://coidlglmibkdkmnedmgblamammmnjdon/contentscript.bundle.js:27973
However in actually USING such a functionality (if a technical solution can be found) would violate Spotify's TOU
(TODO: link TOU here)
There might be a condition where the last position of the current track was saved even when no ranges were set. And when the web player goes through each track, it jumps to that last position.
seeking to 54000 bearertoken=BQDfRDRLBqLiP5Ek1sS-kuRYuaijT8OGjyJWEhkBmcHHzuFZcoVUFUagEs8Z9o2jCDiSv9c_1IzvP5OD0UZM52iYhIV8uTPVDr2CGVm6pF-wESAatvI4l7muyB5Ptsly70fhNv_xpHyZRpwAqDacm0oIYNkLhAmuyUsqIflOe5WpB2P4yB_g3snqBrJ1 index.js:449 Response {type: "cors", url: "https://api.spotify.com/v1/me/player/seek?position_ms=54000", redirected: false, status: 204, ok: true, …}body: (...)bodyUsed: falseheaders: Headers {}ok: trueredirected: falsestatus: 204statusText: ""type: "cors"url: "https://api.spotify.com/v1/me/player/seek?position_ms=54000"__proto__: Response spotifyPlayer.js:58
One easy way is to just change the colour of the the slider
Various state management issues result from allowing extension to be enabled separately for different tabs.
There is only one extension icon state which applies to all player tabs
Use Cases 40-52 #42
One intermediate solution is to display a dialog
Playing podcasts seems to cause this error
https://open.spotify.com/show/1GdTMF4b8x5WTJuk66enCq
vendor~web-player.b987dbff.js?WB_REVISION=fbe5eaa659ad9ac575fcb6736c513dd4:1 GET https://spclient.wg.spotify.com/metadata/4/track/117f64788e375c42b7926529462d0b07?market=from_token 404
Use Cases
1 | One tab, logs in, plays track, enables extension, disables extension, logs out
2 | One tab, logs in, enables extension, plays track, disables extension, logs out
3 | One tab, logs in, plays track, enables extension, logs out
4 | One tab, logs in, enables extension, plays track, logs out
5 | One tab, logs in, plays track, enables extension, disables extension, closes tab
6 | One tab, logs in, enables extension, plays track, disables extension, closes tab
7 | One tab, logs in, plays track, enables extension, closes tab
8 | One tab, logs in, enables extension, plays track, closes tab
9 | One tab, is logged out, enables extension, plays track, disables extension, logs out
10 | One tab, is logged out, enables extension, plays track, logs out
11 | One tab, is logged out, enables extension, plays track, disables extension, closes tab
12 | One tab, is logged out, enables extension, plays track, closes tab
13 | One tab, logs in, plays track, enables extension, disables extension, logs out, logs in again, plays track, enables extension
14 | One tab, logs in, plays track, enables extension, disables extension, logs out, logs in again, enables extension, plays track
15 | One tab, logs in, plays track, enables extension, disables extension, logs out, enables extension, plays track
16 | One tab, logs in, plays track, enables extension, logs out, logs in again, plays track, enables extension
17 | One tab, logs in, plays track, enables extension, logs out, logs in again, enables extension, plays track
18 | One tab, logs in, plays track, enables extension, logs out, enables extension, plays track
19 | One tab, logs in, plays track, enables extension, disables extension, closes tab logs in again, plays track, enables extension
20 | One tab, logs in, plays track, enables extension, disables extension, closes tab logs in again, enables extension, plays track
21 | One tab, logs in, plays track, enables extension, disables extension, closes tab enables extension, plays track
22 | One tab, logs in, plays track, enables extension, closes tab logs in again, plays track, enables extension
23 | One tab, logs in, plays track, enables extension, closes tab logs in again, enables extension, plays track
24 | One tab, logs in, plays track, enables extension, closes tab enables extension, plays track
25 | One tab, is logged out, enables extension, plays track, disables extension, logs out logs in again, plays track, enables extension
26 | One tab, is logged out, enables extension, plays track, disables extension, logs out logs in again, enables extension, plays track
27 | One tab, is logged out, enables extension, plays track, disables extension, logs out enables extension, plays track
28 | One tab, is logged out, enables extension, plays track, logs out, logs in again, plays track, enables extension
29 | One tab, is logged out, enables extension, plays track, logs out, logs in again, enables extension, plays track
30 | One tab, is logged out, enables extension, plays track, logs out, enables extension, plays track
31 | One tab, is logged out, enables extension, plays track, disables extension, closes tab, logs in again, plays track, enables extension
32 | One tab, is logged out, enables extension, plays track, disables extension, closes tab, logs in again, enables extension, plays track
33 | One tab, is logged out, enables extension, plays track, disables extension, closes tab, enables extension, plays track
34 | One tab, is logged out, enables extension, plays track, closes tab, logs in again, plays track, enables extension
35 | One tab, is logged out, enables extension, plays track, closes tab, logs in again, enables extension, plays track
36 | One tab, is logged out, enables extension, plays track, closes tab, enables extension, plays track
37 | Two tabs; Tab 1 logs in, plays track, enables extension, disables extension, closes tab; Tab 2 plays track, enables extension
38 | Two tabs; Tab 1 logs in, plays track, enables extension, closes tab; Tab 2 plays track, enables extension
39 | Two tabs; Tab 1 logs in, plays track, enables extension, disables extension, closes tab; Tab 2 plays track, enables extension Tab 1 enables extension, plays track
40 | Two tabs; Tab 1 logs in, plays track, enables extension, closes tab; Tab 2 plays track, enables extension Tab 1 enables extension, plays track
41 | Two tabs; Tab 1 logs in, plays track, enables extension, disables extension; Tab 2 logs out; Tab 1 logs in again, plays track, enables extension
42 | Two tabs; Tab 1 logs in, plays track, enables extension, disables extension; Tab 2 logs out; Tab 1 logs in again, enables extension, plays track
43 | Two tabs; Tab 1 logs in, plays track, enables extension, disables extension; Tab 2 logs out; Tab 1 enables extension, plays track
44 | Two tabs; Tab 1 logs in, plays track, enables extension, disables extension; Tab 2 logs out; Tab 2 logs in again, plays track, enables extension
45 | Two tabs; Tab 1 logs in, plays track, enables extension, disables extension; Tab 2 logs out; Tab 2 logs in again, enables extension, plays track
46 | Two tabs; Tab 1 logs in, plays track, enables extension, disables extension; Tab 2 logs out; Tab 2 enables extension, plays track
47 | Two tabs; Tab 1 logs in, plays track, enables extension; Tab 2 logs out Tab 1 logs in again, plays track, enables extension
48 | Two tabs; Tab 1 logs in, plays track, enables extension; Tab 2 logs out Tab 1 logs in again, enables extension, plays track
49 | Two tabs; Tab 1 logs in, plays track, enables extension; Tab 2 logs out Tab 1 enables extension, plays track
50 | Two tabs; Tab 1 logs in, plays track, enables extension; Tab 2 logs out Tab 2 logs in again, plays track, enables extension
51 | Two tabs; Tab 1 logs in, plays track, enables extension; Tab 2 logs out Tab 2 logs in again, enables extension, plays track
52 | Two tabs; Tab 1 logs in, plays track, enables extension; Tab 2 logs out Tab 2 enables extension, plays track
There should be three icons
UNAVAILABLE_ICON
INACTIVATED_ICON
ACTIVATED_ICON
podcast = {
"device": {
"id": "1fe41362635180b15a5327ca418baca7401de41b",
"is_active": true,
"is_private_session": false,
"is_restricted": false,
"name": "Web Player (Chrome)",
"type": "Computer",
"volume_percent": 100
},
"shuffle_state": false,
"repeat_state": "off",
"timestamp": 1602989985376,
"context": null,
"progress_ms": 337030,
"item": null,
"currently_playing_type": "episode",
"actions": {
"disallows": {
"resuming": true,
"skipping_prev": true
}
},
"is_playing": true
}
For https://open.spotify.com/album/7FBx85QTyuFgl2TpjroShR
Track1 Punk Rock
is 2:08
Track2 Cody
is 6:33
204
and then jumps to Track2Basically the last spurious seek
on Track2 before playing Track1 shouldnt even be made.
Possibly #22 is a manifest of this
A 'Filter' mode is similar to the normal AB 'Loop' mode in that it will start playback from A and plays until B, but the 'Filter' mode will not go back to A as in the 'Loop' mode and instead go straight to the next track.
dupe #26
With a link to Upgrade. Related to #13
Possibly make a call to a different API to fetch the last played track
Maybe https://api.spotify.com/v1/me/player/recently-played
For urls which the extension does not support, the icon should display an 'UNAVAILABLE_ICON'
For urls which the extension does support, and the extension is not activated or disabled the icon should display an 'INACTIVATED_ICON'
For urls which the extension does support, and the extension is activated or enabled the icon should display an 'ACTIVATED_ICON'
In an unavailable state, clicking the extension icon does nothing, it will display the default chrome settings context menu.
In an inactivated state, clicking the extension icon activates the extension, optionally goes through auth flow, and displays slider.
In an activated state, clicking the extension icon inactivates the extension. The fetched bearer is retained.
A declarative, efficient, and flexible JavaScript library for building user interfaces.
🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.
TypeScript is a superset of JavaScript that compiles to clean JavaScript output.
An Open Source Machine Learning Framework for Everyone
The Web framework for perfectionists with deadlines.
A PHP framework for web artisans
Bring data to life with SVG, Canvas and HTML. 📊📈🎉
JavaScript (JS) is a lightweight interpreted programming language with first-class functions.
Some thing interesting about web. New door for the world.
A server is a program made to process requests and deliver data to clients.
Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.
Some thing interesting about visualization, use data art
Some thing interesting about game, make everyone happy.
We are working to build community through open source technology. NB: members must have two-factor auth.
Open source projects and samples from Microsoft.
Google ❤️ Open Source for everyone.
Alibaba Open Source for everyone
Data-Driven Documents codes.
China tencent open source team.