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.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.
    • 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
                        • 1
                        • 2
                        • 3
                        • 4
                        • 5
                        • 6
                        • 6 / 6
                        • 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