• 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.

Controlling Embedded Youtube Video on MM

Scheduled Pinned Locked Moved Troubleshooting
23 Posts 6 Posters 12.8k Views 8 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.
  • Z Offline
    zichao92
    last edited by Feb 4, 2017, 4:54 PM

    @Jopyth , yea I’m using and modifying your remote module. Thanks for the tip, will try it out soon

    1 Reply Last reply Reply Quote 0
    • Z Offline
      zichao92
      last edited by Feb 6, 2017, 7:35 AM

      Hi @Jopyth ,

      I looked through your code regarding generic notification request under your MMM remote. However, im not too sure how to incorporate the notification request into my modification. I tried replacing this.sendNotification("PAUSE_VIDEO", payload); with ?action=NOTIFICATION¬ification=PAUSE_VIDEO, however it doesnt work.

      Can you assists me regarding this?

      J 1 Reply Last reply Feb 7, 2017, 1:16 PM Reply Quote 0
      • J Offline
        Jopyth Moderator @zichao92
        last edited by Jopyth Feb 7, 2017, 1:17 PM Feb 7, 2017, 1:16 PM

        @zichao92 Try something like this:

        var notification = "EXAMPLE";
        var payload = "some payload, could be an object";
        var encoded = encodeURIComponent(JSON.stringify(payload));
        Remote.getWithStatus("action=NOTIFICATION&n"+"otification=" + notification + "&payload=" + encoded);
        

        Edit: Added “+” to remove strange replacement with &not.

        Helpful sticky: How to troubleshoot

        Z 1 Reply Last reply Feb 15, 2017, 11:34 AM Reply Quote 0
        • Z Offline
          zichao92 @Jopyth
          last edited by Feb 15, 2017, 11:34 AM

          @Jopyth ,

          I tried that method to send a notification to the node_helper.js and from there, to broadcast the notification ‘PAUSE_VIDEO’ via sendNotifcation to another module with notificationReceived code at the receiving end.

          However, I got an error stating that sendNotifcation as error reported as TypeError: this.sendNotification is not a function . Is there any work around to this?

          J 1 Reply Last reply Feb 15, 2017, 11:40 AM Reply Quote 0
          • J Offline
            Jopyth Moderator @zichao92
            last edited by Jopyth Feb 15, 2017, 11:46 AM Feb 15, 2017, 11:40 AM

            @zichao92 You can not send notifications from the node_helper.js (they are running in the back end), they can only be send from the modules in the front end, i.e. MMM-Remote-Control.js.

            Edit: Also the method I described above should already do all the forwarding of the nofification until it is broad cast to the other modules. Did you change anything in the other files?

            Edit2: These are the lines which should make everything work: In the node_helper.js and in the MMM-Remote-Control.js.

            Helpful sticky: How to troubleshoot

            Z 2 Replies Last reply Feb 16, 2017, 6:58 AM Reply Quote 0
            • Z Offline
              zichao92 @Jopyth
              last edited by Feb 16, 2017, 6:58 AM

              @Jopyth, I realized i was using an older version of your remote control. However, after updating the remote control module, i inserted your recommended line back into this code:

                // edit menu buttons
                      "show-all-button": function() {
                      var parent = document.getElementById("visible-modules-results");
                      var buttons = parent.children;
                      for (var i = 0; i < buttons.length; i++) {
                       if (buttons[i].id!="module_5_youtube"){
                          if (Remote.hasClass(buttons[i], "external-locked")) {
                              continue;
                          }
                          buttons[i].className = buttons[i].className.replace("toggled-off", "toggled-on");
                          Remote.showModule(buttons[i].id);
                          var notification = "SCREEN_WAKEUP";
                          Remote.getWithStatus("action=NOTIFICATION&n"+"otification=" + notification );
                          }
                      else{
                              if (Remote.hasClass(buttons[i], "external-locked")) {
                              continue;
                          }
                          buttons[i].className = buttons[i].className.replace("toggled-on", "toggled-off");
                          Remote.hideModule(buttons[i].id);
                                      }
              

              I was testing this code with paviro’s PIR module ( https://github.com/paviro/MMM-PIR-Sensor) on this line which is found from his MMM-PIR-Sensor.js .

              	notificationReceived: function(notification, payload) {
              		if (notification === "SCREEN_WAKEUP"){
              			this.sendNotification(notification, payload)
              		}
              	},
              

              I modified the PIR code in such a way that when it receives the SCREEN_WAKEUP notification , it will perform certain actions for me rather than turning on the monitor.

              1 Reply Last reply Reply Quote 0
              • Z Offline
                zichao92
                last edited by Feb 27, 2017, 2:17 PM

                Hi all, im not too sure if i have made any mistake regarding the structure of MMM.

                I placed my notificationReceived at the front end of embedded youtube, which i called it youtube.js( it doesnt have any node_helper) :

                Here’s the code of my youtube.js , the codes are heavily based on a the default module called “compliments” :

                module.register("youtube",{
                
                	// Module config defaults.
                	defaults: {
                
                		updateInterval: 30000,
                		fadeSpeed: 4000
                	},
                
                
                
                	// Define required scripts.
                	getScripts: function() {
                		return ["moment.js"];
                //		exec("sudo python /home/pi/NicoRFID/RFID_playlist.py");
                	},
                	getStyles: function() {
                	    return [
                	        'script.css', // will try to load it from the vendor folder, otherwise it will load is from the module folder.
                	    ]
                	},
                
                	// Define start sequence.
                	start: function() {
                		Log.info("Starting module: " + this.name);
                
                		
                		// Schedule update timer.
                		var self = this;
                		setInterval(function() {
                			self.updateDom(self.config.fadeSpeed);
                		}, this.config.updateInterval);
                	},
                		
                
                		
                	/* randomIndex(compliments)
                	 * Generate a random index for a list of compliments.
                	 *
                	 * argument compliments Array - Array with compliments.
                	 *
                	 * return Number - Random index.
                	 */
                
                	/* complimentArray()
                	 * Retrieve an array of compliments for the time of the day.
                	 *
                	 * return compliments Array - Array with compliments for the time of the day.
                	 */
                	
                	/* complimentArray()
                	 * Retrieve a random compliment.
                	 *
                	 * return compliment string - A compliment.
                	 */
                		notificationReceived: function(notification, payload) {
                		if (notification === "PAUSE_VIDEO"){
                			pausethevideo()
                
                		}
                		else if (notification === "PLAY_VIDEO"){
                			playthevideo()
                
                		}
                	},
                
                
                	// Override dom generator.
                	getDom: function() {
                		//var complimentText = this.randomCompliment();
                		//var complimentText = "Hi NUS GOD Puay Hiang ";
                
                		//var compliment = document.createTextNode(complimentText);
                
                		var wrapper = document.createElement("div");
                		wrapper.className = "thin xlarge bright";
                
                		function playthevideo(){
                		var myPlayer = document.getElementById('my-video');
                		myPlayer.playVideo();
                		};
                
                		function stopthevideo(){
                		var myPlayer = document.getElementById('my-video');
                		myPlayer.stopVideo();
                		};
                
                		function pausethevideo(){
                		var myPlayer = document.getElementById('my-video'); 
                		myPlayer.pauseVideo();
                		};
                		
                		
                		wrapper.innerHTML='<div> <div> allowfullscreen></div></div>';
                
                		
                
                		
                
                			
                		//wrapper.appendChild(compliment);
                
                		return wrapper;
                	}
                
                });
                

                So with the notificationReceived line, i intend to control my video using the remote control with these codes :

                / edit menu buttons
                        "show-all-button": function() {
                        var parent = document.getElementById("visible-modules-results");
                        var buttons = parent.children;
                        for (var i = 0; i < buttons.length; i++) {
                         if (buttons[i].id!="module_5_youtube"){
                            if (Remote.hasClass(buttons[i], "external-locked")) {
                                continue;
                            }
                            buttons[i].className = buttons[i].className.replace("toggled-off", "toggled-on");
                            Remote.showModule(buttons[i].id);
                            var notification = "PAUSE_VIDEO";
                            Remote.getWithStatus("action=NOTIFICATION&n"+"otification=" + notification );
                            }
                        else{
                                if (Remote.hasClass(buttons[i], "external-locked")) {
                                continue;
                            }
                            buttons[i].className = buttons[i].className.replace("toggled-on", "toggled-off");
                            Remote.hideModule(buttons[i].id);
                                        }
                

                Am i doing something wrong here?

                1 Reply Last reply Reply Quote 0
                • Z Offline
                  zichao92 @Jopyth
                  last edited by Mar 2, 2017, 2:08 PM

                  @Jopyth ,

                  I managed to have some developments with your remote control module’s sendNotifcation command. I hooked up the MM using a browser and observed( using dev console, Note to beginners: press F12 on a browser to access this cool feature ) that a notification was send from MM Remote. This means that you were right all along, just that i didnt know how to observe the sendNotification command via dev console.

                  Currently, i have another issue. My youtube.js module receives the “PLAY_VIDEO” or “PAUSE_VIDEO” notification but is not able to perform what was desired.

                  Here’s my snippet of my code from my youtube.js :

                  notificationReceived: function(notification, payload) {
                  		if (notification === "PAUSE_VIDEO"){
                  			pausethevideo()
                  
                  		}
                  		if (notification === "PLAY_VIDEO"){
                  			playthevideo()
                  
                  		}
                  	},
                  
                  getDom: function() {
                  var wrapper = document.createElement("div");
                  		wrapper.className = "thin xlarge bright";
                  
                  		function playthevideo(){
                  		var myPlayer = document.getElementById('my-video');
                  		myPlayer.playVideo();
                  		};
                  
                  		function stopthevideo(){
                  		var myPlayer = document.getElementById('my-video');
                  		myPlayer.stopVideo();
                  		};
                  
                  		function pausethevideo(){
                  		var myPlayer = document.getElementById('my-video'); 
                  		myPlayer.pauseVideo();
                  		};
                  		
                  		
                  		wrapper.innerHTML='<div> <div> allowfullscreen></div></div>'; //youtube video link found here.
                  
                  		
                  
                  			return wrapper;
                  	}
                  
                  });
                  

                  However, i got an error from dev console :
                  Uncaught TypeError: Cannot read property 'pauseVideo' of null at Class.notificationReceived (youtube.js:69)

                  Im suspecting that my pauseVideo/playVideo function wasn’t recognised as it is getDom.

                  Will appreciate any help or advice !

                  strawberry 3.141S 1 Reply Last reply Mar 2, 2017, 3:59 PM Reply Quote 0
                  • strawberry 3.141S Offline
                    strawberry 3.141 Project Sponsor Module Developer @zichao92
                    last edited by Mar 2, 2017, 3:59 PM

                    @zichao92 the access to those functions is limited to the getDom function.

                    you should put the definitions outside like

                    playthevideo: function() {
                    //do the stuff
                    }
                    

                    and call the function like this.playthevideo()

                    Please create a github issue if you need help, so I can keep track

                    Z 1 Reply Last reply Mar 3, 2017, 1:51 AM Reply Quote 0
                    • Z Offline
                      zichao92 @strawberry 3.141
                      last edited by zichao92 Mar 3, 2017, 1:52 AM Mar 3, 2017, 1:51 AM

                      @strawberry-3.141 said in Controlling Embedded Youtube Video on MM:

                      playthevideo: function() {
                      //do the stuff
                      }

                      Hi there,

                      I tried your recommendation but i got this error Uncaught TypeError: Cannot read property 'playVideo' of null.
                      Which is coming from this code:

                      playthevideo: function() {
                      		var myPlayer = document.getElementById('my-video');
                      		myPlayer.playVideo();
                      		},
                      

                      I suspect that the problem is that the above function is not being recognise as my embedded youtube codes still lies in the getDom function, which has the allowscriptaccess="awalys" that allows the user to control the video. I tried to extract out from the getDom function but i think my syntax is wrong. Here’s the full code of the youtube function that’s in the getDom function.

                      		wrapper.innerHTML='<div> <div>  //(youtube link here ) controls=0&showinfo=0&rel=0&autoplay=1" allowscriptaccess="always" name="my-video" frameborder="0" enablejsapi=1&version=3&playerapiid=ytplayer" type="application/x-shockwave-flash"> allowfullscreen></div></div>';
                      
                      strawberry 3.141S 1 Reply Last reply Mar 3, 2017, 7:36 AM Reply Quote 0
                      • 1
                      • 2
                      • 3
                      • 1 / 3
                      • First post
                        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