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

.txt file include

Scheduled Pinned Locked Moved Troubleshooting
59 Posts 6 Posters 34.2k 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.
  • S Online
    sdetweil @banbutcher
    last edited by sdetweil Apr 17, 2020, 12:30 PM Apr 17, 2020, 12:28 PM

    @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 Apr 17, 2020, 8:54 PM Reply Quote 0
    • S Online
      sdetweil @sdetweil
      last edited by Apr 17, 2020, 8:54 PM

      @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 Apr 18, 2020, 1:03 AM

        @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 Apr 18, 2020, 11:44 AM

          @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 Apr 18, 2020, 11:52 AM Reply Quote 0
          • S Online
            sdetweil @banbutcher
            last edited by sdetweil Apr 18, 2020, 1:22 PM Apr 18, 2020, 11:52 AM

            @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 Apr 18, 2020, 1:22 PM Apr 18, 2020, 1:06 PM

              @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 Apr 18, 2020, 1:13 PM Reply Quote 0
              • S Online
                sdetweil @banbutcher
                last edited by sdetweil Apr 18, 2020, 1:21 PM Apr 18, 2020, 1:13 PM

                @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 Apr 18, 2020, 1:24 PM Reply Quote 0
                • B Offline
                  banbutcher
                  last edited by Apr 18, 2020, 1:21 PM

                  @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 Online
                    sdetweil @sdetweil
                    last edited by sdetweil Apr 18, 2020, 1:24 PM Apr 18, 2020, 1:24 PM

                    @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 Online
                      sdetweil
                      last edited by Apr 18, 2020, 1:33 PM

                      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
                      • 1
                      • 2
                      • 3
                      • 4
                      • 5
                      • 6
                      • 6 / 6
                      6 / 6
                      • First post
                        52/59
                        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