Преглед на файлове

vlcj 4.0 and debug stuff

LH преди 6 години
родител
ревизия
a69e4e8294

+ 0 - 3
iZpl/src/main/java/de/nplusc/izc/iZpl/API/IZPLApi.java

@@ -22,9 +22,6 @@ import de.nplusc.izc.iZpl.API.shared.PlayListFile;
 import de.nplusc.izc.iZpl.API.shared.SinglePlayListItem;
 import de.nplusc.izc.iZpl.API.shared.PlayListItem;
 import de.nplusc.izc.iZpl.Main;
-import de.nplusc.izc.iZpl.PLServer;
-import de.nplusc.izc.iZpl.PlProcessor;
-import de.nplusc.izc.iZpl.PlProcessorV2;
 import de.nplusc.izc.iZpl.Utils.shared.PLFileIO;
 import java.awt.Image;
 import java.io.File;

+ 35 - 0
iZpl/src/main/java/de/nplusc/izc/iZpl/Main.java

@@ -18,6 +18,9 @@ package de.nplusc.izc.iZpl;
 
 import de.nplusc.izc.iZpl.API.IZPLApi;
 import de.nplusc.izc.iZpl.API.PluginManager;
+import de.nplusc.izc.iZpl.API.shared.MultiPlayListItem;
+import de.nplusc.izc.iZpl.API.shared.PlayListItem;
+import de.nplusc.izc.iZpl.API.shared.SinglePlayListItem;
 import de.nplusc.izc.iZpl.GUI.ConfigureScreen;
 import de.nplusc.izc.iZpl.GUI.FirstRunScreen;
 import de.nplusc.izc.iZpl.GUI.MainMenu;
@@ -37,7 +40,9 @@ import java.io.FileNotFoundException;
 import java.io.FileReader;
 import java.io.FileWriter;
 import java.io.IOException;
+import java.util.Base64;
 import java.util.Date;
+import java.util.function.BiConsumer;
 import javax.imageio.ImageIO;
 import javax.swing.JTextArea;
 import org.apache.commons.cli.ParseException;
@@ -640,6 +645,35 @@ public class Main extends javax.swing.JFrame
         if (u instanceof PlProcessorV2)
         {
             pp = (PlProcessorV2) u;
+            //HACK, encodingissue rausficken
+            BiConsumer<PlayListItem,BiConsumer> haxxz0r = (e,f)->
+                    {
+                        if(e instanceof SinglePlayListItem)
+                        {
+                            SinglePlayListItem itm = ((SinglePlayListItem) e);
+                            String dbg1 = Base64.getEncoder().encodeToString(itm.getPath().getBytes());
+                            String dbg2 = Base64.getEncoder().encodeToString(itm.getTitle().getBytes());
+                            itm.setDebug(dbg1+"|||||"+dbg2);
+                        }
+                        else
+                        {
+                            if(e instanceof MultiPlayListItem)
+                            {
+                                try
+                                {
+                                    ((MultiPlayListItem) e).getItems().forEach((x)->f.accept(e, f));
+                                }
+                                catch(StackOverflowError ignored)
+                                {
+                                    //do nothing, guards against a unexpected recursion that went too deep.
+                                }
+                            }
+                        }
+                    };
+            pp.getPool().forEach((a,p)->
+            {
+                haxxz0r.accept(p, haxxz0r);
+            });
             pp.rebuildCache();
         }
         else//convert()
@@ -875,5 +909,6 @@ public class Main extends javax.swing.JFrame
      * V0.10.0.1 Bugfix Jukebox Table und Loadingbug fixed
      * V0.10.1.0 NoVideoWindow mode für VLC plugin. Used by JukeBox plugin
      * V0.10.2.0 Jukebox standalone icon customizable
+     * V0.11.0.0 Upgrade to vlcJ 4.0
      */
 }

+ 107 - 147
iZpl/src/main/java/de/nplusc/izc/iZpl/Utils/VlcInterface.java

@@ -27,7 +27,6 @@ import de.nplusc.izc.iZpl.API.shared.SinglePlayListItem;
 import de.nplusc.izc.tools.baseTools.Detectors;
 import net.java.truevfs.access.TFile;
 import java.awt.Canvas;
-import java.awt.Image;
 import java.io.File;
 import java.io.IOException;
 import java.util.Arrays;
@@ -35,12 +34,14 @@ import javax.swing.JPanel;
 import org.apache.logging.log4j.LogManager;
 import org.apache.logging.log4j.Logger;
 import uk.co.caprica.vlcj.binding.LibVlc;
-import uk.co.caprica.vlcj.binding.internal.libvlc_media_t;
-import uk.co.caprica.vlcj.player.MediaPlayer;
-import uk.co.caprica.vlcj.player.MediaPlayerEventListener;
-import uk.co.caprica.vlcj.player.MediaPlayerFactory;
+import uk.co.caprica.vlcj.binding.RuntimeUtil;
+import uk.co.caprica.vlcj.player.base.MediaPlayer;
+import uk.co.caprica.vlcj.player.base.MediaPlayerEventListener;
+import uk.co.caprica.vlcj.factory.MediaPlayerFactory;
+import uk.co.caprica.vlcj.media.Media;
+import uk.co.caprica.vlcj.media.MediaRef;
+import uk.co.caprica.vlcj.media.TrackType;
 import uk.co.caprica.vlcj.player.embedded.EmbeddedMediaPlayer;
-import uk.co.caprica.vlcj.runtime.RuntimeUtil;
 
 /**
  *
@@ -62,6 +63,8 @@ public class VlcInterface implements PlaybackPlugin , MediaPlayerEventListener
     private UIPlugin selectedUIPlugin;
     private final String vlcVout;
     private boolean voutRequired = false;
+    private int length = 0;
+    private int position = 0;
     public VlcInterface ()
     {
         this(new File(jarschiv).getParent() + "\\vlcbinaries",true);
@@ -187,12 +190,12 @@ public class VlcInterface implements PlaybackPlugin , MediaPlayerEventListener
     @Override
     public int getLengthInSeconds()
     {
-        return adapter.getLengthInSeconds();
+        return length;
     }
     @Override
     public int getPosition()
     {
-        return adapter.getPosition();
+        return position;
     }
     @Override
     public void seek(int sekunde)
@@ -282,13 +285,13 @@ public class VlcInterface implements PlaybackPlugin , MediaPlayerEventListener
         }
     }
 
-
+   
     @Override
-    public void mediaChanged(MediaPlayer mp, libvlc_media_t l, String string)
-    {     
+    public void mediaChanged(MediaPlayer mp, MediaRef mr)
+    {  
         Thread t = new Thread(() ->
         {
-            grabMediaData(mp);
+            grabMediaData(mp,mr);
             try
             {
                 Thread.sleep(1000);
@@ -296,69 +299,35 @@ public class VlcInterface implements PlaybackPlugin , MediaPlayerEventListener
             catch (InterruptedException devnulled)
             {
             }
-            grabMediaData(mp);
+            grabMediaData(mp,mr);
         });
         t.setName("VLC MediaDataGrabber");
         t.start();
     }
     
-    private void grabMediaData(MediaPlayer mp)
+    private void grabMediaData(MediaPlayer mp,MediaRef mr)
     {
-            mp.parseMedia();
+            Media m = mr.duplicateMedia();
             //IZplGUIBackend.setTitle(mp.getMediaMeta().getTitle());
-
-            l.trace("{}", mp.getMediaMeta());
-            selectedUIPlugin.setTrackLength((int) Math.ceil(mp.getMediaMeta().getLength()/1000.0f));
+            l.trace("Parsing media meta");
+            selectedUIPlugin.setTrackLength((int) Math.ceil(m.info().duration()/1000));
+            
+            length = (int) Math.ceil(m.info().duration()/1000);
+            selectedUIPlugin.setTrackLength(length);
+            m.release();
+            // TODO Media img. 
+            /*
             Image img = mp.getMediaMeta().getArtwork();
             if(img !=null)
             {
                 l.info("got media img");
             }
             selectedUIPlugin.setAlbumArt(img);
+            */
     }
     
-    @Override
-    public void opening(MediaPlayer mp)
-    {
-    }
-
-    @Override
-    public void buffering(MediaPlayer mp, float f)
-    {
-    }
-
-    @Override
-    public void playing(MediaPlayer mp)
-    {
-    }
-
-    @Override
-    public void paused(MediaPlayer mp)
-    {
-    }
-
-    @Override
-    public void stopped(MediaPlayer mp)
-    {
-    }
-
-    @Override
-    public void forward(MediaPlayer mp)
-    {
-    }
-
-    @Override
-    public void backward(MediaPlayer mp)
-    {
-    }
-
-    @Override
-    public void finished(MediaPlayer mp)
-    {
-        finished(false);
-    }
     
-    public void finished(boolean skip)
+    public void finished_internal(boolean skip)
     {
         Thread t = new Thread(()-> //HACK, VLC race conditions
         {
@@ -386,173 +355,186 @@ public class VlcInterface implements PlaybackPlugin , MediaPlayerEventListener
         t.setName("VLC-HACK");
         t.start();
     }
-    @Override
-    public void timeChanged(MediaPlayer mp, long l)
+    
+    //@Override
+    public void error(MediaPlayer mp)
     {
-        selectedUIPlugin.setPlaybackPositionInSeconds((int) Math.ceil(l/1000.0));
+        l.error("Some error happened on the current playlist segment:\n {}",currentTrack.getM3UElement());
+        l.error("Skipping the track!");
+        finished_internal(false);
     }
 
     @Override
-    public void positionChanged(MediaPlayer mp, float f)
+    public boolean playingStatus()
     {
+        return isPlaying;
     }
 
     @Override
-    public void seekableChanged(MediaPlayer mp, int i)
+    public void suppressVideoOut(boolean suppress)
     {
+        suppressVideo = suppress;
+        if(adapter !=null)
+        {
+            adapter.suppressVideoOut(suppress);
+        }
     }
 
     @Override
-    public void pausableChanged(MediaPlayer mp, int i)
+    public void elementaryStreamAdded(MediaPlayer mp, TrackType tt, int i)
     {
-    }
 
-    @Override
-    public void titleChanged(MediaPlayer mp, int i)
-    {
-        
-        
     }
 
     @Override
-    public void snapshotTaken(MediaPlayer mp, String string)
+    public void elementaryStreamDeleted(MediaPlayer mp, TrackType tt, int i)
     {
-    }
 
-    @Override
-    public void lengthChanged(MediaPlayer mp, long l)
-    {
     }
 
     @Override
-    public void videoOutput(MediaPlayer mp, int i)
+    public void elementaryStreamSelected(MediaPlayer mp, TrackType tt, int i)
     {
-    }
 
-    @Override
-    public void error(MediaPlayer mp)
-    {
-        l.error("Some error happened on the current playlist segment:\n {}",currentTrack.getM3UElement());
-        l.error("Skipping the track!");
-        finished(false);
     }
 
     @Override
-    public void mediaMetaChanged(MediaPlayer mp, int i)
+    public void opening(MediaPlayer mp)
     {
+
     }
 
     @Override
-    public void mediaSubItemAdded(MediaPlayer mp, libvlc_media_t l)
+    public void buffering(MediaPlayer mp, float f)
     {
+
     }
 
     @Override
-    public void mediaDurationChanged(MediaPlayer mp, long l)
+    public void playing(MediaPlayer mp)
     {
+
     }
 
     @Override
-    public void mediaParsedChanged(MediaPlayer mp, int i)
+    public void paused(MediaPlayer mp)
     {
+
     }
 
     @Override
-    public void mediaFreed(MediaPlayer mp)
+    public void stopped(MediaPlayer mp)
     {
+        
     }
 
     @Override
-    public void mediaStateChanged(MediaPlayer mp, int i)
+    public void forward(MediaPlayer mp)
     {
+
     }
 
     @Override
-    public void newMedia(MediaPlayer mp)
+    public void backward(MediaPlayer mp)
     {
+
     }
 
     @Override
-    public void subItemPlayed(MediaPlayer mp, int i)
+    public void finished(MediaPlayer mp)
     {
+        finished_internal(false);
     }
 
     @Override
-    public void subItemFinished(MediaPlayer mp, int i)
+    public void seekableChanged(MediaPlayer mp, int i)
     {
+    
     }
 
     @Override
-    public void endOfSubItems(MediaPlayer mp)
+    public void pausableChanged(MediaPlayer mp, int i)
     {
+
     }
 
     @Override
-    public void scrambledChanged(MediaPlayer mp, int i)
+    public void titleChanged(MediaPlayer mp, int i)
     {
-    
+
     }
 
     @Override
-    public void elementaryStreamAdded(MediaPlayer mp, int i, int i1)
+    public void snapshotTaken(MediaPlayer mp, String string)
     {
-   
     }
 
     @Override
-    public void elementaryStreamDeleted(MediaPlayer mp, int i, int i1)
+    public void lengthChanged(MediaPlayer mp, long l)
     {
+        length = (int) Math.ceil(l/1000);
+        selectedUIPlugin.setTrackLength(length);
     }
 
     @Override
-    public void elementaryStreamSelected(MediaPlayer mp, int i, int i1)
+    public void videoOutput(MediaPlayer mp, int i)
     {
+
     }
 
     @Override
-    public void mediaSubItemTreeAdded(MediaPlayer mp, libvlc_media_t l)
+    public void scrambledChanged(MediaPlayer mp, int i)
     {
+
     }
 
     @Override
     public void corked(MediaPlayer mp, boolean bln)
     {
+
     }
 
     @Override
     public void muted(MediaPlayer mp, boolean bln)
     {
+
     }
 
     @Override
     public void volumeChanged(MediaPlayer mp, float f)
     {
+
     }
 
     @Override
     public void audioDeviceChanged(MediaPlayer mp, String string)
     {
+
     }
 
     @Override
     public void chapterChanged(MediaPlayer mp, int i)
     {
+        
     }
 
     @Override
-    public boolean playingStatus()
+    public void positionChanged(MediaPlayer mediaPlayer, float newPosition)
     {
-        return isPlaying;
+
     }
 
     @Override
-    public void suppressVideoOut(boolean suppress)
+    public void timeChanged(MediaPlayer mediaPlayer, long newTime)
     {
-        suppressVideo = suppress;
-        if(adapter !=null)
-        {
-            adapter.suppressVideoOut(suppress);
-        }
+        position = (int) newTime/1000;
+        selectedUIPlugin.setPlaybackPositionInSeconds(position);
+    }
+
+    @Override
+    public void mediaPlayerReady(MediaPlayer mediaPlayer)
+    {
+
     }
 
     
@@ -562,8 +544,6 @@ public class VlcInterface implements PlaybackPlugin , MediaPlayerEventListener
     private interface InternalInterface
     {
         public void addTitle(String vlcpath);
-        public int getLengthInSeconds();
-        public int getPosition();
         public void seek(int sekunde);
         public void skipTitle();
         public void play();
@@ -603,8 +583,8 @@ public class VlcInterface implements PlaybackPlugin , MediaPlayerEventListener
                 f= new MediaPlayerFactory("--no-video-title-show",IZPLApi.getVerbosity()>2?"-vvv":"",suppressVideo?"--no-video":"",voutRequired?"-V":"",voutRequired?vlcVout:""
                 );
             }
-            mpaccess = f.newEmbeddedMediaPlayer();
-            mpaccess.addMediaPlayerEventListener(parent);
+            mpaccess = f.mediaPlayers().newEmbeddedMediaPlayer();
+            mpaccess.events().addMediaPlayerEventListener(parent);
         }
         
         @Override
@@ -623,7 +603,7 @@ public class VlcInterface implements PlaybackPlugin , MediaPlayerEventListener
         public void addTitle(String path)
         {
             String[] options = new String[0];
-            mpaccess.stop();
+            mpaccess.controls().stop();
             l.info("Next title:{}",path);
             if(registeredVideoSurface&&requiresReload)
             {
@@ -640,9 +620,9 @@ public class VlcInterface implements PlaybackPlugin , MediaPlayerEventListener
                 mpaccess.release();
                 f.release();
                 f= new MediaPlayerFactory(options);
-                mpaccess = f.newEmbeddedMediaPlayer();
-                mpaccess.addMediaPlayerEventListener(parent);
-                mpaccess.setVideoSurface(f.newVideoSurface(c));
+                mpaccess = f.mediaPlayers().newEmbeddedMediaPlayer();
+                mpaccess.events().addMediaPlayerEventListener(parent);
+                mpaccess.videoSurface().set(f.videoSurfaces().newVideoSurface(c));
                 requiresReload=false;
             }
             else
@@ -654,45 +634,35 @@ public class VlcInterface implements PlaybackPlugin , MediaPlayerEventListener
                     mpaccess.release();
                     f.release();
                     f= new MediaPlayerFactory("--no-video-title-show",IZPLApi.getVerbosity()>2?"-vvv":"",suppressVideoInternal?"--no-video":"",voutRequired?"-V":"",voutRequired?vlcVout:"");
-                    mpaccess = f.newEmbeddedMediaPlayer();
-                    mpaccess.addMediaPlayerEventListener(parent);
+                    mpaccess = f.mediaPlayers().newEmbeddedMediaPlayer();
+                    mpaccess.events().addMediaPlayerEventListener(parent);
                     requiresReload=false;
                 }
             }
-            mpaccess.playMedia(path,options);
-        }
-        @Override
-        public int getLengthInSeconds()
-        {
-            return (int) (Math.ceil(mpaccess.getLength()/1000f));
-        }
-        @Override
-        public int getPosition()
-        {
-            return (int) (Math.ceil((mpaccess.getLength()/1000f)*mpaccess.getPosition()));
+            mpaccess.media().play(path,options);
         }
         @Override
         public void seek(int sekunde)
         {
-            mpaccess.setPosition(((float)sekunde)/((float)getLengthInSeconds()));
+            mpaccess.controls().setPosition(((float)sekunde)/((float)getLengthInSeconds()));
         }
 
         @Override
         public void skipTitle()
         {
-            parent.finished(true);//über bande spielen
+            parent.finished_internal(true);//über bande spielen
         }
 
         @Override
         public void play()
         {
-            mpaccess.play();
+            mpaccess.controls().play();
         }
 
         @Override
         public void pause()
         {
-           mpaccess.pause();
+           mpaccess.controls().pause();
         }
         
         private int videowidth=0;
@@ -721,12 +691,12 @@ public class VlcInterface implements PlaybackPlugin , MediaPlayerEventListener
                 p.invalidate();
                 videowidth = newvideowidth;
                 videoheight = newvideoheight;
-                mpaccess.setVideoSurface(f.newVideoSurface(c));
+                mpaccess.videoSurface().set(f.videoSurfaces().newVideoSurface(c));
             }
             else
             {
                 requiresReload=true;
-                mpaccess.setVideoSurface(null);
+                mpaccess.videoSurface().set(null);
                 registeredVideoSurface=false;
             }
             
@@ -745,17 +715,7 @@ public class VlcInterface implements PlaybackPlugin , MediaPlayerEventListener
         {
             
         }
-        
-        @Override
-        public int getLengthInSeconds()
-        {
-            return 0;
-        }
-        @Override
-        public int getPosition()
-        {
-            return 0;
-        }
+       
         @Override
         public void seek(int sekunde)
         {

+ 195 - 183
izpl-shared/src/main/java/de/nplusc/izc/iZpl/API/shared/SinglePlayListItem.java

@@ -1,183 +1,195 @@
-/*
- * Copyright (C) 2015 iZc
- *
- * This program is free software: you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published by
- * the Free Software Foundation, either version 3 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License
- * along with this program.  If not, see <http://www.gnu.org/licenses/>.
- */
-package de.nplusc.izc.iZpl.API.shared;
-
-import java.util.Objects;
-
-/**
- *
- * @author LH
- */
-public class SinglePlayListItem implements PlayListItem
-{
-    private String[] prefix;
-    private String[] innerComments;
-    private String path,Title;
-    private int targetplaycount,countPlayed;
-    private boolean include,noexpandoninclude;
-    private int gid=0;
-    public SinglePlayListItem()
-    {
-    targetplaycount=1;
-    Title="";
-    path="";
-    countPlayed=0;
-    };
-    
-    public SinglePlayListItem(String path, String Title, int playcount)
-    {
-        this(path, Title, playcount, false,false);
-    }
-    
-    public SinglePlayListItem(String path, String Title, int playcount,boolean isInclude,boolean noexpandoninclude)
-    {
-        this.path = path;
-        this.Title = Title;
-        this.targetplaycount = playcount;
-        countPlayed=0; //noch nie gespielt als default; bei reload wird anderweitig verglichen :P
-        include=isInclude;
-        this.noexpandoninclude=noexpandoninclude;
-    }
-
-    public String getPath()
-    {
-        return path;
-    }
-
-    public void setPath(String path)
-    {
-        this.path = path;
-    }
-
-    public void setPrefix(String[] prefix)
-    {
-        this.prefix = prefix;
-    }
-    
-    public void setInlineCOmmentLines(String[] lines)
-    {
-        innerComments = lines;
-    }
-    public String getTitle()
-    {
-        return Title;
-    }
-
-    public void setTitle(String Title)
-    {
-        this.Title = Title;
-    }
-
-    public int getTargetPlaycount()
-    {
-        return targetplaycount;
-    }
-
-
-
-    public void setTargetPlaycount(int playcount)
-    {
-        this.targetplaycount = playcount;
-    }
-
-    public int getCountPlayed()
-    {
-        return countPlayed;
-    }
-
-    public void setCountPlayed(int countPlayed)
-    {
-        this.countPlayed = countPlayed;
-    }
-    
-    @Override
-    public String getM3UElement()
-    {
-        return "\n"+Title+"\n"+path;
-    }
-        @Override
-    public int hashCode()
-    {
-        int hash = 3;
-        hash = 23 * hash + Objects.hashCode(this.path);
-        hash = 23 * hash + Objects.hashCode(this.Title);
-        return hash;
-    }
-
-    @Override
-    public boolean equals(Object obj)
-    {
-        if (obj == null)
-        {
-            return false;
-        }
-        if (getClass() != obj.getClass())
-        {
-            return false;
-        }
-        final SinglePlayListItem other = (SinglePlayListItem) obj;
-        if (!Objects.equals(this.path, other.path))
-        {
-            return false;
-        }
-        return Objects.equals(this.Title, other.Title);
-    }
-
-    @Override
-    public boolean isIncludeElement()
-    {
-        return include;
-    }
-
-    @Override
-    public boolean noexpandoninclude()
-    {
-        return noexpandoninclude;
-    }
-    
-    public void setIncludeElements(boolean isInclude,boolean noExpand)
-    {
-        include=isInclude;
-        noexpandoninclude=noExpand;
-    }
-    
-    
-    public void setGID(int pgid)
-    {
-        gid=pgid;
-    }
-    
-    
-    @Override
-    public int getGID()
-    {
-        return gid;
-    }
-    @Override
-    public String[] getPrefix()
-    {
-        return prefix;
-    }
-
-    @Override
-    public String[] getInnerCommentLines()
-    {
-        return innerComments;
-    }
-    
-    
-}
+/*
+ * Copyright (C) 2015 iZc
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+package de.nplusc.izc.iZpl.API.shared;
+
+import java.util.Objects;
+
+/**
+ *
+ * @author LH
+ */
+public class SinglePlayListItem implements PlayListItem
+{
+    private String[] prefix;
+    private String[] innerComments;
+    private String path,Title;
+    private String debug;
+
+    private int targetplaycount,countPlayed;
+    private boolean include,noexpandoninclude;
+    private int gid=0;
+    public SinglePlayListItem()
+    {
+    targetplaycount=1;
+    Title="";
+    path="";
+    countPlayed=0;
+    };
+    
+    public SinglePlayListItem(String path, String Title, int playcount)
+    {
+        this(path, Title, playcount, false,false);
+    }
+    
+    public SinglePlayListItem(String path, String Title, int playcount,boolean isInclude,boolean noexpandoninclude)
+    {
+        this.path = path;
+        this.Title = Title;
+        this.targetplaycount = playcount;
+        countPlayed=0; //noch nie gespielt als default; bei reload wird anderweitig verglichen :P
+        include=isInclude;
+        this.noexpandoninclude=noexpandoninclude;
+    }
+
+    public String getPath()
+    {
+        return path;
+    }
+
+    public void setPath(String path)
+    {
+        this.path = path;
+    }
+
+    public void setPrefix(String[] prefix)
+    {
+        this.prefix = prefix;
+    }
+    
+    public void setInlineCOmmentLines(String[] lines)
+    {
+        innerComments = lines;
+    }
+    public String getTitle()
+    {
+        return Title;
+    }
+
+    public void setTitle(String Title)
+    {
+        this.Title = Title;
+    }
+
+    public int getTargetPlaycount()
+    {
+        return targetplaycount;
+    }
+
+
+
+    public void setTargetPlaycount(int playcount)
+    {
+        this.targetplaycount = playcount;
+    }
+
+    public int getCountPlayed()
+    {
+        return countPlayed;
+    }
+
+    public void setCountPlayed(int countPlayed)
+    {
+        this.countPlayed = countPlayed;
+    }
+    
+    @Override
+    public String getM3UElement()
+    {
+        return "\n"+Title+"\n"+path;
+    }
+        @Override
+    public int hashCode()
+    {
+        int hash = 3;
+        hash = 23 * hash + Objects.hashCode(this.path);
+        hash = 23 * hash + Objects.hashCode(this.Title);
+        return hash;
+    }
+
+    @Override
+    public boolean equals(Object obj)
+    {
+        if (obj == null)
+        {
+            return false;
+        }
+        if (getClass() != obj.getClass())
+        {
+            return false;
+        }
+        final SinglePlayListItem other = (SinglePlayListItem) obj;
+        if (!Objects.equals(this.path, other.path))
+        {
+            return false;
+        }
+        return Objects.equals(this.Title, other.Title);
+    }
+
+    @Override
+    public boolean isIncludeElement()
+    {
+        return include;
+    }
+
+    @Override
+    public boolean noexpandoninclude()
+    {
+        return noexpandoninclude;
+    }
+    
+    public void setIncludeElements(boolean isInclude,boolean noExpand)
+    {
+        include=isInclude;
+        noexpandoninclude=noExpand;
+    }
+    
+    
+    public void setGID(int pgid)
+    {
+        gid=pgid;
+    }
+    
+    
+    @Override
+    public int getGID()
+    {
+        return gid;
+    }
+    @Override
+    public String[] getPrefix()
+    {
+        return prefix;
+    }
+
+    @Override
+    public String[] getInnerCommentLines()
+    {
+        return innerComments;
+    }
+    
+    //HACK, debuggen von ner verfickten encodingissue
+    public String getDebug()
+    {
+        return debug;
+    }
+
+    public void setDebug(String debug)
+    {
+        this.debug = debug;
+    }
+    
+}