summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHans Oesterholt <hans@oesterholt.net>2013-01-13 16:08:45 +0100
committerHans Oesterholt <hans@oesterholt.net>2013-01-13 16:08:45 +0100
commita994682eb70152cf3679676e11bebc21949a0b03 (patch)
tree6e8841e9f623741e839f4b40260ca5dcf78d853d
parent0e7765354435893a53940885908fe01200a5bbca (diff)
Adding CueSheet Editing support
-rw-r--r--src/CueSheets/Banshee.CueSheets/CS_Info.cs28
-rw-r--r--src/CueSheets/Banshee.CueSheets/CueSheet.cs90
-rw-r--r--src/CueSheets/Banshee.CueSheets/CueSheetEditor.cs67
-rw-r--r--src/CueSheets/Banshee.CueSheets/CueSheetEntry.cs1
-rw-r--r--src/CueSheets/Banshee.CueSheets/CueSheetsPrefs.cs9
-rw-r--r--src/CueSheets/Banshee.CueSheets/CueSheetsSource.cs9
-rw-r--r--src/CueSheets/Banshee.CueSheets/Tools.cs47
-rw-r--r--src/CueSheets/CueSheets.csproj2
-rw-r--r--src/CueSheets/Makefile.am4
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