• Recent
  • Tags
  • Unsolved
  • Solved
  • MagicMirror² Repository
  • Documentation
  • 3rd-Party-Modules
  • Donate
  • Discord
  • Register
  • Login
MagicMirror Forum
  • Recent
  • Tags
  • Unsolved
  • Solved
  • MagicMirror² Repository
  • Documentation
  • 3rd-Party-Modules
  • Donate
  • Discord
  • Register
  • Login
A New Chapter for MagicMirror: The Community Takes the Lead
Read the statement by Michael Teeuw here.

MMM-SpotifyControl . Control your Spotify music player using Mk2 assistant.

Scheduled Pinned Locked Moved Entertainment
38 Posts 4 Posters 14.8k Views 9 Watching
Loading More Posts
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • E Offline
    ejay-ibm Project Sponsor Module Developer @Cr4z33
    last edited by Mar 14, 2019, 4:55 PM

    @Cr4z33 Well i’m using it in french … so I don’t think so .
    I need to think a bit why your payload is incorrect.

    C F 2 Replies Last reply Mar 14, 2019, 4:56 PM Reply Quote 0
    • C Offline
      Cr4z33 @ejay-ibm
      last edited by Mar 14, 2019, 4:56 PM

      @ejay-ibm sure take your time mate as I might probably not resume testing before tomorrow afternoon. ;)

      1 Reply Last reply Reply Quote 0
      • F Offline
        F17MC @ejay-ibm
        last edited by Mar 14, 2019, 4:59 PM

        @ejay-ibm I thought your module only works to play/stop/next/previous. I have tried run “Bob Marley Spotify” and nothing happens. With other artist the same.
        If I can test something…
        Pd: Spanish + Spotify premium

        E 1 Reply Last reply Mar 14, 2019, 6:35 PM Reply Quote 0
        • E Offline
          ejay-ibm Project Sponsor Module Developer @F17MC
          last edited by Mar 14, 2019, 6:35 PM

          @F17MC @Cr4z33
          I don’t think the issue is with the module but with what the assistant return to the module .

          the module is expecting something like “”(open.spotify.com - https://open.spotify.com/artist/2Gkz5N7rWiCE3jlCgsw1yp""

          So i’m not getting why your assistant doesn’t understand what to search for.

          I’ll continue digging

          Ejay

          C 1 Reply Last reply Mar 14, 2019, 6:37 PM Reply Quote 1
          • C Offline
            Cr4z33 @ejay-ibm
            last edited by Mar 14, 2019, 6:37 PM

            @ejay-ibm OK thanks I might ask also @Sean tomorrow to see if he knows anything we don’t. :D

            E 1 Reply Last reply Mar 14, 2019, 6:52 PM Reply Quote 0
            • E Offline
              ejay-ibm Project Sponsor Module Developer @Cr4z33
              last edited by ejay-ibm Mar 14, 2019, 6:53 PM Mar 14, 2019, 6:52 PM

              @Cr4z33 I’m already working on it with @Sean ;)

              quick question : if you just say “micheal jackson smooth criminal”
              does it start playing youtube ?
              if yes then just try “micheal jackson smooth criminal spotify”
              and let me know

              If that doesn’t work I’ll ask you some patience so I can implement the spotify search function directly in my module and not from the assistant. We will just use a hook in the assisant .

              Ejay

              F C 2 Replies Last reply Mar 14, 2019, 9:19 PM Reply Quote 0
              • F Offline
                F17MC @ejay-ibm
                last edited by F17MC Mar 15, 2019, 11:04 AM Mar 14, 2019, 9:19 PM

                @ejay-ibm yes, with YouTube it works. But with Spotify no. I try with “artist + song Spotify”, “artist + song on Spotify” etc. Always run the video in YouTube.

                E 1 Reply Last reply Mar 15, 2019, 7:51 AM Reply Quote 0
                • E Offline
                  ejay-ibm Project Sponsor Module Developer @F17MC
                  last edited by Mar 15, 2019, 7:51 AM

                  @F17MC That is interesting … that mean the result of the assistant research never bring a spotify url but a youtube one . a openspotify url is what the module expect to work .

                  So we know now that under some circumpstance the module doesn’t get the right payload from assistant to work.
                  Thanks for testing and reporting this guys .

                  I’ll work with sean to implement a search function directly with the spotify APIs call . With that we will make the search directly on spotify ( and not on google ) so we will bypass this issue .

                  I’m wondering where the difference is between you and I, because it work fine here and as well another German guy Mantha who is the original code creator .

                  Anyway, there’s no problem … only solution .

                  I’ll keep you informed once the module is updated .

                  Ejay .

                  F 1 Reply Last reply Mar 15, 2019, 10:34 AM Reply Quote 0
                  • F Offline
                    F17MC @ejay-ibm
                    last edited by F17MC Mar 15, 2019, 11:01 AM Mar 15, 2019, 10:34 AM

                    @ejay-ibm
                    I tried again and I receive this:

                    [AMK2] end-of-utterance
                    [AMK2] Transcription: los planetas Spotify  --- Done: true
                    [AMK2] openSpotify found: https://open.spotify.com/artist/0N1TIXCk9Q9JbEPXQDclEL
                    { requestId: '5c8b16da-0000-2878-a45c-...' } { profileFile: 'default.json', lang: 'es-ES' }
                    [AMK2] Device Action: { requestId: '5c8b16da-0000-2878-a45c-...' }
                    [AMK2] Assistant Text Response: 
                    [HOTWORD] begins listening.
                    Refreshed access token because it has expired. Expired at: 11:26:53 now is: 11:27:56
                    Error while refreshing:
                    { StatusCodeError: 404 - {"error":{"status":404,"message":"Device not found"}}
                        at new StatusCodeError (/home/pi/MagicMirror/modules/MMM-SpotifyControl/node_modules/request-promise-core/lib/errors.js:32:15)
                        at Request.plumbing.callback (/home/pi/MagicMirror/modules/MMM-SpotifyControl/node_modules/request-promise-core/lib/plumbing.js:104:33)
                        at Request.RP$callback [as _callback] (/home/pi/MagicMirror/modules/MMM-SpotifyControl/node_modules/request-promise-core/lib/plumbing.js:46:31)
                        at Request.self.callback (/home/pi/MagicMirror/modules/MMM-SpotifyControl/node_modules/request/request.js:185:22)
                        at emitTwo (events.js:126:13)
                        at Request.emit (events.js:214:7)
                        at Request.<anonymous> (/home/pi/MagicMirror/modules/MMM-SpotifyControl/node_modules/request/request.js:1161:10)
                        at emitOne (events.js:116:13)
                        at Request.emit (events.js:211:7)
                        at IncomingMessage.<anonymous> (/home/pi/MagicMirror/modules/MMM-SpotifyControl/node_modules/request/request.js:1083:12)
                      name: 'StatusCodeError',
                      statusCode: 404,
                      message: '404 - {"error":{"status":404,"message":"Device not found"}}',
                      error: { error: { status: 404, message: 'Device not found' } },
                      options: 
                       { url: 'https://api.spotify.com/v1/me/player/play',
                         body: 
                          { context_uri: 'spotify:artist:0N1TIXCk9Q9JbEPXQDclEL',
                            position_ms: 0 },
                         qs: { device_id: 'a8caee9b12196a964f5a...' },
                         headers: 
                          { Authorization: 'Bearer BQDuIGXWvxdIB5T...' },
                         json: true,
                         method: 'PUT',
                         callback: [Function: RP$callback],
                         transform: undefined,
                         simple: true,
                         resolveWithFullResponse: false,
                         transform2xxOnly: false },
                      response: 
                       IncomingMessage {
                         _readableState: 
                          ReadableState {
                            objectMode: false,
                            highWaterMark: 16384,
                            buffer: [Object],
                            length: 0,
                            pipes: null,
                            pipesCount: 0,
                            flowing: true,
                            ended: true,
                            endEmitted: true,
                            reading: false,
                            sync: true,
                            needReadable: false,
                            emittedReadable: false,
                            readableListening: false,
                            resumeScheduled: false,
                            destroyed: false,
                            defaultEncoding: 'utf8',
                            awaitDrain: 0,
                            readingMore: false,
                            decoder: null,
                            encoding: null },
                         readable: false,
                         domain: null,
                         _events: 
                          { end: [Array],
                            close: [Array],
                            data: [Function],
                            error: [Function] },
                         _eventsCount: 4,
                         _maxListeners: undefined,
                         socket: 
                          TLSSocket {
                            _tlsOptions: [Object],
                            _secureEstablished: true,
                            _securePending: false,
                            _newSessionPending: false,
                            _controlReleased: true,
                            _SNICallback: null,
                            servername: null,
                            npnProtocol: false,
                            alpnProtocol: false,
                            authorized: true,
                            authorizationError: null,
                            encrypted: true,
                            _events: [Object],
                            _eventsCount: 9,
                            connecting: false,
                            _hadError: false,
                            _handle: null,
                            _parent: null,
                            _host: 'api.spotify.com',
                            _readableState: [Object],
                            readable: false,
                            domain: null,
                            _maxListeners: undefined,
                            _writableState: [Object],
                            writable: false,
                            allowHalfOpen: false,
                            _bytesDispatched: 479,
                            _sockname: null,
                            _pendingData: null,
                            _pendingEncoding: '',
                            server: undefined,
                            _server: null,
                            ssl: null,
                            _requestCert: true,
                            _rejectUnauthorized: true,
                            parser: null,
                            _httpMessage: [Object],
                            read: [Function],
                            _consuming: true,
                            _idleNext: null,
                            _idlePrev: null,
                            _idleTimeout: -1,
                            [Symbol(asyncId)]: 7397,
                            [Symbol(bytesRead)]: 555 },
                         connection: 
                          TLSSocket {
                            _tlsOptions: [Object],
                            _secureEstablished: true,
                            _securePending: false,
                            _newSessionPending: false,
                            _controlReleased: true,
                            _SNICallback: null,
                            servername: null,
                            npnProtocol: false,
                            alpnProtocol: false,
                            authorized: true,
                            authorizationError: null,
                            encrypted: true,
                            _events: [Object],
                            _eventsCount: 9,
                            connecting: false,
                            _hadError: false,
                            _handle: null,
                            _parent: null,
                            _host: 'api.spotify.com',
                            _readableState: [Object],
                            readable: false,
                            domain: null,
                            _maxListeners: undefined,
                            _writableState: [Object],
                            writable: false,
                            allowHalfOpen: false,
                            _bytesDispatched: 479,
                            _sockname: null,
                            _pendingData: null,
                            _pendingEncoding: '',
                            server: undefined,
                            _server: null,
                            ssl: null,
                            _requestCert: true,
                            _rejectUnauthorized: true,
                            parser: null,
                            _httpMessage: [Object],
                            read: [Function],
                            _consuming: true,
                            _idleNext: null,
                            _idlePrev: null,
                            _idleTimeout: -1,
                            [Symbol(asyncId)]: 7397,
                            [Symbol(bytesRead)]: 555 },
                         httpVersionMajor: 1,
                         httpVersionMinor: 1,
                         httpVersion: '1.1',
                         complete: true,
                         headers: 
                          { 'content-type': 'application/json; charset=utf-8',
                            'cache-control': 'private, max-age=0',
                            'access-control-allow-origin': '*',
                            'access-control-allow-headers': 'Accept, Authorization, Origin, Content-Type, Retry-After',
                            'access-control-allow-methods': 'GET, POST, OPTIONS, PUT, DELETE, PATCH',
                            'access-control-allow-credentials': 'true',
                            'access-control-max-age': '604800',
                            'content-length': '76',
                            date: 'Fri, 15 Mar 2019 10:27:56 GMT',
                            via: '1.1 google',
                            'alt-svc': 'clear',
                            connection: 'close' },
                         rawHeaders: 
                          [ 'Content-Type',
                            'application/json; charset=utf-8',
                            'Cache-Control',
                            'private, max-age=0',
                            'Access-Control-Allow-Origin',
                            '*',
                            'Access-Control-Allow-Headers',
                            'Accept, Authorization, Origin, Content-Type, Retry-After',
                            'Access-Control-Allow-Methods',
                            'GET, POST, OPTIONS, PUT, DELETE, PATCH',
                            'Access-Control-Allow-Credentials',
                            'true',
                            'Access-Control-Max-Age',
                            '604800',
                            'Content-Length',
                            '76',
                            'Date',
                            'Fri, 15 Mar 2019 10:27:56 GMT',
                            'Via',
                            '1.1 google',
                            'Alt-Svc',
                            'clear',
                            'Connection',
                            'close' ],
                         trailers: {},
                         rawTrailers: [],
                         upgrade: false,
                         url: '',
                         method: null,
                         statusCode: 404,
                         statusMessage: 'Not Found',
                         client: 
                          TLSSocket {
                            _tlsOptions: [Object],
                            _secureEstablished: true,
                            _securePending: false,
                            _newSessionPending: false,
                            _controlReleased: true,
                            _SNICallback: null,
                            servername: null,
                            npnProtocol: false,
                            alpnProtocol: false,
                            authorized: true,
                            authorizationError: null,
                            encrypted: true,
                            _events: [Object],
                            _eventsCount: 9,
                            connecting: false,
                            _hadError: false,
                            _handle: null,
                            _parent: null,
                            _host: 'api.spotify.com',
                            _readableState: [Object],
                            readable: false,
                            domain: null,
                            _maxListeners: undefined,
                            _writableState: [Object],
                            writable: false,
                            allowHalfOpen: false,
                            _bytesDispatched: 479,
                            _sockname: null,
                            _pendingData: null,
                            _pendingEncoding: '',
                            server: undefined,
                            _server: null,
                            ssl: null,
                            _requestCert: true,
                            _rejectUnauthorized: true,
                            parser: null,
                            _httpMessage: [Object],
                            read: [Function],
                            _consuming: true,
                            _idleNext: null,
                            _idlePrev: null,
                            _idleTimeout: -1,
                            [Symbol(asyncId)]: 7397,
                            [Symbol(bytesRead)]: 555 },
                         _consuming: true,
                         _dumped: false,
                         req: 
                          ClientRequest {
                            domain: null,
                            _events: [Object],
                            _eventsCount: 5,
                            _maxListeners: undefined,
                            output: [],
                            outputEncodings: [],
                            outputCallbacks: [],
                            outputSize: 0,
                            writable: true,
                            _last: true,
                            upgrading: false,
                            chunkedEncoding: false,
                            shouldKeepAlive: false,
                            useChunkedEncodingByDefault: true,
                            sendDate: false,
                            _removedConnection: false,
                            _removedContLen: false,
                            _removedTE: false,
                            _contentLength: null,
                            _hasBody: true,
                            _trailer: '',
                            finished: true,
                            _headerSent: true,
                            socket: [Object],
                            connection: [Object],
                            _header: 'PUT /v1/me/player/play?device_id=a8caee9b1219... HTTP/1.1\r\nAuthorization: Bearer BQDuIGXWvxdIB5TBbyg...\r\nhost: api.spotify.com\r\naccept: application/json\r\ncontent-type: application/json\r\ncontent-length: 71\r\nConnection: close\r\n\r\n',
                            _onPendingData: [Function: noopPendingOutput],
                            agent: [Object],
                            socketPath: undefined,
                            timeout: undefined,
                            method: 'PUT',
                            path: '/v1/me/player/play?device_id=a8caee9b12196...',
                            _ended: true,
                            res: [Circular],
                            aborted: undefined,
                            timeoutCb: null,
                            upgradeOrConnect: false,
                            parser: null,
                            maxHeadersCount: null,
                            [Symbol(outHeadersKey)]: [Object] },
                         request: 
                          Request {
                            domain: null,
                            _events: [Object],
                            _eventsCount: 5,
                            _maxListeners: undefined,
                            body: '{"context_uri":"spotify:artist:0N1TIXCk9Q9JbEPXQDclEL","position_ms":0}',
                            headers: [Object],
                            method: 'PUT',
                            readable: true,
                            writable: true,
                            explicitMethod: true,
                            _qs: [Object],
                            _auth: [Object],
                            _oauth: [Object],
                            _multipart: [Object],
                            _redirect: [Object],
                            _tunnel: [Object],
                            _rp_resolve: [Function],
                            _rp_reject: [Function],
                            _rp_promise: [Object],
                            _rp_callbackOrig: undefined,
                            callback: [Function],
                            _rp_options: [Object],
                            setHeader: [Function],
                            hasHeader: [Function],
                            getHeader: [Function],
                            removeHeader: [Function],
                            localAddress: undefined,
                            pool: {},
                            dests: [],
                            __isRequestRequest: true,
                            _callback: [Function: RP$callback],
                            uri: [Object],
                            proxy: null,
                            tunnel: true,
                            setHost: true,
                            originalCookieHeader: undefined,
                            _disableCookies: true,
                            _jar: undefined,
                            port: 443,
                            host: 'api.spotify.com',
                            url: [Object],
                            path: '/v1/me/player/play?device_id=a8caee9b12196...',
                            _json: true,
                            httpModule: [Object],
                            agentClass: [Object],
                            agent: [Object],
                            _started: true,
                            href: 'https://api.spotify.com/v1/me/player/play?device_id=a8caee9b12196a96...',
                            req: [Object],
                            ntick: true,
                            response: [Circular],
                            originalHost: 'api.spotify.com',
                            originalHostHeaderName: 'host',
                            responseContent: [Circular],
                            _destdata: true,
                            _ended: true,
                            _callbackCalled: true },
                         toJSON: [Function: responseToJSON],
                         caseless: Caseless { dict: [Object] },
                         read: [Function],
                         body: { error: [Object] } } }
                    
                    
                    

                    The result is perfect.
                    But I get error 404, Device not found. I try while I listen to music on my laptop and my magic mirror with raspotify, and I get the same error.
                    I have edit my deviceID and my Authorization in the code for privacy.

                    EDIT:

                    I think I know what is the problem.
                    I have tried with two devices, and it don’t work. But when I try it with the device which is the deviceID that I wrote in the module code, it works.

                    If I don’t say a command before, I get error 404.

                    Working:

                    [AMK2] end-of-utterance
                    [AMK2] Transcription: para la música  --- Done: true
                    { requestId: '5c883e4a-0000-24fa-b7be-...' } { profileFile: 'default.json', lang: 'es-ES' }
                    [AMK2] Device Action: { requestId: '5c883e4a-0000-24fa-b7be-...' }
                    [AMK2] Assistant Text Response: 
                    [AMK2] Conversation Completed
                    [HOTWORD] begins listening.
                    Refreshed access token because it has expired. Expired at: 11:45:40 now is: 11:48:02
                    [HOTWORD] <<  espejito  >> is detected. //My hotword
                    [HOTWORD] stops listening
                    [AMK2] assistant ready
                    [AMK2] Conversation starts.
                    [AMK2] Assistant Text Response: 
                    [AMK2] end-of-utterance
                    [AMK2] Transcription: Rafa Pons en Spotify  --- Done: true
                    [AMK2] openSpotify found: https://open.spotify.com/artist/0DnmOp2SUaeavTi6a32pGY
                    { requestId: '5c884094-0000-27db-94c8-...' } { profileFile: 'default.json', lang: 'es-ES' }
                    [AMK2] Device Action: { requestId: '5c884094-0000-27db-94c8-...' }
                    [AMK2] Assistant Text Response: 
                    play on: a8caee9b12196a964f5a9b0fafaf7ef1
                    [HOTWORD] begins listening.
                    
                    
                    E 1 Reply Last reply Mar 15, 2019, 11:48 AM Reply Quote 0
                    • E Offline
                      ejay-ibm Project Sponsor Module Developer @F17MC
                      last edited by Mar 15, 2019, 11:48 AM

                      @F17MC
                      So in your config.js you have set your device id to ; a8caee9b12196a964f5a9b0fafaf7ef1

                      at this step
                      Error while refreshing:
                      { StatusCodeError: 404 - {“error”:{“status”:404,“message”:“Device not found”}}

                      currentDeviceID variable is passed by case ‘PLAY_SPOTIFY’:
                      payload[“deviceId”] = this.config.deviceId;

                      "If I don’t say a command before, I get error 404. " what do you mean ? could you clarify ?

                      “But when I try it with the device which is the deviceID that I wrote in the module code, it works.”
                      Yes that is expected .

                      For now you can only start playing on the device ID given in the config file as mentioned in the readme :

                      This Module allow to control Spotify player on your Mirror . For now you can only control a single device. It could be your mirror if you are running Raspotify on it. Request to play a song it will be played on your select device in the config.js file. other command doesn’t need a device to be set. So if you are already playing a song on another device, the modules allow you to control this device from your module. But if you request a new song or playlist the set device in config file will play it on it you can not start a new song on a different device from now .

                      Does that clarify the point ?

                      Ejay

                      F 1 Reply Last reply Mar 15, 2019, 11:59 AM Reply Quote 0
                      • 1
                      • 2
                      • 3
                      • 4
                      • 3 / 4
                      3 / 4
                      • First post
                        22/38
                        Last post
                      Enjoying MagicMirror? Please consider a donation!
                      MagicMirror created by Michael Teeuw.
                      Forum managed by Sam, technical setup by Karsten.
                      This forum is using NodeBB as its core | Contributors
                      Contact | Privacy Policy