diff options
author | Hans Oesterholt <hans@oesterholt.net> | 2013-01-16 14:35:13 +0100 |
---|---|---|
committer | Hans Oesterholt <hans@oesterholt.net> | 2013-01-16 14:35:13 +0100 |
commit | 27f3e103f60c8c3983ad32608fd3d9023c2a79eb (patch) | |
tree | 1fbf00c918c2dde1bd1a8f93ac4fce8a3f7f4279 | |
parent | f63cfb9eb5f38c1116d520a569233d39d7aba2c5 (diff) |
CueSheets: Added functionality to split mp3s (libmp3splt is used) and added a refresh menu option.
CueSheets: This functionality can be used when I figure out how to interact with the extension to
CueSheets: add music to devices.
CueSheets: Added Resources
-rw-r--r-- | src/CueSheets/Banshee.CueSheets/CueSheetsSource.cs | 37 | ||||
-rw-r--r-- | src/CueSheets/Banshee.CueSheets/Gui/Actions.cs | 28 | ||||
-rw-r--r-- | src/CueSheets/Banshee.CueSheets/Gui/MusicToDevice.cs | 49 | ||||
-rw-r--r-- | src/CueSheets/Banshee.CueSheets/mp3splt/Mp3Split.cs | 276 | ||||
-rw-r--r-- | src/CueSheets/Banshee.CueSheets/mp3splt/Mp3SplitTrack.cs | 87 | ||||
-rw-r--r-- | src/CueSheets/CueSheets.csproj | 9 | ||||
-rw-r--r-- | src/CueSheets/Makefile.am | 6 | ||||
-rw-r--r-- | src/CueSheets/Resources/GlobalUI.xml | 6 | ||||
-rw-r--r-- | src/Telepathy/Banshee.Telepathy/Banshee.Telepathy.csproj | 5 |
9 files changed, 498 insertions, 5 deletions
diff --git a/src/CueSheets/Banshee.CueSheets/CueSheetsSource.cs b/src/CueSheets/Banshee.CueSheets/CueSheetsSource.cs index 1e3c2f7..8d76afb 100644 --- a/src/CueSheets/Banshee.CueSheets/CueSheetsSource.cs +++ b/src/CueSheets/Banshee.CueSheets/CueSheetsSource.cs @@ -56,6 +56,9 @@ using Banshee.Configuration; namespace Banshee.CueSheets { + + + // We are inheriting from Source, the top-level, most generic type of Source. // Other types include (inheritance indicated by indentation): // DatabaseSource - generic, DB-backed Track source; used by PlaylistSource @@ -73,9 +76,10 @@ namespace Banshee.CueSheets private List<CueSheet> _sheets=new List<CueSheet>(); private CueSheet _sheet=null; private CueSheetsPrefs _preferences; + private Actions _actions; private CS_TrackInfoDb _track_info_db; - + public CueSheetsSource () : base (AddinManager.CurrentLocalizer.GetString ("CueSheets"), AddinManager.CurrentLocalizer.GetString ("CueSheets"), sort_order, @@ -93,6 +97,15 @@ namespace Banshee.CueSheets Properties.SetString ("Icon.Name", "cueplay"); Hyena.Log.Information ("CueSheets source has been instantiated."); + try { + Properties.SetString("GtkActionPath","/CueSheetsPopup"); + _actions = new Actions (this); + Hyena.Log.Information(_actions.ToString()); + } catch (System.Exception ex) { + Hyena.Log.Information(ex.ToString ()); + } + + InterfaceActionService action_service = ServiceManager.Get<InterfaceActionService> (); Gtk.Menu viewMenu = (action_service.UIManager.GetWidget ("/MainMenu/ViewMenu") as Gtk.MenuItem).Submenu as Gtk.Menu; @@ -231,7 +244,7 @@ namespace Banshee.CueSheets } return _artistModel; } - + public CS_ComposerModel getComposerModel() { if (_composerModel==null) { Hyena.Log.Information ("ComposerModel init"); @@ -284,6 +297,11 @@ namespace Banshee.CueSheets _view.fill (); } + public void RefreshCueSheets() { + Hyena.Log.Information("refreshing"); + _view.fill (); + } + private class CustomView : ISourceContents { private Gtk.ListStore store; @@ -599,6 +617,10 @@ namespace Banshee.CueSheets MySource.getArtistModel ().Reload (); } + public void MusicFileToDevice(CueSheet s) { + MusicToDevice mtd=new MusicToDevice(s); + mtd.Do (); + } public void ToggleGrid(string forId) { Hyena.Log.Information ("ToggleGrid for id "+forId); @@ -673,9 +695,20 @@ namespace Banshee.CueSheets edit.Activated+=delegate(object sender,EventArgs a) { _view.EditSheet(((CS_AlbumInfo) this.Model[Selection.FirstIndex]).getSheet ()); }; + mnu.Append (play); mnu.Append (new Gtk.SeparatorMenuItem()); mnu.Append (edit); + CueSheet s=((CS_AlbumInfo) this.Model[Selection.FirstIndex]).getSheet (); + if (Mp3Split.DllPresent()) { + if (Mp3Split.IsSupported(s.musicFileName ())) { + Gtk.ImageMenuItem split=new Gtk.ImageMenuItem(Gtk.Stock.Convert,null); + split.Activated+=delegate(object sender,EventArgs a) { + _view.MusicFileToDevice(((CS_AlbumInfo) this.Model[Selection.FirstIndex]).getSheet ()); + }; + mnu.Append (split); + } + } mnu.ShowAll (); mnu.Popup(); return false; diff --git a/src/CueSheets/Banshee.CueSheets/Gui/Actions.cs b/src/CueSheets/Banshee.CueSheets/Gui/Actions.cs new file mode 100644 index 0000000..93a01d5 --- /dev/null +++ b/src/CueSheets/Banshee.CueSheets/Gui/Actions.cs @@ -0,0 +1,28 @@ +using System; +using Banshee.I18n; + +namespace Banshee.CueSheets +{ + public class Actions : Banshee.Gui.BansheeActionGroup + { + private CueSheetsSource _src; + + public Actions (CueSheetsSource src) : base ("CueSheets") { + + _src=src; + + base.AddImportant ( + new Gtk.ActionEntry ("Synchronize", Gtk.Stock.Refresh, + Catalog.GetString ("Refresh CueSheets"), + null, null, + (o, a) => { _src.RefreshCueSheets(); } + ) + ); + + AddUiFromFile ("GlobalUI.xml"); + + Register (); + } + } +} + diff --git a/src/CueSheets/Banshee.CueSheets/Gui/MusicToDevice.cs b/src/CueSheets/Banshee.CueSheets/Gui/MusicToDevice.cs new file mode 100644 index 0000000..06a7525 --- /dev/null +++ b/src/CueSheets/Banshee.CueSheets/Gui/MusicToDevice.cs @@ -0,0 +1,49 @@ +using System; + +namespace Banshee.CueSheets +{ + public class MusicToDevice : Gtk.Dialog + { + private CueSheet _sheet; + private Mp3Split _splt; + + public MusicToDevice (CueSheet s) { + _sheet=s; + } + + private void CreateGui() { + Gtk.Button btn=new Gtk.Button("Split!"); + Gtk.ProgressBar bar=new Gtk.ProgressBar(); + Gtk.ProgressBar nr=new Gtk.ProgressBar(); + Gtk.Button ok=(Gtk.Button) base.AddButton ("OK",1); + btn.Clicked+=delegate(object sender,EventArgs args) { + ok.Sensitive=false; + _splt.SplitWithPaths (); + _splt.SplitToDir ("/tmp"); + GLib.Timeout.Add(10,delegate () { + bar.Fraction=_splt.ProgressOfCurrentTrack; + int n=_splt.ProgressNTracks; + int i=_splt.ProgressCurrentTrack; + double d=((double) i)/((double) n); + nr.Fraction=d; + if (_splt.SplitFinished) { ok.Sensitive=true; } + return !_splt.SplitFinished; + }); + }; + base.VBox.Add (nr); + base.VBox.Add (bar); + base.VBox.Add (btn); + base.VBox.ShowAll (); + } + + public void Do() { + _splt=new Mp3Split(_sheet); + Hyena.Log.Information ("splt="+_splt.ToString ()+" sheet="+_sheet); + CreateGui (); + base.Run (); + base.Hide (); + base.Destroy (); + } + } +} + diff --git a/src/CueSheets/Banshee.CueSheets/mp3splt/Mp3Split.cs b/src/CueSheets/Banshee.CueSheets/mp3splt/Mp3Split.cs new file mode 100644 index 0000000..0a3db4e --- /dev/null +++ b/src/CueSheets/Banshee.CueSheets/mp3splt/Mp3Split.cs @@ -0,0 +1,276 @@ +using System; +using System.Runtime.InteropServices; +using Mono.Unix; +using System.Text.RegularExpressions; +using System.Collections.Generic; +using System.Text; +using System.Threading; +using System.Runtime.CompilerServices; + +namespace Banshee.CueSheets +{ + + enum Mp3SpltOptions { + SPLT_OPT_PRETEND_TO_SPLIT, + SPLT_OPT_QUIET_MODE, + SPLT_OPT_DEBUG_MODE, + SPLT_OPT_SPLIT_MODE, + SPLT_OPT_TAGS, + SPLT_OPT_XING, + SPLT_OPT_CREATE_DIRS_FROM_FILENAMES, + SPLT_OPT_OUTPUT_FILENAMES, + SPLT_OPT_FRAME_MODE, + SPLT_OPT_AUTO_ADJUST, + SPLT_OPT_INPUT_NOT_SEEKABLE, + SPLT_OPT_PARAM_NUMBER_TRACKS, + SPLT_OPT_PARAM_REMOVE_SILENCE, + SPLT_OPT_PARAM_GAP, + SPLT_OPT_ALL_REMAINING_TAGS_LIKE_X, + SPLT_OPT_AUTO_INCREMENT_TRACKNUMBER_TAGS, + SPLT_OPT_ENABLE_SILENCE_LOG, + SPLT_OPT_FORCE_TAGS_VERSION, + SPLT_OPT_LENGTH_SPLIT_FILE_NUMBER, + SPLT_OPT_REPLACE_TAGS_IN_TAGS, + SPLT_OPT_OVERLAP_TIME, + SPLT_OPT_SPLIT_TIME, + SPLT_OPT_PARAM_THRESHOLD, + SPLT_OPT_PARAM_OFFSET, + SPLT_OPT_PARAM_MIN_LENGTH, + SPLT_OPT_PARAM_MIN_TRACK_LENGTH, + SPLT_OPT_ARTIST_TAG_FORMAT, + SPLT_OPT_ALBUM_TAG_FORMAT, + SPLT_OPT_TITLE_TAG_FORMAT, + SPLT_OPT_COMMENT_TAG_FORMAT, + SPLT_OPT_REPLACE_UNDERSCORES_TAG_FORMAT, + SPLT_OPT_SET_FILE_FROM_CUE_IF_FILE_TAG_FOUND, + }; + + enum SpltOutputFileNamesOptions { + SPLT_OUTPUT_FORMAT, + SPLT_OUTPUT_DEFAULT, + SPLT_OUTPUT_CUSTOM + }; + + [StructLayout(LayoutKind.Sequential)] + struct splt_progres { + public int progress_text_max_char; + [MarshalAsAttribute(UnmanagedType.ByValTStr, SizeConst = 512)] + public string filename_shorted; + public float percent_progress; + public int current_split; + public int max_splits; + public int progress_type; + public int silence_found_tracks; + public float silence_db_level; + public int user_data; + public IntPtr progress_callback_function; // void (*progress)(struct splt_progres*, void *); + public IntPtr progress_cb_data; // public void *progress_cb_data; + }; + + public class Mp3Split : IDisposable + { + private IntPtr _mp3_state; + private List<Mp3SplitTrack> _tracks=new List<Mp3SplitTrack>(); + + private int _progress_n_tracks; + private int _progress_current_track; + private float _progress_of_current_track; + private bool _finished; + + public delegate void ProgressCallBack(IntPtr progres,IntPtr data); + + public Mp3Split (CueSheet s) { + int error=0; + + _mp3_state=mp3splt_new_state (out error); + error=mp3splt_find_plugins (_mp3_state); + Hyena.Log.Information ("mp3splt: find_plugins result:"+error); + + mp3splt_set_int_option(_mp3_state,Mp3SpltOptions.SPLT_OPT_SET_FILE_FROM_CUE_IF_FILE_TAG_FOUND,1); + mp3splt_set_int_option(_mp3_state,Mp3SpltOptions.SPLT_OPT_OUTPUT_FILENAMES,(int) SpltOutputFileNamesOptions.SPLT_OUTPUT_FORMAT); + mp3splt_set_oformat(_mp3_state,"@A - @b - @n - @t",out error); + mp3splt_put_cue_splitpoints_from_file(_mp3_state,s.cueFile (),out error); + mp3splt_set_default_genre_tag(_mp3_state,s.genre ()); + + int count,ctags; + IntPtr pointarray=mp3splt_get_splitpoints(_mp3_state,out count,out error); + IntPtr tagarray=mp3splt_get_tags (_mp3_state,out ctags,out error); + Hyena.Log.Information ("count="+count+", ctags="+ctags); + + { + int i; + _tracks.Clear (); + int N=(count<ctags) ? count : ctags; + for(i=0;i<N;i++) { + _tracks.Add (new Mp3SplitTrack(pointarray,tagarray,i)); + } + } + } + + public void SplitWithPaths() { + int error=0; + mp3splt_set_int_option(_mp3_state,Mp3SpltOptions.SPLT_OPT_CREATE_DIRS_FROM_FILENAMES,1); + mp3splt_set_oformat(_mp3_state,"@A/@b/@n @t",out error); + } + + public int ProgressCurrentTrack { + [MethodImpl(MethodImplOptions.Synchronized)] + get { return _progress_current_track; } + [MethodImpl(MethodImplOptions.Synchronized)] + set { _progress_current_track = value; } + } + + public int ProgressNTracks { + [MethodImpl(MethodImplOptions.Synchronized)] + get { return _progress_n_tracks; } + [MethodImpl(MethodImplOptions.Synchronized)] + set { _progress_n_tracks = value; } + } + + public float ProgressOfCurrentTrack { + [MethodImpl(MethodImplOptions.Synchronized)] + get { return _progress_of_current_track; } + [MethodImpl(MethodImplOptions.Synchronized)] + set { _progress_of_current_track = value; } + } + + public bool SplitFinished { + [MethodImpl(MethodImplOptions.Synchronized)] + get { return _finished; } + [MethodImpl(MethodImplOptions.Synchronized)] + set { _finished = value; } + } + + + public void Progress(IntPtr progr,IntPtr data) { + splt_progres pr=(splt_progres) Marshal.PtrToStructure (progr,typeof(splt_progres)); + this.ProgressCurrentTrack=pr.current_split; + this.ProgressNTracks=pr.max_splits; + this.ProgressOfCurrentTrack=pr.percent_progress; + } + + private void Splitter() { + int result=mp3splt_split (_mp3_state); + SplitFinished=true; + Hyena.Log.Information ("splitresult="+result); + } + + public void SplitToDir(string directory) { + + mp3splt_set_path_of_split(_mp3_state,directory); + mp3splt_set_progress_function (_mp3_state,new ProgressCallBack(Progress),IntPtr.Zero); + SplitFinished=false; + Thread split_thread=new Thread(new ThreadStart(Splitter)); + split_thread.Start (); + Hyena.Log.Information ("thread:"+split_thread); + //Hyena.Log.Information ("split-to-dir: result="+result); + } + + #region IDisposable implementation + public void Dispose () + { + int error=0; + mp3splt_free_state(_mp3_state,out error); + Hyena.Log.Information ("mp3splt-free-state error="+error); + } + #endregion + + public static bool IsSupported(string file) { + if (Regex.IsMatch (file,"[.][Mm][Pp][3]$") || + Regex.IsMatch (file,"[.][Oo][Gg][Gg]$")) { + return true; + } else { + return false; + } + } + + private void LogResult(int res) { + if (res<0) { + Hyena.Log.Error ("mp3splt: error="+res+", "+mp3splt_get_strerror(_mp3_state,res)); + } else { + Hyena.Log.Information ("mp3splt: result="+res+", "+mp3splt_get_strerror(_mp3_state,res)); + } + } + + private static int _dll_present=0; + + public static bool DllPresent() { + if (_dll_present==0) { + Hyena.Log.Information ("Checking presence of libmp3splt"); + try { + string version=mp3splt_get_version(); + Hyena.Log.Information ("libmp3splt found. Good thing. Version present: "+version); + _dll_present=1; + return true; + } catch (System.DllNotFoundException ex) { + Hyena.Log.Error("libmp3splt not present on this system"); + Hyena.Log.Information (ex.ToString ()); + _dll_present=-1; + return false; + } + } else { + return _dll_present>0; + } + } + + public static string mp3splt_get_version() { + StringBuilder version=new StringBuilder(20); + mp3splt_get_version (version); + return version.ToString (); + } + + [DllImport ("libmp3splt.dll")] + private static extern IntPtr mp3splt_get_version(StringBuilder dest); + + [DllImport ("libmp3splt.dll")] + private static extern IntPtr mp3splt_new_state(out int error); + + [DllImport ("libmp3splt.dll")] + private static extern void mp3splt_free_state(IntPtr state,out int error); + + [DllImport ("libmp3splt.dll")] + private static extern void mp3splt_put_cue_splitpoints_from_file(IntPtr state,string cuefile,out int err); + + [DllImport ("libmp3splt.dll")] + private static extern string mp3splt_get_filename_to_split(IntPtr state); + + [DllImport ("libmp3splt.dll")] + private static extern string mp3splt_get_strerror(IntPtr state, int error_code); + + [DllImport ("libmp3splt.dll")] + private static extern void mp3splt_set_int_option(IntPtr state,Mp3SpltOptions op,int val); + + [DllImport ("libmp3splt.dll")] + private static extern int mp3splt_set_default_genre_tag(IntPtr state, string default_genre_tag); + + [DllImport ("libmp3splt.dll")] + private static extern void mp3splt_export_to_cue(IntPtr state, string out_file, short stop_at_total_time, out int error); + + [DllImport ("libmp3splt.dll")] + private static extern IntPtr mp3splt_get_splitpoints(IntPtr state,out int count,out int err); + + [DllImport ("libmp3splt.dll")] + private static extern IntPtr mp3splt_get_tags(IntPtr state,out int tags_number, out int error); + + [DllImport ("libmp3splt.dll")] + private static extern void mp3splt_set_oformat(IntPtr state,string format_string,out int error); + + [DllImport ("libmp3splt.dll")] + private static extern int mp3splt_set_path_of_split(IntPtr state, string path); + + [DllImport ("libmp3splt.dll")] + private static extern int mp3splt_set_progress_function(IntPtr state,ProgressCallBack callback,IntPtr cb_data); + + [DllImport ("libmp3splt.dll")] + private static extern int mp3splt_split(IntPtr state); + + [DllImport ("libmp3splt.dll")] + private static extern int mp3splt_stop_split(IntPtr state); + + [DllImport ("libmp3splt.dll")] + private static extern int mp3splt_find_plugins(IntPtr state); + + } + +} + diff --git a/src/CueSheets/Banshee.CueSheets/mp3splt/Mp3SplitTrack.cs b/src/CueSheets/Banshee.CueSheets/mp3splt/Mp3SplitTrack.cs new file mode 100644 index 0000000..b6f3414 --- /dev/null +++ b/src/CueSheets/Banshee.CueSheets/mp3splt/Mp3SplitTrack.cs @@ -0,0 +1,87 @@ +using System; +using System.Runtime.InteropServices; +using Mono.Unix; +using System.Text.RegularExpressions; +using System.Collections.Generic; + +namespace Banshee.CueSheets +{ + [StructLayout(LayoutKind.Sequential)] + struct SpltPoint { + public long val; + public IntPtr name; + public int type; + }; + + [StructLayout(LayoutKind.Sequential)] + struct Tag { + public IntPtr title; + public IntPtr artist; + public IntPtr album; + public IntPtr performer; + public IntPtr year; + public IntPtr comment; + public int track; + public IntPtr genre; + public int tags_version; + public int set_original_tags; + }; + + public class Mp3SplitTrack + { + private IntPtr _points; + private SpltPoint _splitpoint; + private Tag _tag; + private int _index; + private string _splitname; + + public Mp3SplitTrack (IntPtr splitpoints,IntPtr tags,int index) { + _index=index; + _points=splitpoints; + _splitpoint=(SpltPoint) Marshal.PtrToStructure (_points+Marshal.SizeOf(_splitpoint)*index,typeof(SpltPoint)); + _tag=(Tag) Marshal.PtrToStructure(tags+Marshal.SizeOf (_tag)*index,typeof(Tag)); + _splitname=(string) Marshal.PtrToStringAnsi (_splitpoint.name); + } + + public string TrackName { + get { return _splitname; } + } + + public int TrackIndex { + get { return _index; } + } + + public double OffsetInSeconds { + get { return ((double) _splitpoint.val)/100.0; } + } + + public string Album { + get { return (string) Marshal.PtrToStringAnsi (_tag.album); } + } + + public string Title { + get { return (string) Marshal.PtrToStringAnsi (_tag.title); } + } + + public string Performer { + get { return (string) Marshal.PtrToStringAnsi (_tag.performer); } + } + + public string Artist { + get { return (string) Marshal.PtrToStringAnsi (_tag.artist); } + } + + public int TrackNumber { + get { return _tag.track; } + } + + public string Genre { + get { return (string) Marshal.PtrToStringAnsi (_tag.genre); } + } + + public override string ToString() { + return "nr="+TrackNumber+"album="+Album+",title="+Title+",performer="+Performer+", offset="+OffsetInSeconds+ + "name="+TrackName; + } + } +}
\ No newline at end of file diff --git a/src/CueSheets/CueSheets.csproj b/src/CueSheets/CueSheets.csproj index 207c57a..3c1cecf 100644 --- a/src/CueSheets/CueSheets.csproj +++ b/src/CueSheets/CueSheets.csproj @@ -109,6 +109,10 @@ <Compile Include="Banshee.CueSheets\Tools\Tools.cs" /> <Compile Include="Banshee.CueSheets\Data\CS_TrackInfoDb.cs" /> <Compile Include="Banshee.CueSheets\Version\CS_Info.cs" /> + <Compile Include="Banshee.CueSheets\mp3splt\Mp3Split.cs" /> + <Compile Include="Banshee.CueSheets\Gui\MusicToDevice.cs" /> + <Compile Include="Banshee.CueSheets\mp3splt\Mp3SplitTrack.cs" /> + <Compile Include="Banshee.CueSheets\Gui\Actions.cs" /> </ItemGroup> <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> <ProjectExtensions> @@ -133,5 +137,10 @@ <Folder Include="Banshee.CueSheets\Model\" /> <Folder Include="Banshee.CueSheets\Tools\" /> <Folder Include="Banshee.CueSheets\Version\" /> + <Folder Include="Banshee.CueSheets\mp3splt\" /> + <Folder Include="Resources\" /> + </ItemGroup> + <ItemGroup> + <None Include="Resources\GlobalUI.xml" /> </ItemGroup> </Project> diff --git a/src/CueSheets/Makefile.am b/src/CueSheets/Makefile.am index f62cecc..a23d478 100644 --- a/src/CueSheets/Makefile.am +++ b/src/CueSheets/Makefile.am @@ -10,18 +10,22 @@ SOURCES = \ Banshee.CueSheets/Data/CS_ComposerInfo.cs \ Banshee.CueSheets/Data/CS_TrackInfoDb.cs \ Banshee.CueSheets/Data/GenreInfo.cs \ + Banshee.CueSheets/Gui/Actions.cs \ Banshee.CueSheets/Gui/ComposerListView.cs \ Banshee.CueSheets/Gui/CueSheetEditor.cs \ Banshee.CueSheets/Gui/CueSheetsPrefs.cs \ Banshee.CueSheets/Gui/GenreListView.cs \ + Banshee.CueSheets/Gui/MusicToDevice.cs \ Banshee.CueSheets/Model/CS_AlbumModel.cs \ Banshee.CueSheets/Model/CS_ArtistModel.cs \ Banshee.CueSheets/Model/CS_ComposerModel.cs \ Banshee.CueSheets/Model/CS_GenreModel.cs \ + Banshee.CueSheets/mp3splt/Mp3Split.cs \ + Banshee.CueSheets/mp3splt/Mp3SplitTrack.cs \ Banshee.CueSheets/Tools/Loosely.cs \ Banshee.CueSheets/Tools/Tools.cs \ Banshee.CueSheets/Version/CS_Info.cs -RESOURCES = CueSheets.addin.xml +RESOURCES = CueSheets.addin.xml Resources/GlobalUI.xml include $(top_srcdir)/build/build.mk diff --git a/src/CueSheets/Resources/GlobalUI.xml b/src/CueSheets/Resources/GlobalUI.xml new file mode 100644 index 0000000..cc156a7 --- /dev/null +++ b/src/CueSheets/Resources/GlobalUI.xml @@ -0,0 +1,6 @@ +<ui> + <popup action="CueSheetsPopup"> + <menuitem action="Synchronize" /> + <menuitem name="SourcePreferences" action="SourcePreferencesAction"/> + </popup> +</ui> diff --git a/src/Telepathy/Banshee.Telepathy/Banshee.Telepathy.csproj b/src/Telepathy/Banshee.Telepathy/Banshee.Telepathy.csproj index 47b2fad..3e3e409 100644 --- a/src/Telepathy/Banshee.Telepathy/Banshee.Telepathy.csproj +++ b/src/Telepathy/Banshee.Telepathy/Banshee.Telepathy.csproj @@ -11,7 +11,6 @@ <ProjectGuid>{C6F7D7EA-0245-4A29-AC8E-714E1677F0FC}</ProjectGuid> <RootNamespace>Banshee.Telepathy</RootNamespace> <AssemblyOriginatorKeyFile>.</AssemblyOriginatorKeyFile> - <TargetFrameworkVersion>v2.0</TargetFrameworkVersion> </PropertyGroup> <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> <DebugSymbols>true</DebugSymbols> @@ -67,7 +66,9 @@ <Package>banshee-thickclient</Package> <SpecificVersion>False</SpecificVersion> </Reference> - <Reference Include="dbus-sharp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=5675b0c3093115b5" /> + <Reference Include="dbus-sharp, Version=1.0.0.0, Culture=neutral, PublicKeyToken=5675b0c3093115b5"> + <Package>dbus-sharp-1.0</Package> + </Reference> <Reference Include="Hyena.Data.Sqlite, Version=2.0.0.0, Culture=neutral"> <SpecificVersion>False</SpecificVersion> <Package>banshee-hyena-data-sqlite</Package> |