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.

    .txt file include

    Scheduled Pinned Locked Moved Troubleshooting
    59 Posts 6 Posters 38.9k Views 6 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.
    • B Offline
      banbutcher
      last edited by

      Node_helper :)

      const NodeHelper = require("node_helper");
      const fs= require("fs");
      
      module.exports = NodeHelper.create({
      //here comes the part of the nodehelper after the 3 dots as posted above
      
      	socketNotificationReceived: function(notification, payload) {
      		if(notification === "START"){
      			this.config = payload;
      			this.readData();
          			setInterval(() => {
              			this.readData();
          			}, this.config.updateInterval);
      		}
      	},
      
      	readData: function(){
      		//to read a file to do the following
      		fs.readFile("new-tv-list.txt", "utf8", (err, data) => {
      			if (err) throw err;
      			this.sendSocketNotification("DATA", data);
      		});
      	}
      });
      
      1 Reply Last reply Reply Quote 0
      • S Offline
        sdetweil @banbutcher
        last edited by

        @banbutcher I won’t have time to look at this tonight

        Sam

        How to add modules

        learning how to use browser developers window for css changes

        B 1 Reply Last reply Reply Quote 0
        • B Offline
          banbutcher @sdetweil
          last edited by

          @sdetweil
          not a problem at all, i really appreciate your help so far in this topic and every other question ive had across the board! :thumbs_up_light_skin_tone:

          S 1 Reply Last reply Reply Quote 0
          • S Offline
            sdetweil @banbutcher
            last edited by sdetweil

            @banbutcher ok, the fs.readFile() returns ALL the content of the file. I still would remove the utf8.

            but you want a list of names, not a stream of characters…
            so you need to split the stream into an array.

            a list of text ‘lines’ has a character after each, called a line feed, we don’t want those

            but the last filename MAY or MAY NOT be followed by a line feed. (depends on how the file was created)

            anyhow we can fix that

            I would change the readData function in node_helper like this

            readData: function(){
            		//to read a file to do the following
            		fs.readFile("new-tv-list.txt", (err, data) => {
                                    var output_data = null
                                    // if there was no error  
            			if (!err){
                                      // convert byte stream to array of names   
                                      output_data=data.toString().concat("\n").split('\n')
                                    }   
                                    // always send something back to module, so it can display messages
                                    // might be null if there was an error 
            			this.sendSocketNotification("DATA", output_data);
            		});
            	}
            

            then to fix the module side
            build an html table structure

            var wrapper = document.createElement("div");
            		if(this.dataFile){
                                    var output_list= [];
                                    // setup regex, no i  no g (only once, and case sensitive)
                                    var splitRegExp = /.*[S][(0-9)]+[E][(0-9)]+/;
                                    // loop thru the list of filenames
                                    for(filename of this.dataFile) {
                                        // if the name is not zero length (split could have returned for just linefeed
                                        if(filename.length >0) {
                                           // get the filename prefix
                                           var split = splitRegExp.exec(filename);
                                           // save name to the output list, as a table entry
                                           // remove space after the ->< , the forum hides everything after unless a space
                                           // table has a row, 
                                           output_list.push("< tr>< td>")
                                           // with data
                                           output_list.push(split)
                                           // end of data and row
                                           output_list.push("< /td>< /tr>")
                                        } 
                                    }  
                                    // insert the table into the wrapper
            			wrapper.innerHTML = "< table>" + output_list.join('')+ "< /table>";
            		} else {
            

            Sam

            How to add modules

            learning how to use browser developers window for css changes

            S 1 Reply Last reply Reply Quote 0
            • S Offline
              sdetweil @sdetweil
              last edited by

              @banbutcher

              you can also you divs instead of a table, and then set a css style
              ‘display’:‘inline-flex’
              ‘flex-direction’:‘vertical’

              and u can also use code to create the tree instead of text (don’t use the output_list anymore)
              (and u can use this with divs too, don’t need as many elements)

              var table=document.createElement("table")
              wrapper.appendChild(table)
                        for(filename of this.dataFile) {
                             // if the name is not zero length (split could have returned for just linefeed
                             if(filename.length >0) {
                                    // get the filename prefix
                                    var tr=document.createElement("tr")
                                    table.appendChild(tr)
                                    var td=document.createElement("td")
                                    tr.appendChild(td)
                                    var split = splitRegExp.exec(filename);
                                    td.innerText=split
                              }
                    }
              return wrapper;
              

              Sam

              How to add modules

              learning how to use browser developers window for css changes

              1 Reply Last reply Reply Quote 0
              • B Offline
                banbutcher
                last edited by

                @sdetweil

                Awesome i will try and get it working tonight!

                Thanks,

                Richie

                1 Reply Last reply Reply Quote 0
                • B Offline
                  banbutcher
                  last edited by

                  @sdetweil

                  wow… works like a charm! lists all tv shows perfectly! :)
                  is there any way to print a line if the regex isn’t met… ie like a movie title instead of a series title with s01e03 attached?
                  and possibly limit output to 10 lines?

                  Thanks,

                  Richie

                  S 1 Reply Last reply Reply Quote 0
                  • S Offline
                    sdetweil @banbutcher
                    last edited by sdetweil

                    @banbutcher >is there any way to print a line if the regex isn’t met… ie like a movie title instead of a series title with s01e03 attached?
                    and possibly limit output to 10 lines?

                    sure

                    // should make this a config variable by adding to module defaults
                    // then would be this.config.counter
                    // get display limit, 10 if not specified in defaults
                    var counter=this.config.counter || 10
                              var table=document.createElement("table")
                              wrapper.appendChild(table)
                              for(filename of this.dataFile) {
                                   // if the name is not zero length (split could have returned for just linefeed
                                   // and the view limit has not been reached
                                   if(filename.length >0 && counter>0) {
                                          // get the filename prefix
                                          var tr=document.createElement("tr")
                                          table.appendChild(tr)
                                          var td=document.createElement("td")
                                          tr.appendChild(td)
                                          var split = splitRegExp.exec(filename);
                                          if(split)                        
                                              td.innerText=split
                                          else
                                              td.innerText='name not matched '+ filename
                                          counter--;
                                    }
                          }
                    return wrapper;
                    

                    or using the text form

                    var wrapper = document.createElement("div");
                    		if(this.dataFile){
                                            var output_list= [];
                                            // should make this a config variable by adding to module defaults
                                           // then would be this.config.counter
                                           // get display limit, 10 if not specified in defaults
                                           var counter=this.config.counter || 10
                                            // setup regex, no i  no g (only once, and case sensitive)
                                            var splitRegExp = /.*[S][(0-9)]+[E][(0-9)]+/;
                                            // loop thru the list of filenames
                                            for(filename of this.dataFile) {
                                                // if the name is not zero length (split could have returned for just linefeed
                                                if(filename.length >0 && counter >0) {
                                                   // get the filename prefix
                                                   var split = splitRegExp.exec(filename);
                                                   // save name to the output list, as a table entry
                                                   // remove space after the ->< , the forum hides everything after unless a space
                                                   // table has a row, 
                                                   output_list.push("< tr>< td>")
                                                   // with data
                                                   if(split)
                                                      output_list.push(split)
                                                   else 
                                                       output_list.push('name not matched '+ filename)
                                                   // end of data and row
                                                   output_list.push("< /td>< /tr>")
                                                   counter--;
                                                } 
                                            }  
                                            // insert the table into the wrapper
                    			wrapper.innerHTML = "< table>" + output_list.join('')+ "< /table>";
                    		} else {
                    

                    Sam

                    How to add modules

                    learning how to use browser developers window for css changes

                    1 Reply Last reply Reply Quote 0
                    • B Offline
                      banbutcher
                      last edited by sdetweil

                      @sdetweil

                      the counter part worked great, but then when i tried to add it if loop for the name check, im getting “no data” maybe i messed up copying across?

                                              var output_list= [];
                      			var counter=this.config.counter || 11
                                              // setup regex, no i  no g (only once, and case sensitive)
                                              var splitRegExp = /.*[S][(0-9)]+[E][(0-9)]+/;
                                              // loop thru the list of filenames
                                              for(filename of this.dataFile) {
                                                  // if the name is not zero length (split could have returned for just linefeed
                                                  if(filename.length >0 && counter>0) {
                                                     // get the filename prefix
                                                     var split = splitRegExp.exec(filename);
                                                     // save name to the output list, as a table entry
                                                     // table has a row, 
                                                     output_list.push("<tr><td>")
                      			       // with data
                      			       if(split )
                                                        output_list.push(split)
                      			       else
                      			          output_list.push('name not found:'+ filename)
                                                     // end of data and row
                                                     output_list.push("</td></tr>")
                      			       counter--;
                                                  } 
                                              }  
                                              // insert the table into the wrapper
                      			wrapper.innerHTML = "<table>" + output_list.join('')+ "</table>";
                      		 } else {
                      			wrapper.innerHTML = "No Data";
                      		}
                      
                      S 1 Reply Last reply Reply Quote 0
                      • S Offline
                        sdetweil @banbutcher
                        last edited by sdetweil

                        @banbutcher said in .txt file include:

                        im getting “no data” maybe i messed up copying across?

                        sorry, don’t understand the words…

                        this is the test if the regex worked

                                                       if(split)
                                                          output_list.push(split)
                        			       else
                        			          output_list.push('name not found:'+ filename)
                        

                        Sam

                        How to add modules

                        learning how to use browser developers window for css changes

                        S 1 Reply Last reply Reply Quote 0
                        • B Offline
                          banbutcher
                          last edited by

                          @sdetweil

                          this code works…

                          		if(this.dataFile){
                                                  var output_list= [];
                          			var counter=this.config.counter || 11
                                                  // setup regex, no i  no g (only once, and case sensitive)
                                                  var splitRegExp = /.*[S][(0-9)]+[E][(0-9)]+/;
                                                  // loop thru the list of filenames
                                                  for(filename of this.dataFile) {
                                                      // if the name is not zero length (split could have returned for just linefeed
                                                      if(filename.length >0 && counter>0) {
                                                         // get the filename prefix
                                                         var split = splitRegExp.exec(filename);
                                                         // save name to the output list, as a table entry
                                                         // table has a row, 
                                                         output_list.push("<tr><td>")
                                                         // with data
                                                         output_list.push(split)
                                                         // end of data and row
                                                         output_list.push("</td></tr>")
                          			       counter--;
                                                      } 
                                                  }  
                                                  // insert the table into the wrapper
                          			wrapper.innerHTML = "<table>" + output_list.join('')+ "</table>";
                          		 } else {
                          

                          this code doesnt…

                                                  var output_list= [];
                          			var counter=this.config.counter || 11
                                                  // setup regex, no i  no g (only once, and case sensitive)
                                                  var splitRegExp = /.*[S][(0-9)]+[E][(0-9)]+/;
                                                  // loop thru the list of filenames
                                                  for(filename of this.dataFile) {
                                                      // if the name is not zero length (split could have returned for just linefeed
                                                      if(filename.length >0 && counter>0) {
                                                         // get the filename prefix
                                                         var split = splitRegExp.exec(filename);
                                                         // save name to the output list, as a table entry
                                                         // table has a row, 
                                                         output_list.push("<tr><td>")
                          			       // with data
                          			       if(split.length >0 )
                                                            output_list.push(split)
                          			       else
                          			          output_list.push('name not found:'+ filename)
                                                         // end of data and row
                                                         output_list.push("</td></tr>")
                          			       counter--;
                                                      } 
                                                  }  
                                                  // insert the table into the wrapper
                          			wrapper.innerHTML = "<table>" + output_list.join('')+ "</table>";
                          		 } else {
                          			wrapper.innerHTML = "No Data";
                          		}
                          

                          Richie :)

                          1 Reply Last reply Reply Quote 0
                          • S Offline
                            sdetweil @sdetweil
                            last edited by sdetweil

                            @banbutcher

                            my fault… I ‘assumed’ that regex would return an empty string… it returns a null value…

                            I fixed my sample, and your paste with the correct test

                            if(split)
                            

                            instead of

                            if(split.length>0)
                            

                            Sam

                            How to add modules

                            learning how to use browser developers window for css changes

                            1 Reply Last reply Reply Quote 0
                            • S Offline
                              sdetweil
                              last edited by

                              and for others trying to implement code, you can debug using the developers console, OR make little sample files and run them directly in node

                              i named this testit.js in the user home folder (~/testit.js)

                              var dataFile=["Archer S01E02Someshow.tv",
                              "Archer S01E03Someshow .tv",
                              "Archer S01e02Someshow .tv",
                              "Archer S01E04Someshow .tv",
                              "Archer S01E05someshow .tv",
                              "Archer s01E02Someshow .tv",
                              "Archer S01E09Someshow .tv",
                              ]
                              var counter1=10
                              
                              
                                                  if(dataFile){
                                                      var output_list= [];
                                                      // should make this a config variable by adding to module defaults
                                                     // then would be this.config.counter
                                                     // get display limit, 10 if not specified in defaults
                                                     var counter=counter1 || 10
                                                      // setup regex, no i  no g (only once, and case sensitive)
                                                      var splitRegExp = /.*[S][(0-9)]+[E][(0-9)]+/;
                                                      // loop thru the list of filenames
                                                      for(filename of dataFile) {
                                                          // if the name is not zero length (split could have returned for just linefeed
                                                          if(filename.length >0 && counter >0) {
                                                             // get the filename prefix
                                                             var split = splitRegExp.exec(filename);
                                                             // save name to the output list, as a table entry
                                                             // remove space after the ->< , the forum hides everything after unless a space
                                                             // table has a row, 
                                                             output_list.push("<tr><td>")
                                                             // with data
                                                             if(split)
                                                                output_list.push(split)
                                                             else 
                                                                 output_list.push('name not matched '+ filename)
                                                             // end of data and row
                                                             output_list.push("</td></tr>")
                                                             counter--;
                                                          } 
                                                      }  
                                                  }
                                                      // insert the table into the wrapper
                                          console.log( "<table>" + output_list.join('')+ "</table>");
                              

                              and then

                              cd ~
                              node testit.js
                              

                              Sam

                              How to add modules

                              learning how to use browser developers window for css changes

                              1 Reply Last reply Reply Quote 0
                              • B Offline
                                banbutcher
                                last edited by

                                Perfect!!

                                now i can go to bed! :D tomorrows task will be styling with css! any pointers?

                                as always… thanks again!!

                                Richie

                                S 1 Reply Last reply Reply Quote 0
                                • S Offline
                                  sdetweil @banbutcher
                                  last edited by sdetweil

                                  @banbutcher said in .txt file include:

                                  styling with css! any pointers

                                  sorry, that is my weakness… I cannot make anything look good… I can tell you if it DOES look good, but cannot do it myself… I have no eye for that all…

                                  Sam

                                  How to add modules

                                  learning how to use browser developers window for css changes

                                  1 Reply Last reply Reply Quote 0

                                  Hello! It looks like you're interested in this conversation, but you don't have an account yet.

                                  Getting fed up of having to scroll through the same posts each visit? When you register for an account, you'll always come back to exactly where you were before, and choose to be notified of new replies (either via email, or push notification). You'll also be able to save bookmarks and upvote posts to show your appreciation to other community members.

                                  With your input, this post could be even better 💗

                                  Register Login
                                  • 1
                                  • 2
                                  • 3
                                  • 3 / 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