diff options
author | Hans Oesterholt <hans@oesterholt.net> | 2013-01-13 16:08:45 +0100 |
---|---|---|
committer | Hans Oesterholt <hans@oesterholt.net> | 2013-01-13 16:08:45 +0100 |
commit | a994682eb70152cf3679676e11bebc21949a0b03 (patch) | |
tree | 6e8841e9f623741e839f4b40260ca5dcf78d853d | |
parent | 0e7765354435893a53940885908fe01200a5bbca (diff) |
Adding CueSheet Editing support
-rw-r--r-- | src/CueSheets/Banshee.CueSheets/CS_Info.cs | 28 | ||||
-rw-r--r-- | src/CueSheets/Banshee.CueSheets/CueSheet.cs | 90 | ||||
-rw-r--r-- | src/CueSheets/Banshee.CueSheets/CueSheetEditor.cs | 67 | ||||
-rw-r--r-- | src/CueSheets/Banshee.CueSheets/CueSheetEntry.cs | 1 | ||||
-rw-r--r-- | src/CueSheets/Banshee.CueSheets/CueSheetsPrefs.cs | 9 | ||||
-rw-r--r-- | src/CueSheets/Banshee.CueSheets/CueSheetsSource.cs | 9 | ||||
-rw-r--r-- | src/CueSheets/Banshee.CueSheets/Tools.cs | 47 | ||||
-rw-r--r-- | src/CueSheets/CueSheets.csproj | 2 | ||||
-rw-r--r-- | src/CueSheets/Makefile.am | 4 |
9 files changed, 228 insertions, 29 deletions
diff --git a/src/CueSheets/Banshee.CueSheets/CS_Info.cs b/src/CueSheets/Banshee.CueSheets/CS_Info.cs new file mode 100644 index 0000000..758b862 --- /dev/null +++ b/src/CueSheets/Banshee.CueSheets/CS_Info.cs @@ -0,0 +1,28 @@ +using System; + +namespace Banshee.CueSheets +{ + public class CS_Info + { + public CS_Info () + { + } + + public static string Version() { + return "0.0.6"; + } + + public static string [] Authors() { + return new string[] {"Hans Oesterholt"}; + } + + public static string Website() { + return "http://oesterholt.net?env=data&page=banshee-cuesheets"; + } + + public static string Info() { + return "CueSheets is an extension that allows you to play music from cuesheets in banshee"; + } + } +} + diff --git a/src/CueSheets/Banshee.CueSheets/CueSheet.cs b/src/CueSheets/Banshee.CueSheets/CueSheet.cs index 5c30a3e..1a951e4 100644 --- a/src/CueSheets/Banshee.CueSheets/CueSheet.cs +++ b/src/CueSheets/Banshee.CueSheets/CueSheet.cs @@ -49,9 +49,7 @@ namespace Banshee.CueSheets public string genre() { int n=_basedir.Length; string d=_directory.Substring (n); - d=Regex.Replace (d,"^[/]",""); - String r=Regex.Replace (d,"[/].*$",""); - //Console.WriteLine ("n="+n+", d="+d+", r="+r); + string r=Tools.firstpart(d); return r; } @@ -112,6 +110,13 @@ namespace Banshee.CueSheets return k-1; } + public void resetArt() { + string aaid=CoverArtSpec.CreateArtistAlbumId (_performer,_title); + string path=CoverArtSpec.GetPathForNewFile(aaid,_img_full_path); + File.Delete (path); + File.Copy (_img_full_path,path); + } + public string getArtId() { string aaid=CoverArtSpec.CreateArtistAlbumId (_performer,_title); if (!CoverArtSpec.CoverExists (aaid)) { @@ -120,11 +125,8 @@ namespace Banshee.CueSheets if (!File.Exists (path)) { File.Copy (_img_full_path,path); } - //Console.WriteLine ("coverartpath="+path); } } - //string path1=CoverArtSpec.GetPath (aaid); - //Console.WriteLine ("coverartpath1="+path1); return aaid; } @@ -143,6 +145,78 @@ namespace Banshee.CueSheets return "Performer: "+this.performer ()+", Title: "+this.title ()+"\ncuefile: "+this.cueFile()+"\nwave: "+this.musicFileName(); } + public void SetPerformer(string p) { + _performer=p; + } + + public void SetTitle(string t) { + _title=t; + } + + public void SetImagePath(string path) { + string fn=Tools.basename(path); + string fnp=Tools.makefile(_directory,fn); + if (!File.Exists (fnp)) { + File.Copy (path,fnp); + } + _image_file_name=fn; + _img_full_path=fnp; + } + + public void ClearTracks() { + base.Clear (); + _tracks=null; + } + + public void AddTrack(string e_title,string e_perf,double e_offset) { + int nr=0; + if (_tracks!=null) { + nr=_tracks.Length; + } + string aaid=getArtId (); + CueSheetEntry e=new CueSheetEntry(_music_file_name,aaid,nr,-1,e_title,e_perf,_title,e_offset); + append (e); + int i,N; + for(i=0,N=nEntries ();i<N;i++) { + _tracks[i].setNrOfTracks(N); + } + } + + public void Save() { + //System.IO.StreamWriter wrt=new System.IO.StreamWriter(); + if (!File.Exists (_cuefile+".bck")) { + File.Copy (_cuefile,_cuefile+".bck"); + } + resetArt (); + System.IO.StreamWriter wrt=new System.IO.StreamWriter(_cuefile); + wrt.WriteLine ("REM Banshee CueSheets Extension "+CS_Info.Version()); + wrt.WriteLine ("REM Banshee AAID : "+getArtId ()); + wrt.WriteLine ("REM IMAGE \""+_image_file_name+"\""); + wrt.WriteLine ("PERFORMER \""+_performer+"\""); + wrt.WriteLine ("TITLE \""+_title+"\""); + string mfn=Tools.basename(_music_file_name); + wrt.WriteLine ("FILE \""+mfn+"\" WAVE"); + + int i,N; + for(i=0,N=nEntries ();i<N;i++) { + CueSheetEntry e=_tracks[i]; + wrt.WriteLine (" TRACK "+String.Format ("{0:00}",i+1)+" AUDIO"); + wrt.WriteLine (" TITLE \""+e.title ()+"\""); + wrt.WriteLine (" PERFORMER \""+e.performer ()+"\""); + int t=(int) (e.offset ()*100.0); + int m=t/(100*60); + int s=(t/100)%60; + int hs=t%100; + wrt.WriteLine (" INDEX 01 "+ String.Format("{0:00}",m)+":"+ + String.Format ("{0:00}",s)+":"+ + String.Format ("{0:00}",hs) + ); + } + + wrt.Close (); + + } + public void iLoad() { Boolean _in_tracks=false; string e_perf=""; @@ -174,7 +248,7 @@ namespace Banshee.CueSheets _music_file_name=m.ToString (); //Console.WriteLine ("result="+_music_file_name); _music_file_name=Regex.Replace (_music_file_name,"[\"]","").Trim (); - _music_file_name=directory+"/"+_music_file_name; + _music_file_name=Tools.makefile(directory,_music_file_name); //Console.WriteLine ("music file="+_music_file_name); } else if (line.Substring(0,5).ToLower ()=="track") { _in_tracks=true; @@ -183,7 +257,7 @@ namespace Banshee.CueSheets if (eq(line,"image")) { _image_file_name=line.Substring (5).Trim (); _image_file_name=Regex.Replace (_image_file_name,"[\"]","").Trim (); - _img_full_path=directory+"/"+_image_file_name; + _img_full_path=Tools.makefile(directory,_image_file_name); } } } diff --git a/src/CueSheets/Banshee.CueSheets/CueSheetEditor.cs b/src/CueSheets/Banshee.CueSheets/CueSheetEditor.cs index 4e6fca2..57f5596 100644 --- a/src/CueSheets/Banshee.CueSheets/CueSheetEditor.cs +++ b/src/CueSheets/Banshee.CueSheets/CueSheetEditor.cs @@ -1,4 +1,5 @@ using System; +using System.Text.RegularExpressions; namespace Banshee.CueSheets { @@ -15,6 +16,7 @@ namespace Banshee.CueSheets private Gtk.Button _reload; private Gtk.Button _add_track; private Gtk.Button _del_track; + private Gtk.Button _save; public CueSheetEditor (CueSheet s) { //_sheet=new CueSheet(s.cueFile()); @@ -32,9 +34,13 @@ namespace Banshee.CueSheets _title.Text=_sheet.title (); _performer.Text=_sheet.performer (); - _imagefile.SelectFilename (_sheet.imageFullFileName()); - Gdk.Pixbuf pb=new Gdk.Pixbuf(_sheet.imageFullFileName(),100,100); - _image.Pixbuf=pb; + try { + _imagefile.SelectFilename (_sheet.imageFullFileName()); + Gdk.Pixbuf pb=new Gdk.Pixbuf(_sheet.imageFullFileName(),100,100); + _image.Pixbuf=pb; + } catch(System.Exception e) { + Hyena.Log.Information (e.ToString ()); + } _store.Clear (); int i,N; for(i=0,N=_sheet.nEntries ();i<N;i++) { @@ -44,7 +50,9 @@ namespace Banshee.CueSheets hs=t%100; m=t/(100*60); s=(t/100)%60; - String offset=String.Format ("{0:00}",m)+":"+String.Format ("{0:00}",s)+"."+hs.ToString (); + String offset=String.Format ("{0:00}",m)+":"+ + String.Format ("{0:00}",s)+"."+ + String.Format ("{0:00}",hs); _store.AppendValues (i+1,_sheet.entry (i).title (),offset); } } @@ -57,9 +65,12 @@ namespace Banshee.CueSheets _performer=new Gtk.Entry(200); _title=new Gtk.Entry(200); + _title.WidthChars=60; + _performer.WidthChars=60; _image=new Gtk.Image(); _image.SetSizeRequest (100,100); _imagefile=new Gtk.FileChooserButton("Choose image file",Gtk.FileChooserAction.Open); + _imagefile.FileSet+=new EventHandler(EvtImageSet); Gtk.Image icn_add_track=new Gtk.Image(Gtk.Stock.Add,Gtk.IconSize.Button); _add_track=new Gtk.Button(icn_add_track); @@ -69,6 +80,10 @@ namespace Banshee.CueSheets _del_track=new Gtk.Button(icn_del_track); _del_track.Clicked+=OnDelTrack; + Gtk.Image icn_save=new Gtk.Image(Gtk.Stock.Save,Gtk.IconSize.Button); + _save=new Gtk.Button(icn_save); + _save.Clicked+=OnSave; + _store=new Gtk.ListStore(typeof(int),typeof(string),typeof(string)); _tracks=new Gtk.TreeView(); _tracks.AppendColumn ("Nr.", new Gtk.CellRendererText (), "text", 0); @@ -91,30 +106,32 @@ namespace Banshee.CueSheets hb2.PackEnd (_reload,false,false,1); hb2.PackEnd (_del_track,false,false,1); hb2.PackEnd (_add_track,false,false,1); + hb2.PackEnd (_save,false,false,1); Gtk.HBox hb=new Gtk.HBox(); Gtk.VBox vb1=new Gtk.VBox(); vb1.PackStart (frm,false,false,0); vb1.PackStart (hb2,true,true,0); - hb.PackStart (vb1); + hb.PackStart (vb1,false,false,0); Gtk.Frame frm2=new Gtk.Frame(); frm2.Add (_image); - hb.PackEnd (frm2); + hb.PackEnd (frm2,false,false,2); Gtk.ScrolledWindow scroll=new Gtk.ScrolledWindow(); scroll.Add (_tracks); + scroll.SetSizeRequest (-1,300); base.VBox.PackStart(hb,false,false,4); base.VBox.PackStart (_imagefile,false,false,4); base.VBox.PackStart(scroll,true,true,0); base.VBox.ShowAll (); - base.AddButton ("Cancel",0); - base.AddButton ("OK",1); + base.AddButton ("Close",0); } public void OnReload(object sender,EventArgs args) { + Reload (); } public void OnAddTrack(object sender,EventArgs args) { @@ -122,6 +139,40 @@ namespace Banshee.CueSheets public void OnDelTrack(object sender,EventArgs args) { } + + public void EvtImageSet(object sender,EventArgs args) { + try { + string imgf=_imagefile.Filename; + Gdk.Pixbuf pb=new Gdk.Pixbuf(imgf,100,100); + _image.Pixbuf=pb; + } catch(System.Exception e) { + Hyena.Log.Information (e.ToString ()); + } + } + + public void OnSave(object sender,EventArgs args) { + string nPerformer=_performer.Text.Trim (); + string nTitle=_title.Text.Trim (); + _sheet.SetPerformer(nPerformer); + _sheet.SetTitle(nTitle); + _sheet.SetImagePath(_imagefile.Filename); + _sheet.ClearTracks(); + Gtk.TreeIter iter; + if (_store.GetIterFirst(out iter)) { + do { + string title=(string) _store.GetValue (iter,1); + string offset=(string) _store.GetValue (iter,2); + string []parts=Regex.Split(offset,"[.:]"); + double e_offset; + int min=Convert.ToInt32(parts[0]); + int secs=Convert.ToInt32(parts[1]); + int hsecs=Convert.ToInt32(parts[2]); + e_offset=min*60+secs+(hsecs/100.0); + _sheet.AddTrack(title,nPerformer,e_offset); + } while(_store.IterNext (ref iter)); + } + _sheet.Save(); + } } } diff --git a/src/CueSheets/Banshee.CueSheets/CueSheetEntry.cs b/src/CueSheets/Banshee.CueSheets/CueSheetEntry.cs index 129f386..9aa864f 100644 --- a/src/CueSheets/Banshee.CueSheets/CueSheetEntry.cs +++ b/src/CueSheets/Banshee.CueSheets/CueSheetEntry.cs @@ -97,7 +97,6 @@ namespace Banshee.CueSheets this.CanPlay=true; this.CanSaveToDatabase=false; this.Duration=new System.TimeSpan(0,0,10,0); - //Console.WriteLine ("file="+_file); this.Uri=new Hyena.SafeUri(_file,false); } } diff --git a/src/CueSheets/Banshee.CueSheets/CueSheetsPrefs.cs b/src/CueSheets/Banshee.CueSheets/CueSheetsPrefs.cs index df0e6fb..d519ac1 100644 --- a/src/CueSheets/Banshee.CueSheets/CueSheetsPrefs.cs +++ b/src/CueSheets/Banshee.CueSheets/CueSheetsPrefs.cs @@ -93,11 +93,10 @@ namespace Banshee.CueSheets public void handleAbout(object sender,EventArgs a) { Gtk.AboutDialog ab=new Gtk.AboutDialog(); - ab.Authors=new string[] {"Hans Oesterholt"}; - ab.Authors[0]="Hans Oesterholt"; - ab.Version="0.0.5 (2013-01-12)"; - ab.Comments="CueSheets is an extension that allows you to play music from cuesheets in banshee"; - ab.Website="http://oesterholt.net?env=data&page=banshee-cuesheets"; + ab.Authors=CS_Info.Authors (); + ab.Version=CS_Info.Version(); + ab.Comments=CS_Info.Info (); + ab.Website=CS_Info.Website(); ab.Run (); ab.Destroy (); } diff --git a/src/CueSheets/Banshee.CueSheets/CueSheetsSource.cs b/src/CueSheets/Banshee.CueSheets/CueSheetsSource.cs index b823833..82b572f 100644 --- a/src/CueSheets/Banshee.CueSheets/CueSheetsSource.cs +++ b/src/CueSheets/Banshee.CueSheets/CueSheetsSource.cs @@ -242,13 +242,8 @@ namespace Banshee.CueSheets private String basedir=null; private CueSheet _selected=null; - public string basename(string f) { - string bn=Regex.Replace (f,"^([^/]*[/])+",""); - return bn; - } - public string cuename(string f) { - string cn=Regex.Replace(basename (f),"[.]cue$",""); + string cn=Regex.Replace(Tools.basename(f),"[.]cue$",""); return cn; } @@ -438,6 +433,8 @@ namespace Banshee.CueSheets public void EditSheet(CueSheet s) { CueSheetEditor edt=new CueSheetEditor(s); edt.Do (); + MySource.getAlbumModel ().Reload (); + MySource.getArtistModel ().Reload (); } internal class MyAlbumListView : AlbumListView { diff --git a/src/CueSheets/Banshee.CueSheets/Tools.cs b/src/CueSheets/Banshee.CueSheets/Tools.cs new file mode 100644 index 0000000..02220b7 --- /dev/null +++ b/src/CueSheets/Banshee.CueSheets/Tools.cs @@ -0,0 +1,47 @@ +using System; +using System.Text.RegularExpressions; + +namespace Banshee.CueSheets +{ + public class Tools + { + public Tools () + { + } + + static public bool isUnixLike() { + System.OperatingSystem os=Environment.OSVersion; + PlatformID id=os.Platform; + return id==PlatformID.Unix || id==PlatformID.MacOSX; + } + + static public string basename(string filename) { + if (isUnixLike ()) { + return Regex.Replace (filename,"^([^/]*[/])+",""); + } else { + return Regex.Replace (filename,"^([^\\]*[\\])+",""); + } + } + + static public string makefile(string dir,string filename) { + if (isUnixLike ()) { + return dir+"/"+filename; + } else { + return dir+"\\"+filename; + } + } + + static public string firstpart(string path) { + if (isUnixLike ()) { + string d=Regex.Replace (path,"^[/]",""); + string r=Regex.Replace (d,"[/].*$",""); + return r; + } else { + string d=Regex.Replace (path,"^[\\]",""); + string r=Regex.Replace (d,"[\\].*$",""); + return r; + } + } + } +} + diff --git a/src/CueSheets/CueSheets.csproj b/src/CueSheets/CueSheets.csproj index 0e72f98..5afe470 100644 --- a/src/CueSheets/CueSheets.csproj +++ b/src/CueSheets/CueSheets.csproj @@ -99,6 +99,8 @@ <Compile Include="Banshee.CueSheets\GenreListView.cs" /> <Compile Include="Banshee.CueSheets\Loosely.cs" /> <Compile Include="Banshee.CueSheets\CueSheetEditor.cs" /> + <Compile Include="Banshee.CueSheets\CS_Info.cs" /> + <Compile Include="Banshee.CueSheets\Tools.cs" /> </ItemGroup> <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> <ProjectExtensions> diff --git a/src/CueSheets/Makefile.am b/src/CueSheets/Makefile.am index 808b6a5..72bc25a 100644 --- a/src/CueSheets/Makefile.am +++ b/src/CueSheets/Makefile.am @@ -7,6 +7,7 @@ SOURCES = \ Banshee.CueSheets/CS_ArtistInfo.cs \ Banshee.CueSheets/CS_ArtistModel.cs \ Banshee.CueSheets/CS_GenreModel.cs \ + Banshee.CueSheets/CS_Info.cs \ Banshee.CueSheets/CueSheet.cs \ Banshee.CueSheets/CueSheetEditor.cs \ Banshee.CueSheets/CueSheetEntry.cs \ @@ -14,7 +15,8 @@ SOURCES = \ Banshee.CueSheets/CueSheetsSource.cs \ Banshee.CueSheets/GenreInfo.cs \ Banshee.CueSheets/GenreListView.cs \ - Banshee.CueSheets/Loosely.cs + Banshee.CueSheets/Loosely.cs \ + Banshee.CueSheets/Tools.cs RESOURCES = CueSheets.addin.xml |