diff options
author | Paul Mackin <paul.mackin@gmail.com> | 2013-02-04 21:49:08 +1100 |
---|---|---|
committer | Paul Mackin <paul.mackin@gmail.com> | 2013-02-04 21:49:08 +1100 |
commit | 91f6d4666d16d0a1c65e1eaafdb22da47eab1ee0 (patch) | |
tree | bda20733a8a1c44f2c816eba93045278f22c11cc | |
parent | c252761f16edb59c53ac82754f10554a3171d49c (diff) |
An extension for playing the tracks of your favourite artists off of SoundCloud.
19 files changed, 1558 insertions, 0 deletions
diff --git a/src/SoundCloud/Banshee.SoundCloud.dll b/src/SoundCloud/Banshee.SoundCloud.dll Binary files differnew file mode 100755 index 0000000..9ce34d3 --- /dev/null +++ b/src/SoundCloud/Banshee.SoundCloud.dll diff --git a/src/SoundCloud/Banshee.SoundCloud/ArtistAdder.cs b/src/SoundCloud/Banshee.SoundCloud/ArtistAdder.cs new file mode 100644 index 0000000..143dede --- /dev/null +++ b/src/SoundCloud/Banshee.SoundCloud/ArtistAdder.cs @@ -0,0 +1,204 @@ +/* + * ArtistAdder.cs + * + * + * Copyright 2012 Paul Mackin + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; +using Gtk; +using Mono.Unix; + +using Banshee.ServiceStack; +using Banshee.Collection.Database; + +using Hyena.Widgets; + +namespace Banshee.SoundCloud +{ + public class ArtistAdder : Gtk.Dialog + { + private Button save_button; + private Entry artist_entry; + private Alignment error_container; + private Label error; + //private DatabaseTrackInfo track; + + Table table; + + public ArtistAdder() : base() + { + string title = Catalog.GetString("Add new SoundCloud artist"); + + AccelGroup accel_group = new AccelGroup(); + AddAccelGroup(accel_group); + + Title = title; + SkipTaskbarHint = true; + Modal = true; + BorderWidth = 6; + HasSeparator = false; + DefaultResponse = ResponseType.Ok; + Modal = true; + + VBox.Spacing = 6; + + HBox split_box = new HBox(); + split_box.Spacing = 12; + split_box.BorderWidth = 6; + + /* TODO: + * Get this bloody image to display. + Image image = new Image("soundcloud"); + image.IconSize =(int)IconSize.Dialog; + image.IconName = "soundcloudd"; + image.Yalign = 0.0f; + image.Show(); + */ + + VBox main_box = new VBox(); + main_box.BorderWidth = 5; + main_box.Spacing = 10; + + Label header = new Label(); + header.Markup = String.Format("<big><b>{0}</b></big>", GLib.Markup.EscapeText(title)); + header.Xalign = 0.0f; + header.Show(); + + Label message = new Label(); + message.Text = Catalog.GetString("Enter the name of the artist you'd like to add."); + message.Xalign = 0.0f; + message.Wrap = true; + message.Show(); + + table = new Table(5, 2, false); + table.RowSpacing = 6; + table.ColumnSpacing = 6; + + artist_entry = AddEntryRow(Catalog.GetString("Artist Name:")); + + table.ShowAll(); + + main_box.PackStart(header, false, false, 0); + main_box.PackStart(message, false, false, 0); + main_box.PackStart(table, false, false, 0); + main_box.Show(); + + //split_box.PackStart(image, false, false, 0); + split_box.PackStart(main_box, true, true, 0); + split_box.Show(); + + VBox.PackStart(split_box, true, true, 0); + + Button cancel_button = new Button(Stock.Cancel); + cancel_button.CanDefault = false; + cancel_button.UseStock = true; + cancel_button.Show(); + AddActionWidget(cancel_button, ResponseType.Close); + + cancel_button.AddAccelerator("activate", accel_group,(uint)Gdk.Key.Escape, + 0, Gtk.AccelFlags.Visible); + + save_button = new Button(Stock.Save); + save_button.CanDefault = true; + save_button.UseStock = true; + save_button.Sensitive = false; + save_button.Show(); + AddActionWidget(save_button, ResponseType.Ok); + + save_button.AddAccelerator("activate", accel_group,(uint)Gdk.Key.Return, + 0, Gtk.AccelFlags.Visible); + + artist_entry.HasFocus = true; + + error_container = new Alignment(0.0f, 0.0f, 1.0f, 1.0f); + error_container.TopPadding = 6; + HBox error_box = new HBox(); + error_box.Spacing = 4; + + Image error_image = new Image(); + error_image.Stock = Stock.DialogError; + error_image.IconSize =(int)IconSize.Menu; + error_image.Show(); + + error = new Label(); + error.Xalign = 0.0f; + error.Show(); + + error_box.PackStart(error_image, false, false, 0); + error_box.PackStart(error, true, true, 0); + error_box.Show(); + + error_container.Add(error_box); + + table.Attach(error_container, 0, 2, 6, 7, AttachOptions.Expand | AttachOptions.Fill, AttachOptions.Shrink, 0, 0); + + artist_entry.Changed += OnFieldsChanged; + + OnFieldsChanged(this, EventArgs.Empty); + } + + private Entry AddEntryRow(string title) + { + Entry entry = new Entry(); + AddRow(title, entry); + return entry; + } + + private uint row = 0; + private void AddRow(string title, Widget entry) + { + Label label = new Label(title); + label.Xalign = 0.0f; + + table.Attach(label, 0, 1, row, row + 1, AttachOptions.Fill, AttachOptions.Fill | AttachOptions.Expand, 0, 0); + table.Attach(entry, 1, 2, row, row + 1, AttachOptions.Fill | AttachOptions.Expand, AttachOptions.Shrink, 0, 0); + row++; + } + + private void OnFieldsChanged(object o, EventArgs args) + { + // When the button becomes sensitive it can be executed. + save_button.Sensitive = artist_entry.Text.Trim().Length > 0; + } + + public void FocusUri() + { + artist_entry.HasFocus = true; + artist_entry.SelectRegion(0, artist_entry.Text.Length); + } + + /* may be redundant + public DatabaseTrackInfo Track { + get { return track; } + } + */ + + public string ArtistName { + get { return artist_entry.Text.Trim(); } + } + + public string ErrorMessage { + set { + if(value == null) { + error_container.Hide(); + } else { + error.Text = value; + error_container.Show(); + } + } + } + } +} diff --git a/src/SoundCloud/Banshee.SoundCloud/SC.cs b/src/SoundCloud/Banshee.SoundCloud/SC.cs new file mode 100644 index 0000000..5b1bd4b --- /dev/null +++ b/src/SoundCloud/Banshee.SoundCloud/SC.cs @@ -0,0 +1,34 @@ +/* + * SC.cs + * + * + * Copyright 2012 Paul Mackin + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; + +namespace Banshee.SoundCloud +{ + + public static class SC + { + public const string APPKEY = "0f449da910798915c0f951e013a07625"; // SoundCloud Client Key + public const string APPNAME = "SoundCloud"; + public const string STREAMKEY = "IrILK"; // Magic key for streaming. + + public static void log(string s) { Hyena.Log.Information("[SoundCloud] " + s); } + //public static void log(string s) { return; } // Logging toggle. + } +}
\ No newline at end of file diff --git a/src/SoundCloud/Banshee.SoundCloud/SoundCloudIO.cs b/src/SoundCloud/Banshee.SoundCloud/SoundCloudIO.cs new file mode 100644 index 0000000..0d45397 --- /dev/null +++ b/src/SoundCloud/Banshee.SoundCloud/SoundCloudIO.cs @@ -0,0 +1,131 @@ +/* + * SoundCloudIO.cs + * + * + * Copyright 2012 Paul Mackin + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using Banshee.Collection.Database; + +using Hyena; +using Hyena.Data; +using Hyena.Json; + +using System; +using System.Collections.Generic; +using System.IO; +using System.Net; + +namespace Banshee.SoundCloud +{ + public static class IO + { + public static JsonArray MakeRequest(string request, string data) + { + string url = ""; + + switch(request) + { + // Search in Tracks, People and Groups. + case "tracks": + url = "http://api.soundcloud.com/tracks.json?q=" + data + "&client_id=" + SC.APPKEY; + break; + case "people": + url = "http://api.soundcloud.com/users.json?q=" + data + "&client_id=" + SC.APPKEY; + break; + case "groups": + url = "http://api.soundcloud.com/groups.json?q=" + data + "&client_id=" + SC.APPKEY; + break; + // Retrieve a user's info, sets and tracks + case "getuser": + url = "http://api.soundcloud.com/users/" + data + ".json?client_id=" + SC.APPKEY; + break; + case "getsets": + url = "http://api.soundcloud.com/playlists/" + data + ".json?client_id=" + SC.APPKEY; + break; + case "getalltracks": + url = "http://api.soundcloud.com/users/" + data + "/tracks.json?client_id=" + SC.APPKEY; + break; + default: + throw new Exception("Invalid request"); + } + return ServerRequest(url); + } + + public static JsonArray MakeRequest(string request, int data) + { + return MakeRequest(request, data.ToString()); + } + + public static JsonArray ServerRequest(string requestUrl) + { + try + { + HttpWebRequest request = WebRequest.Create(requestUrl) as HttpWebRequest; + using(HttpWebResponse response = request.GetResponse() as HttpWebResponse) + { + if(response.StatusCode != HttpStatusCode.OK) { + string s = String.Format("Server error(HTTP {0}: {1}).", + response.StatusCode, response.StatusDescription); + throw new Exception(s); + } + + Stream receiveStream = response.GetResponseStream(); + Deserializer d = new Deserializer(receiveStream); + object jd = d.Deserialize(); + JsonArray ja = jd as JsonArray; + + response.Close(); + receiveStream.Close(); + return ja; + } + } + catch(Exception e) + { + SC.log(e.Message); + return null; + } + } + + public static DatabaseTrackInfo makeTrackInfo(JsonObject o) + { + JsonObject user = (JsonObject)o["user"]; + DatabaseTrackInfo track = new DatabaseTrackInfo(); + + track.Uri = new SafeUri(GetStreamURLFromTrack(o)); + track.TrackTitle = (string)o["title"]; + track.ArtistName = (string)user["username"]; + track.Comment =(string)o["description"]; + track.Genre =(string)o["genre"]; + track.Year = extractYear(o); + return track; + } + + public static int extractYear(JsonObject track) + { + string y = (string)track["created_at"]; + return Convert.ToInt32(y.Substring(0, 4)); + } + + public static string GetStreamURLFromTrack(JsonObject track) + { + string waveform_url =(string)track["waveform_url"]; + string url_id = waveform_url.Substring(21); // chop off leading URL + int end = url_id.IndexOf('_'); + url_id = url_id.Remove(end); + return String.Format("http://media.soundcloud.com/stream/{0}?stream_token={1}", url_id, SC.STREAMKEY); + } + } +} diff --git a/src/SoundCloud/Banshee.SoundCloud/SoundCloudSource.cs b/src/SoundCloud/Banshee.SoundCloud/SoundCloudSource.cs new file mode 100644 index 0000000..4e4caa2 --- /dev/null +++ b/src/SoundCloud/Banshee.SoundCloud/SoundCloudSource.cs @@ -0,0 +1,331 @@ +/* + * SoundCloudSource.cs + * + * + * Copyright 2012 Paul Mackin + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; +using System.Collections.Generic; +using Mono.Unix; +using Gtk; + +using Hyena; +using Hyena.Json; + +using Banshee.Base; +using Banshee.Collection; +using Banshee.Collection.Database; +using Banshee.Configuration; +using Banshee.Gui; +using Banshee.PlaybackController; +using Banshee.ServiceStack; +using Banshee.Sources; +using Banshee.Sources.Gui; +using Banshee.Streaming; + +using Banshee.SoundCloud; + +namespace Banshee.SoundCloud +{ + public class SoundCloudSource : PrimarySource, IDisposable, IBasicPlaybackController + { + private uint ui_id; + const int sort_order = 190; + + public SoundCloudSource() : base(Catalog.GetString("SoundCloud"), + Catalog.GetString("SoundCloud"), "soundcloud", 52) + { + Properties.SetString("Icon.Name", "soundcloud"); + TypeUniqueId = "soundcloud"; + IsLocal = false; + + AfterInitialized(); + + // Have OnAddArtist() respond to an 'Add' being performed in the GTK window. + InterfaceActionService uia_service = ServiceManager.Get<InterfaceActionService>(); + uia_service.GlobalActions.Add( + new ActionEntry("AddSoundCloudArtistAction", Stock.Add, + Catalog.GetString("Add SoundCloud Artist"), null, + Catalog.GetString("Add a SoundCloud artist or playlist"), + OnAddArtist) + ); + uia_service.GlobalActions["AddSoundCloudArtistAction"].IsImportant = false; + + ui_id = uia_service.UIManager.AddUiFromResource("GlobalUI.xml"); + + Properties.SetString("ActiveSourceUIResource", "ActiveSourceUI.xml"); + Properties.Set<bool>("ActiveSourceUIResourcePropagate", true); + Properties.Set<System.Reflection.Assembly>("ActiveSourceUIResource.Assembly", + typeof(SoundCloudSource).Assembly); + + Properties.SetString("GtkActionPath", "/SoundCloudContextMenu"); + Properties.Set<bool>("Nereid.SourceContentsPropagate", false); + + Properties.Set<ISourceContents>("Nereid.SourceContents", + new LazyLoadSourceContents<SoundCloudSourceContents>()); + + Properties.Set<string>("SearchEntryDescription", Catalog.GetString("Search your SoundCloud artists")); + + Properties.SetString("TrackView.ColumnControllerXml", String.Format(@" + <column-controller> + <!--<column modify-default=""IndicatorColumn""> + <renderer type=""Banshee.Podcasting.Gui.ColumnCellPodcastStatusIndicator"" /> + </column>--> + <add-default column=""IndicatorColumn"" /> + <add-default column=""GenreColumn"" /> + <column modify-default=""GenreColumn""> + <visible>false</visible> + </column> + <add-default column=""TitleColumn"" /> + <column modify-default=""TitleColumn""> + <title>{0}</title> + <long-title>{0}</long-title> + </column> + <add-default column=""ArtistColumn"" /> + <column modify-default=""ArtistColumn""> + <title>{1}</title> + <long-title>{1}</long-title> + </column> + <add-default column=""CommentColumn"" /> + <column modify-default=""CommentColumn""> + <title>{2}</title> + <long-title>{2}</long-title> + </column> + <add-default column=""YearColumn"" /> + <column modify-default=""YearColumn""> + <title>{3}</title> + <long-title>{3}</long-title> + </column> + <add-default column=""RatingColumn"" /> + <add-default column=""PlayCountColumn"" /> + <add-default column=""LastPlayedColumn"" /> + <add-default column=""LastSkippedColumn"" /> + <add-default column=""DateAddedColumn"" /> + <add-default column=""UriColumn"" /> + <sort-column direction=""asc"">artist</sort-column> + </column-controller>", + Catalog.GetString("Track"), + Catalog.GetString("Artist"), + Catalog.GetString("Description"), + Catalog.GetString("Year") + )); + + ServiceManager.PlayerEngine.TrackIntercept += OnPlayerEngineTrackIntercept; + + TrackEqualHandler = delegate(DatabaseTrackInfo a, TrackInfo b) { + RadioTrackInfo r = b as RadioTrackInfo; + return r != null && DatabaseTrackInfo.TrackEqual( + r.ParentTrack as DatabaseTrackInfo, a); + + }; + + /** + * TODO: + * Figure out how to tell Banshee where to find the track artwork. See below. + * + TrackArtworkIdHandler = delegate(DatabaseTrackInfo a) { + return; + }; + */ + SC.log("Initialized"); + } + /* + * This may be the place to tell Banshee about artwork re: MetadataService + * + *private void OnTrackInfoUpdated (Banshee.MediaEngine.PlayerEventArgs args) + { + RadioTrackInfo radio_track = ServiceManager.PlaybackController.CurrentTrack as RadioTrackInfo; + if (radio_track != null) { + Banshee.Metadata.MetadataService.Instance.Lookup (radio_track); + } + }*/ + + public override int Count { get { return 0; } } + + public override string GetPluralItemCountString(int count) + { + return Catalog.GetPluralString("{0} artist", "{0} artists", count); + } + + /* + * TODO: + * Filter by Artist instead of by Genre. How do I do this? + */ + protected override IEnumerable<IFilterListModel> CreateFiltersFor(DatabaseSource src) + { + DatabaseArtistListModel artist_model = new DatabaseArtistListModel(src, src.DatabaseTrackModel, ServiceManager.DbConnection, src.UniqueId); + //DatabaseQueryFilterModel<string> genre_model = new DatabaseQueryFilterModel<string>(src, src.DatabaseTrackModel, ServiceManager.DbConnection, + // Catalog.GetString("All Genre({0})"), src.UniqueId, Banshee.Query.BansheeQuery.GenreField , "Genre"); + + if(this == src) { + //this.genre_model = genre_model; + this.artist_model = artist_model; + } + yield return artist_model; + //yield return genre_model; + } + + public override void Dispose() + { + base.Dispose(); + + //ServiceManager.PlayerEngine.DisconnectEvent(OnTrackInfoUpdated); + + InterfaceActionService uia_service = ServiceManager.Get<InterfaceActionService>(); + if(uia_service == null) { + return; + } + + if(ui_id > 0) { + uia_service.UIManager.RemoveUi(ui_id); + uia_service.GlobalActions.Remove("AddSoundCloudArtistAction"); + ui_id = 0; + } + + ServiceManager.PlayerEngine.TrackIntercept -= OnPlayerEngineTrackIntercept; + } + + private bool OnPlayerEngineTrackIntercept(TrackInfo track) + { + DatabaseTrackInfo t = track as DatabaseTrackInfo; + if(t == null || t.PrimarySource != this) { + return false; + } + + new RadioTrackInfo(t).Play(); + + return true; + } + + private void OnAddArtist(object o, EventArgs args) + { + ArtistAdder editor = new ArtistAdder(); + // Add OnArtistAdditionResponse to the list of event handlers + // for the artist adder. + editor.Response += OnArtistAdditionResponse; + editor.Show(); + } + + private void OnArtistAdditionResponse(object o, ResponseArgs args) + { + ArtistAdder editor =(ArtistAdder)o; + bool destroy = true; + + try { + if(args.ResponseId == ResponseType.Ok) { + if(String.IsNullOrEmpty(editor.ArtistName)) { + destroy = false; + editor.ErrorMessage = Catalog.GetString("Please provide a artist name"); + } else { + JsonArray results = IO.MakeRequest("people", editor.ArtistName); + + foreach(JsonObject artist in results) { + string artist_name = (string)artist["username"]; + if (artist_name == editor.ArtistName) { + //SC.log(artist.ToString()); + JsonArray tracks = IO.MakeRequest("getalltracks", + (int)artist["id"]); + //SC.log(tracks.ToString()); + SC.log(String.Format("Artist: {0}, Track Count: {1}", + artist_name, tracks.Count)); + + foreach(JsonObject t in tracks) { + DatabaseTrackInfo track = IO.makeTrackInfo(t); + track.PrimarySource = this; + track.IsLive = true; + track.Save(); + SC.log(" added track: " + track.TrackTitle); + } + } + } + // If all is well, set the window to close. + destroy = true; + } + } + } finally { + if(destroy) { + // Remove response-handler reference. + editor.Response -= OnArtistAdditionResponse; + editor.Destroy(); + } + } + } + + #region IBasicPlaybackController implementation + + public bool First() + { + return false; + } + + public bool Next(bool restart, bool changeImmediately) + { + if(!changeImmediately) { + ServiceManager.PlayerEngine.SetNextTrack((SafeUri)null); + if(ServiceManager.PlayerEngine.IsPlaying()) { + return true; + } + } + RadioTrackInfo radio_track = ServiceManager.PlaybackController.CurrentTrack as RadioTrackInfo; + if(radio_track != null && radio_track.PlayNextStream()) { + return true; + } else { + return false; + } + } + + public bool Previous(bool restart) + { + RadioTrackInfo radio_track = ServiceManager.PlaybackController.CurrentTrack as RadioTrackInfo; + if(radio_track != null && radio_track.PlayPreviousStream()) { + return true; + } else { + return false; + } + } + + #endregion + + public override bool AcceptsInputFromSource(Source source) + { + return false; + } + + public override bool CanDeleteTracks { + get { return false; } + } + + public override bool ShowBrowser { + get { return true; } + } + + public override bool CanRename { + get { return false; } + } + + protected override bool HasArtistAlbum { + get { return true; } + } + + public override bool HasViewableTrackProperties { + get { return true; } + } + + public override bool HasEditableTrackProperties { + get { return false; } + } + } +} diff --git a/src/SoundCloud/Banshee.SoundCloud/SoundCloudSourceContents.cs b/src/SoundCloud/Banshee.SoundCloud/SoundCloudSourceContents.cs new file mode 100644 index 0000000..6ea49bc --- /dev/null +++ b/src/SoundCloud/Banshee.SoundCloud/SoundCloudSourceContents.cs @@ -0,0 +1,111 @@ +/* + * SoundCloudSourceContents.cs + * + * + * Copyright 2012 Paul Mackin + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +using System; +using Mono.Unix; + +using Gtk; + +using Hyena.Data; +using Hyena.Data.Gui; + +using Banshee.Base; +using Banshee.Configuration; + +using Banshee.Sources; +using Banshee.Sources.Gui; +using Banshee.ServiceStack; + +using Banshee.Collection; +using Banshee.Collection.Database; +using Banshee.Collection.Gui; + +namespace Banshee.SoundCloud +{ + public class SoundCloudSourceContents : FilteredListSourceContents, ITrackModelSourceContents + { + private TrackListView track_view; + private QueryFilterView<string> artist_view; + + public SoundCloudSourceContents() : base("soundcloud") + { + } + + protected override void InitializeViews() + { + SetupMainView(track_view = new TrackListView()); + SetupFilterView(artist_view = new QueryFilterView<string>(Catalog.GetString("Artist"))); + } + + protected override void ClearFilterSelections() + { + if(artist_view.Model != null) { + artist_view.Selection.Clear(); + } + } + + protected override bool ActiveSourceCanHasBrowser { + get { return true; } + } + + protected override string ForcePosition { + get { return "left"; } + } + + #region Implement ISourceContents + + public override bool SetSource(ISource source) + { + DatabaseSource track_source = source as DatabaseSource; + if(track_source == null) { + return false; + } + + base.source = source; + + SetModel(track_view, track_source.TrackModel); + + foreach(IListModel model in track_source.CurrentFilters) { + IListModel<QueryFilterInfo<string>> artist_model = model as IListModel<QueryFilterInfo<string>>; + if(artist_model != null) { + SetModel(artist_view, artist_model); + } + } + + return true; + } + + public override void ResetSource() + { + base.source = null; + track_view.SetModel(null); + artist_view.SetModel(null); + } + + #endregion + + #region ITrackModelSourceContents implementation + + public IListView<TrackInfo> TrackView { + get { return track_view; } + } + + #endregion + } +} diff --git a/src/SoundCloud/Makefile.am b/src/SoundCloud/Makefile.am new file mode 100644 index 0000000..7b458e2 --- /dev/null +++ b/src/SoundCloud/Makefile.am @@ -0,0 +1,18 @@ +ASSEMBLY = Banshee.SoundCloud +LINK = $(BANSHEE_LIBS) + +SOURCES = \ + Banshee.SoundCloud/ArtistAdder.cs \ + Banshee.SoundCloud/SC.cs \ + Banshee.SoundCloud/SoundCloudIO.cs \ + Banshee.SoundCloud/SoundCloudSource.cs \ + Banshee.SoundCloud/SoundCloudSourceContents.cs + +RESOURCES = \ + Resources/ActiveSourceUI.xml \ + Resources/GlobalUI.xml \ + SoundCloud.addin.xml \ + ThemeIcons/16x16/categories/soundcloud.png \ + ThemeIcons/scalable/soundcloudd.svg + +include $(top_srcdir)/build/build.mk diff --git a/src/SoundCloud/README.md b/src/SoundCloud/README.md new file mode 100644 index 0000000..ff273d2 --- /dev/null +++ b/src/SoundCloud/README.md @@ -0,0 +1,7 @@ +banshee-soundcloud-extension +============================ + +Play tracks from SoundCloud in the Banshee media player + +Usage: when entering the artist name it must match exactly what appears on the artist's profile page. + e.g. 'Bredren [BRN]' over at http://soundcloud.com/bredrendnb diff --git a/src/SoundCloud/Resources/ActiveSourceUI.xml b/src/SoundCloud/Resources/ActiveSourceUI.xml new file mode 100644 index 0000000..3bd99fd --- /dev/null +++ b/src/SoundCloud/Resources/ActiveSourceUI.xml @@ -0,0 +1,15 @@ +<ui> + <menubar name="MainMenu" action="MainMenuAction"> + <menu name="MediaMenu" action="MediaMenuAction"> + <placeholder name="BelowOpenLocation"> + <menuitem action="AddSoundCloudArtistAction" /> + </placeholder> + </menu> + </menubar> + + <toolbar name="HeaderToolbar"> + <placeholder name="SourceActions"> + <toolitem action="AddSoundCloudArtistAction" /> + </placeholder> + </toolbar> +</ui> diff --git a/src/SoundCloud/Resources/GlobalUI.xml b/src/SoundCloud/Resources/GlobalUI.xml new file mode 100644 index 0000000..640f374 --- /dev/null +++ b/src/SoundCloud/Resources/GlobalUI.xml @@ -0,0 +1,9 @@ +<ui> + <popup name="SoundCloudContextMenu"> + <menuitem action="AddSoundCloudArtistAction"></menuitem> + <separator/> + <menuitem name="NewPlaylist" action="NewPlaylistAction"/> + <menuitem name="NewSmartPlaylist" action="NewSmartPlaylistAction"/> + <menu name="SortChildren" action="SortChildrenAction" /> + </popup> +</ui> diff --git a/src/SoundCloud/SoundCloud.addin.xml b/src/SoundCloud/SoundCloud.addin.xml new file mode 100644 index 0000000..8b65ca9 --- /dev/null +++ b/src/SoundCloud/SoundCloud.addin.xml @@ -0,0 +1,78 @@ +<?xml version="1.0" encoding="utf-8"?> +<Addin + id="Banshee.SoundCloud" + version="1.0" + compatVersion="1.0" + copyright="Copyright © 2012 Paul Mackin. Licensed under the Apache license." + name="SoundCloud" + category="Community Extensions" + description="Play songs from SoundCloud" + author="Paul Mackin" + url="http://banshee-project.org/" + defaultEnabled="false"> + + <Localizer type="Gettext" catalog="banshee-community-extensions" location="../../../share/locale"/> + + <Dependencies> + <Addin id="Banshee.Services" version="1.0"/> + <Addin id="Banshee.ThickClient" version="1.0"/> + </Dependencies> + + <!-- Extensions are loaded by Banshee via Mono.Addins by extending a + particular ExtensionPoint. + + There is a very general ExtensionPoint called + /Banshee/ServiceManager/Service, and there are several much more + specific ones. A Service extension will be instantiated when Banshee + starts, and can do whatever it wants with the Banshee API. Where an + ImportSource extension will be loaded when the user opens the Import + Dialog. + + Here is an example of how to define an extension point: + + <Extension path="ExtensionPointPath"> + <ExtensionPointType class="Banshee.SoundCloud.SoundCloudExtensionPointType"/> + </Extension> + + An extension must have one or more such definitions. + + Here are the ExtensionPoints in Banshee: + + Path: /Banshee/ServiceManager/Service + Type: Service + Desc: General purpose, run any code, instantiated at startup + + Path: /Banshee/SourceManager/Source + Type: Source + Desc: Create a Source in the source list + + Path: /Banshee/Library/ImportSource + Type: ImportSource + Desc: Add an entry to the Import Dialog dropdown. + + Path: /Banshee/Gui/TrackEditor/NotebookPage + Type: TrackEditorPage + Desc: Add a tab("page") to the Edit Track Information or Properties + dialogs. + + Path: /Banshee/Gui/TrackEditor/Modifier + Type: Modifier + Desc: Defines an extension for the track editor that can modify it in + some way. + + Path: /Banshee/ThickClient/ContextPane + Type: ContextPage + Desc: Defines a new GTK+ context page, for showing contextual + information beneath the main track source view. + + There are quite a few other ExtensionPoints, but they are mostly related to + providing platform-specific backends for hardware integration and the like. + --> + + <!-- Define a Source extension. This will instantiate a new Source object, + listed in the left-most Source TreeView. --> + <Extension path="/Banshee/SourceManager/Source"> + <Source class="Banshee.SoundCloud.SoundCloudSource"/> + </Extension> + +</Addin> diff --git a/src/SoundCloud/SoundCloud.csproj b/src/SoundCloud/SoundCloud.csproj new file mode 100644 index 0000000..33be2ff --- /dev/null +++ b/src/SoundCloud/SoundCloud.csproj @@ -0,0 +1,107 @@ +<?xml version="1.0" encoding="utf-8"?> +<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="3.5"> + <PropertyGroup> + <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration> + <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform> + <ProductVersion>8.0.50727</ProductVersion> + <ProjectGuid>{9B6CC053-4C1A-49BF-B816-F639DAD42920}</ProjectGuid> + <OutputType>Library</OutputType> + <UseParentDirectoryAsNamespace>true</UseParentDirectoryAsNamespace> + <AssemblyName>Banshee.SoundCloud</AssemblyName> + <SchemaVersion>2.0</SchemaVersion> + <TargetFrameworkVersion>v3.5</TargetFrameworkVersion> + <Optimize>true</Optimize> + <ErrorReport>prompt</ErrorReport> + <WarningLevel>4</WarningLevel> + <CheckForOverflowUnderflow>true</CheckForOverflowUnderflow> + <RootNamespace>Foo</RootNamespace> + <AssemblyOriginatorKeyFile>.</AssemblyOriginatorKeyFile> + </PropertyGroup> + <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Debug|AnyCPU' "> + <DebugSymbols>true</DebugSymbols> + <DebugType>full</DebugType> + <OutputPath>..\..\..\bin</OutputPath> + <CustomCommands> + <CustomCommands> + <Command type="Execute" command="make run" workingdir="${SolutionDir}" /> + </CustomCommands> + </CustomCommands> + <Optimize>false</Optimize> + </PropertyGroup> + <PropertyGroup Condition=" '$(Configuration)|$(Platform)' == 'Windows|AnyCPU' "> + <DebugSymbols>true</DebugSymbols> + <DebugType>full</DebugType> + <OutputPath>..\..\..\bin</OutputPath> + <PlatformTarget>x86</PlatformTarget> + <Optimize>false</Optimize> + </PropertyGroup> + <ItemGroup> + <Reference Include="System" /> + <Reference Include="gtk-sharp, Version=2.12.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f"> + <Package>gtk-sharp-2.0</Package> + </Reference> + <Reference Include="Mono.Posix" /> + <Reference Include="gdk-sharp, Version=2.12.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f"> + <Package>gtk-sharp-2.0</Package> + </Reference> + <Reference Include="Mono.Cairo" /> + <Reference Include="Mono.Addins"> + <Package>mono-addins</Package> + </Reference> + <Reference Include="Banshee.Core, Version=1.7.0.0, Culture=neutral"> + <Package>banshee-core</Package> + </Reference> + <Reference Include="Banshee.Services, Version=1.7.0.0, Culture=neutral"> + <Package>banshee-services</Package> + </Reference> + <Reference Include="Banshee.ThickClient, Version=1.7.0.0, Culture=neutral"> + <Package>banshee-thickclient</Package> + </Reference> + <Reference Include="Banshee.Widgets, Version=1.7.0.0, Culture=neutral"> + <Package>banshee-thickclient</Package> + </Reference> + <Reference Include="Hyena, Version=1.7.0.0, Culture=neutral"> + <Package>banshee-hyena</Package> + </Reference> + <Reference Include="Hyena.Data.Sqlite, Version=1.7.0.0, Culture=neutral"> + <Package>banshee-hyena-data-sqlite</Package> + </Reference> + <Reference Include="Hyena.Gui, Version=1.7.0.0, Culture=neutral"> + <Package>banshee-hyena-gui</Package> + </Reference> + <Reference Include="System.Core" /> + </ItemGroup> + <Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" /> + <ProjectExtensions> + <MonoDevelop> + <Properties> + <MonoDevelop.Autotools.MakefileInfo IntegrationEnabled="true" RelativeMakefileName="Makefile.am"> + <BuildFilesVar Sync="true" Name="SOURCES" /> + <DeployFilesVar /> + <ResourcesVar Sync="true" Name="RESOURCES" /> + <OthersVar /> + <GacRefVar /> + <AsmRefVar /> + <ProjectRefVar /> + </MonoDevelop.Autotools.MakefileInfo> + </Properties> + </MonoDevelop> + </ProjectExtensions> + <ItemGroup> + <Folder Include="Banshee.SoundCloud\" /> + </ItemGroup> + <ItemGroup> + <Compile Include="Banshee.SoundCloud\ArtistAdder.cs" /> + <Compile Include="Banshee.SoundCloud\SoundCloudSource.cs" /> + <Compile Include="Banshee.SoundCloud\SoundCloudSourceContents.cs" /> + <Compile Include="Banshee.SoundCloud\SoundCloudIO.cs" /> + <Compile Include="Banshee.SoundCloud\SC.cs" /> + </ItemGroup> + <ItemGroup> + <EmbeddedResource Include="SoundCloud.addin.xml" /> + <EmbeddedResource Include="Resources\ActiveSourceUI.xml" /> + <EmbeddedResource Include="Resources\GlobalUI.xml" /> + <EmbeddedResource Include="ThemeIcons\16x16\categories\soundcloud.png" /> + <EmbeddedResource Include="ThemeIcons\scalable\soundcloudd.svg" /> + </ItemGroup> +</Project> diff --git a/src/SoundCloud/SoundCloud.sln b/src/SoundCloud/SoundCloud.sln new file mode 100644 index 0000000..d5048da --- /dev/null +++ b/src/SoundCloud/SoundCloud.sln @@ -0,0 +1,24 @@ +
+Microsoft Visual Studio Solution File, Format Version 10.00
+# Visual Studio 2008
+Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "SoundCloud", "SoundCloud.csproj", "{9B6CC053-4C1A-49BF-B816-F639DAD42920}"
+EndProject
+Global
+ GlobalSection(SolutionConfigurationPlatforms) = preSolution
+ Debug|Any CPU = Debug|Any CPU
+ Windows|Any CPU = Windows|Any CPU
+ EndGlobalSection
+ GlobalSection(ProjectConfigurationPlatforms) = postSolution
+ {9B6CC053-4C1A-49BF-B816-F639DAD42920}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
+ {9B6CC053-4C1A-49BF-B816-F639DAD42920}.Debug|Any CPU.Build.0 = Debug|Any CPU
+ {9B6CC053-4C1A-49BF-B816-F639DAD42920}.Windows|Any CPU.ActiveCfg = Windows|Any CPU
+ {9B6CC053-4C1A-49BF-B816-F639DAD42920}.Windows|Any CPU.Build.0 = Windows|Any CPU
+ EndGlobalSection
+ GlobalSection(MonoDevelopProperties) = preSolution
+ StartupItem = SoundCloud.csproj
+ Policies = $0
+ $0.DotNetNamingPolicy = $1
+ $1.DirectoryNamespaceAssociation = None
+ $1.ResourceNamePolicy = FileFormatDefault
+ EndGlobalSection
+EndGlobal
diff --git a/src/SoundCloud/TODO b/src/SoundCloud/TODO new file mode 100644 index 0000000..cd96611 --- /dev/null +++ b/src/SoundCloud/TODO @@ -0,0 +1,9 @@ +* Sort personal soundcloud library by artist + +* Search soundcloud from main interface + +* Login with soundcloud username/password and import artists from 'following' list + +* Scan user library and offer suggestions based on user's tastes. + + diff --git a/src/SoundCloud/ThemeIcons/16x16/categories/soundcloud.png b/src/SoundCloud/ThemeIcons/16x16/categories/soundcloud.png Binary files differnew file mode 100644 index 0000000..bdad9ae --- /dev/null +++ b/src/SoundCloud/ThemeIcons/16x16/categories/soundcloud.png diff --git a/src/SoundCloud/ThemeIcons/22x22/categories/soundcloud.png b/src/SoundCloud/ThemeIcons/22x22/categories/soundcloud.png Binary files differnew file mode 100644 index 0000000..800c3d3 --- /dev/null +++ b/src/SoundCloud/ThemeIcons/22x22/categories/soundcloud.png diff --git a/src/SoundCloud/ThemeIcons/32x32/categories/soundcloud.png b/src/SoundCloud/ThemeIcons/32x32/categories/soundcloud.png Binary files differnew file mode 100644 index 0000000..5a0ac5b --- /dev/null +++ b/src/SoundCloud/ThemeIcons/32x32/categories/soundcloud.png diff --git a/src/SoundCloud/ThemeIcons/48x48/categories/soundcloud.png b/src/SoundCloud/ThemeIcons/48x48/categories/soundcloud.png Binary files differnew file mode 100644 index 0000000..4009adf --- /dev/null +++ b/src/SoundCloud/ThemeIcons/48x48/categories/soundcloud.png diff --git a/src/SoundCloud/ThemeIcons/scalable/soundcloudd.svg b/src/SoundCloud/ThemeIcons/scalable/soundcloudd.svg new file mode 100644 index 0000000..509972f --- /dev/null +++ b/src/SoundCloud/ThemeIcons/scalable/soundcloudd.svg @@ -0,0 +1,480 @@ +<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 13.0.2, SVG Export Plug-In . SVG Version: 6.00 Build 14948) -->
+<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd" [
+ <!ENTITY ns_extend "http://ns.adobe.com/Extensibility/1.0/">
+ <!ENTITY ns_ai "http://ns.adobe.com/AdobeIllustrator/10.0/">
+ <!ENTITY ns_graphs "http://ns.adobe.com/Graphs/1.0/">
+ <!ENTITY ns_vars "http://ns.adobe.com/Variables/1.0/">
+ <!ENTITY ns_imrep "http://ns.adobe.com/ImageReplacement/1.0/">
+ <!ENTITY ns_sfw "http://ns.adobe.com/SaveForWeb/1.0/">
+ <!ENTITY ns_custom "http://ns.adobe.com/GenericCustomNamespace/1.0/">
+ <!ENTITY ns_adobe_xpath "http://ns.adobe.com/XPath/1.0/">
+]>
+<svg version="1.1" id="Calque_1" xmlns:x="&ns_extend;" xmlns:i="&ns_ai;" xmlns:graph="&ns_graphs;"
+ xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="92.985px"
+ height="53.006px" viewBox="0 0 92.985 53.006" enable-background="new 0 0 92.985 53.006" xml:space="preserve">
+<metadata><?xpacket begin="" id="W5M0MpCehiHzreSzNTczkc9d"?> +<x:xmpmeta xmlns:x="adobe:ns:meta/" x:xmptk="Adobe XMP Core 4.1-c036 46.277092, Fri Feb 23 2007 14:16:18 "> + <rdf:RDF xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"> + <rdf:Description rdf:about="" + xmlns:dc="http://purl.org/dc/elements/1.1/"> + <dc:format>image/svg+xml</dc:format> + </rdf:Description> + <rdf:Description rdf:about="" + xmlns:xap="http://ns.adobe.com/xap/1.0/" + xmlns:xapGImg="http://ns.adobe.com/xap/1.0/g/img/"> + <xap:CreatorTool>Adobe Illustrator CS3</xap:CreatorTool> + <xap:CreateDate>2010-05-19T09:37:41+10:00</xap:CreateDate> + <xap:ModifyDate>2010-05-19T09:37:41+10:00</xap:ModifyDate> + <xap:MetadataDate>2010-05-19T09:37:41+10:00</xap:MetadataDate> + <xap:Thumbnails> + <rdf:Alt> + <rdf:li rdf:parseType="Resource"> + <xapGImg:width>256</xapGImg:width> + <xapGImg:height>148</xapGImg:height> + <xapGImg:format>JPEG</xapGImg:format> + <xapGImg:image>/9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA
AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK
DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f
Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgAlAEAAwER
AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA
AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB
UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE
1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ
qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy
obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp
0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo
+DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9U4q7FXYq7FXYq7FXYq7
FXYq7FXYq7FXYq7FXYqsmnggjMk0ixRjq7kKPvORnMRFk0ExiSaCC1jWbbTNKk1Fh60SBeAQj4ix
AWh6U365j6rVxw4jk5htw4Dknw8nnWo/mJr90WEDJZxHoIwC1Pdmr+FM5LP27nn9NQHl+t3mPs3H
Hn6kiuNX1O5Nbi7ml/15Gb9ZzWZNTkn9UpH4uXHDCPIAIXllDZSrDe3UBrBM8R8UYr+o5ZDJKP0k
hjKAPMWnNj558x2ZAF0bhB+xOPUr/sj8f45sMPbGox/xcQ89/wBv2uNk0GKXSvcy3R/zJ025Kxaj
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
zdfvuKvs/UyrMx1rsVf/2Q==</xapGImg:image> + </rdf:li> + </rdf:Alt> + </xap:Thumbnails> + </rdf:Description> + <rdf:Description rdf:about="" + xmlns:xapMM="http://ns.adobe.com/xap/1.0/mm/" + xmlns:stRef="http://ns.adobe.com/xap/1.0/sType/ResourceRef#"> + <xapMM:DocumentID>uuid:971E3EA93164DF118E6D90B556E55533</xapMM:DocumentID> + <xapMM:InstanceID>uuid:981E3EA93164DF118E6D90B556E55533</xapMM:InstanceID> + <xapMM:DerivedFrom rdf:parseType="Resource"> + <stRef:instanceID>uuid:5D6A817A07F311DDB65DBE16EC1FED5E</stRef:instanceID> + <stRef:documentID>uuid:5D6A817907F311DDB65DBE16EC1FED5E</stRef:documentID> + </xapMM:DerivedFrom> + </rdf:Description> + <rdf:Description rdf:about="" + xmlns:xapTPg="http://ns.adobe.com/xap/1.0/t/pg/" + xmlns:stDim="http://ns.adobe.com/xap/1.0/sType/Dimensions#" + xmlns:xapG="http://ns.adobe.com/xap/1.0/g/"> + <xapTPg:MaxPageSize rdf:parseType="Resource"> + <stDim:w>35.277778</stDim:w> + <stDim:h>21.166667</stDim:h> + <stDim:unit>Millimeters</stDim:unit> + </xapTPg:MaxPageSize> + <xapTPg:NPages>1</xapTPg:NPages> + <xapTPg:HasVisibleTransparency>False</xapTPg:HasVisibleTransparency> + <xapTPg:HasVisibleOverprint>False</xapTPg:HasVisibleOverprint> + <xapTPg:SwatchGroups> + <rdf:Seq> + <rdf:li rdf:parseType="Resource"> + <xapG:groupName>Default Swatch Group</xapG:groupName> + <xapG:groupType>0</xapG:groupType> + <xapG:Colorants> + <rdf:Seq> + <rdf:li rdf:parseType="Resource"> + <xapG:swatchName>Blanc</xapG:swatchName> + <xapG:mode>RGB</xapG:mode> + <xapG:type>PROCESS</xapG:type> + <xapG:red>255</xapG:red> + <xapG:green>255</xapG:green> + <xapG:blue>255</xapG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xapG:swatchName>Noir</xapG:swatchName> + <xapG:mode>RGB</xapG:mode> + <xapG:type>PROCESS</xapG:type> + <xapG:red>0</xapG:red> + <xapG:green>0</xapG:green> + <xapG:blue>0</xapG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xapG:swatchName>Fusain</xapG:swatchName> + <xapG:mode>RGB</xapG:mode> + <xapG:type>PROCESS</xapG:type> + <xapG:red>63</xapG:red> + <xapG:green>63</xapG:green> + <xapG:blue>63</xapG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xapG:swatchName>Graphite</xapG:swatchName> + <xapG:mode>RGB</xapG:mode> + <xapG:type>PROCESS</xapG:type> + <xapG:red>102</xapG:red> + <xapG:green>102</xapG:green> + <xapG:blue>102</xapG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xapG:swatchName>Cendre</xapG:swatchName> + <xapG:mode>RGB</xapG:mode> + <xapG:type>PROCESS</xapG:type> + <xapG:red>140</xapG:red> + <xapG:green>140</xapG:green> + <xapG:blue>140</xapG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xapG:swatchName>Fumée</xapG:swatchName> + <xapG:mode>RGB</xapG:mode> + <xapG:type>PROCESS</xapG:type> + <xapG:red>179</xapG:red> + <xapG:green>179</xapG:green> + <xapG:blue>179</xapG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xapG:swatchName>Latte</xapG:swatchName> + <xapG:mode>RGB</xapG:mode> + <xapG:type>PROCESS</xapG:type> + <xapG:red>228</xapG:red> + <xapG:green>189</xapG:green> + <xapG:blue>149</xapG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xapG:swatchName>Capuccino</xapG:swatchName> + <xapG:mode>RGB</xapG:mode> + <xapG:type>PROCESS</xapG:type> + <xapG:red>213</xapG:red> + <xapG:green>150</xapG:green> + <xapG:blue>88</xapG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xapG:swatchName>Mochaccino</xapG:swatchName> + <xapG:mode>RGB</xapG:mode> + <xapG:type>PROCESS</xapG:type> + <xapG:red>138</xapG:red> + <xapG:green>91</xapG:green> + <xapG:blue>41</xapG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xapG:swatchName>Moka</xapG:swatchName> + <xapG:mode>RGB</xapG:mode> + <xapG:type>PROCESS</xapG:type> + <xapG:red>90</xapG:red> + <xapG:green>61</xapG:green> + <xapG:blue>27</xapG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xapG:swatchName>Rouge Mars</xapG:swatchName> + <xapG:mode>RGB</xapG:mode> + <xapG:type>PROCESS</xapG:type> + <xapG:red>143</xapG:red> + <xapG:green>0</xapG:green> + <xapG:blue>0</xapG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xapG:swatchName>Rubis</xapG:swatchName> + <xapG:mode>RGB</xapG:mode> + <xapG:type>PROCESS</xapG:type> + <xapG:red>191</xapG:red> + <xapG:green>0</xapG:green> + <xapG:blue>0</xapG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xapG:swatchName>Rouge</xapG:swatchName> + <xapG:mode>RGB</xapG:mode> + <xapG:type>PROCESS</xapG:type> + <xapG:red>255</xapG:red> + <xapG:green>0</xapG:green> + <xapG:blue>0</xapG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xapG:swatchName>Citrouille</xapG:swatchName> + <xapG:mode>RGB</xapG:mode> + <xapG:type>PROCESS</xapG:type> + <xapG:red>255</xapG:red> + <xapG:green>65</xapG:green> + <xapG:blue>0</xapG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xapG:swatchName>Jus</xapG:swatchName> + <xapG:mode>RGB</xapG:mode> + <xapG:type>PROCESS</xapG:type> + <xapG:red>255</xapG:red> + <xapG:green>127</xapG:green> + <xapG:blue>0</xapG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xapG:swatchName>Soleil</xapG:swatchName> + <xapG:mode>RGB</xapG:mode> + <xapG:type>PROCESS</xapG:type> + <xapG:red>255</xapG:red> + <xapG:green>191</xapG:green> + <xapG:blue>0</xapG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xapG:swatchName>Jaune pur</xapG:swatchName> + <xapG:mode>RGB</xapG:mode> + <xapG:type>PROCESS</xapG:type> + <xapG:red>255</xapG:red> + <xapG:green>255</xapG:green> + <xapG:blue>0</xapG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xapG:swatchName>Olivine</xapG:swatchName> + <xapG:mode>RGB</xapG:mode> + <xapG:type>PROCESS</xapG:type> + <xapG:red>191</xapG:red> + <xapG:green>225</xapG:green> + <xapG:blue>14</xapG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xapG:swatchName>Vert choux</xapG:swatchName> + <xapG:mode>RGB</xapG:mode> + <xapG:type>PROCESS</xapG:type> + <xapG:red>127</xapG:red> + <xapG:green>195</xapG:green> + <xapG:blue>27</xapG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xapG:swatchName>Jade</xapG:swatchName> + <xapG:mode>RGB</xapG:mode> + <xapG:type>PROCESS</xapG:type> + <xapG:red>95</xapG:red> + <xapG:green>146</xapG:green> + <xapG:blue>21</xapG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xapG:swatchName>Menthe à l’eau</xapG:swatchName> + <xapG:mode>RGB</xapG:mode> + <xapG:type>PROCESS</xapG:type> + <xapG:red>48</xapG:red> + <xapG:green>124</xapG:green> + <xapG:blue>31</xapG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xapG:swatchName>Emeraude</xapG:swatchName> + <xapG:mode>RGB</xapG:mode> + <xapG:type>PROCESS</xapG:type> + <xapG:red>0</xapG:red> + <xapG:green>76</xapG:green> + <xapG:blue>31</xapG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xapG:swatchName>Bleu-vert</xapG:swatchName> + <xapG:mode>RGB</xapG:mode> + <xapG:type>PROCESS</xapG:type> + <xapG:red>1</xapG:red> + <xapG:green>83</xapG:green> + <xapG:blue>82</xapG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xapG:swatchName>Bleu des mers du Sud</xapG:swatchName> + <xapG:mode>RGB</xapG:mode> + <xapG:type>PROCESS</xapG:type> + <xapG:red>4</xapG:red> + <xapG:green>115</xapG:green> + <xapG:blue>144</xapG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xapG:swatchName>Cyan pur</xapG:swatchName> + <xapG:mode>RGB</xapG:mode> + <xapG:type>PROCESS</xapG:type> + <xapG:red>0</xapG:red> + <xapG:green>160</xapG:green> + <xapG:blue>198</xapG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xapG:swatchName>Bleu hawaiien</xapG:swatchName> + <xapG:mode>RGB</xapG:mode> + <xapG:type>PROCESS</xapG:type> + <xapG:red>6</xapG:red> + <xapG:green>120</xapG:green> + <xapG:blue>179</xapG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xapG:swatchName>Bleu crépuscule</xapG:swatchName> + <xapG:mode>RGB</xapG:mode> + <xapG:type>PROCESS</xapG:type> + <xapG:red>10</xapG:red> + <xapG:green>80</xapG:green> + <xapG:blue>161</xapG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xapG:swatchName>Bleu nuit étoilée</xapG:swatchName> + <xapG:mode>RGB</xapG:mode> + <xapG:type>PROCESS</xapG:type> + <xapG:red>15</xapG:red> + <xapG:green>41</xapG:green> + <xapG:blue>143</xapG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xapG:swatchName>Bleu fonds marins</xapG:swatchName> + <xapG:mode>RGB</xapG:mode> + <xapG:type>PROCESS</xapG:type> + <xapG:red>19</xapG:red> + <xapG:green>0</xapG:green> + <xapG:blue>124</xapG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xapG:swatchName>Lavande fraîche</xapG:swatchName> + <xapG:mode>RGB</xapG:mode> + <xapG:type>PROCESS</xapG:type> + <xapG:red>72</xapG:red> + <xapG:green>48</xapG:green> + <xapG:blue>147</xapG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xapG:swatchName>Violet</xapG:swatchName> + <xapG:mode>RGB</xapG:mode> + <xapG:type>PROCESS</xapG:type> + <xapG:red>75</xapG:red> + <xapG:green>0</xapG:green> + <xapG:blue>125</xapG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xapG:swatchName>Améthyste</xapG:swatchName> + <xapG:mode>RGB</xapG:mode> + <xapG:type>PROCESS</xapG:type> + <xapG:red>129</xapG:red> + <xapG:green>1</xapG:green> + <xapG:blue>125</xapG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xapG:swatchName>Framboise</xapG:swatchName> + <xapG:mode>RGB</xapG:mode> + <xapG:type>PROCESS</xapG:type> + <xapG:red>184</xapG:red> + <xapG:green>2</xapG:green> + <xapG:blue>126</xapG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xapG:swatchName>Magenta pur</xapG:swatchName> + <xapG:mode>RGB</xapG:mode> + <xapG:type>PROCESS</xapG:type> + <xapG:red>240</xapG:red> + <xapG:green>3</xapG:green> + <xapG:blue>127</xapG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xapG:swatchName>Rouge global</xapG:swatchName> + <xapG:type>PROCESS</xapG:type> + <xapG:tint>100.000000</xapG:tint> + <xapG:mode>RGB</xapG:mode> + <xapG:red>255</xapG:red> + <xapG:green>0</xapG:green> + <xapG:blue>0</xapG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xapG:swatchName>Jus global</xapG:swatchName> + <xapG:type>PROCESS</xapG:type> + <xapG:tint>100.000000</xapG:tint> + <xapG:mode>RGB</xapG:mode> + <xapG:red>255</xapG:red> + <xapG:green>126</xapG:green> + <xapG:blue>0</xapG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xapG:swatchName>Jaune pur global</xapG:swatchName> + <xapG:type>PROCESS</xapG:type> + <xapG:tint>100.000000</xapG:tint> + <xapG:mode>RGB</xapG:mode> + <xapG:red>255</xapG:red> + <xapG:green>255</xapG:green> + <xapG:blue>0</xapG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xapG:swatchName>Vert global</xapG:swatchName> + <xapG:type>PROCESS</xapG:type> + <xapG:tint>100.000000</xapG:tint> + <xapG:mode>RGB</xapG:mode> + <xapG:red>51</xapG:red> + <xapG:green>160</xapG:green> + <xapG:blue>43</xapG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xapG:swatchName>Cyan pur global</xapG:swatchName> + <xapG:type>PROCESS</xapG:type> + <xapG:tint>100.000000</xapG:tint> + <xapG:mode>RGB</xapG:mode> + <xapG:red>0</xapG:red> + <xapG:green>160</xapG:green> + <xapG:blue>198</xapG:blue> + </rdf:li> + <rdf:li rdf:parseType="Resource"> + <xapG:swatchName>Bleu fonds marins global</xapG:swatchName> + <xapG:type>PROCESS</xapG:type> + <xapG:tint>100.000000</xapG:tint> + <xapG:mode>RGB</xapG:mode> + <xapG:red>19</xapG:red> + <xapG:green>0</xapG:green> + <xapG:blue>123</xapG:blue> + </rdf:li> + </rdf:Seq> + </xapG:Colorants> + </rdf:li> + </rdf:Seq> + </xapTPg:SwatchGroups> + </rdf:Description> + </rdf:RDF> +</x:xmpmeta> + + + + + + + + + + + + + + + + + + + + + +<?xpacket end="w"?>
+ </metadata>
+<linearGradient id="SVGID_1_" gradientUnits="userSpaceOnUse" x1="46.4927" y1="0" x2="46.4927" y2="53.0063">
+ <stop offset="0" style="stop-color:#F79810"/>
+ <stop offset="1" style="stop-color:#F8310E"/>
+</linearGradient>
+<path fill="url(#SVGID_1_)" d="M1.053,24.152c-0.194,0-0.348,0.15-0.373,0.364L0,29.681l0.68,5.076
+ c0.025,0.214,0.179,0.363,0.373,0.363c0.188,0,0.341-0.148,0.371-0.361l0,0v-0.001c0,0,0,0,0,0.001l0.806-5.078l-0.806-5.166
+ C1.395,24.302,1.24,24.152,1.053,24.152z M4.877,21.33c-0.032-0.222-0.191-0.375-0.387-0.375c-0.197,0-0.36,0.158-0.387,0.375
+ c0,0.002-0.914,8.351-0.914,8.351l0.914,8.166c0.026,0.219,0.189,0.377,0.387,0.377c0.195,0,0.354-0.154,0.386-0.375l1.04-8.168
+ L4.877,21.33z M19.281,13.627c-0.375,0-0.685,0.307-0.703,0.697l-0.728,15.364l0.728,9.929c0.019,0.388,0.328,0.694,0.703,0.694
+ c0.373,0,0.682-0.307,0.704-0.696v0.003l0.823-9.93l-0.823-15.364C19.963,13.934,19.654,13.627,19.281,13.627z M11.826,18.967
+ c-0.288,0-0.523,0.23-0.546,0.537l-0.82,10.18l0.82,9.849c0.022,0.305,0.258,0.535,0.546,0.535c0.285,0,0.52-0.23,0.545-0.535
+ l0.932-9.849l-0.932-10.182C12.346,19.197,12.111,18.967,11.826,18.967z M26.857,40.31c0.465,0,0.843-0.375,0.862-0.855l0.714-9.762
+ L27.72,9.238c-0.019-0.48-0.397-0.855-0.862-0.855c-0.469,0-0.848,0.376-0.863,0.856c0,0.001-0.633,20.453-0.633,20.453l0.633,9.766
+ C26.01,39.934,26.389,40.31,26.857,40.31z M42.367,40.356c0.64,0,1.168-0.527,1.18-1.175v0.007v-0.007l0.498-9.482L43.547,6.075
+ c-0.011-0.647-0.54-1.175-1.18-1.175c-0.641,0-1.17,0.527-1.18,1.176l-0.445,23.615c0,0.015,0.445,9.496,0.445,9.496
+ C41.197,39.829,41.727,40.356,42.367,40.356z M34.553,40.319c0.557,0,1.006-0.447,1.021-1.017v0.007l0.606-9.614L35.573,9.092
+ c-0.015-0.57-0.464-1.016-1.021-1.016c-0.561,0-1.01,0.446-1.022,1.016l-0.539,20.604l0.54,9.612
+ C33.543,39.872,33.992,40.319,34.553,40.319z M15.539,40.229c0.331,0,0.599-0.265,0.624-0.614l0.878-9.931l-0.878-9.447
+ c-0.024-0.349-0.292-0.612-0.624-0.612c-0.336,0-0.604,0.265-0.625,0.616l-0.773,9.443l0.773,9.93
+ C14.936,39.964,15.203,40.229,15.539,40.229z M8.143,39.685c0.242,0,0.438-0.191,0.466-0.455l0.986-9.548l-0.985-9.908
+ c-0.029-0.265-0.225-0.456-0.467-0.456c-0.245,0-0.441,0.192-0.466,0.456c0,0.001-0.868,9.908-0.868,9.908l0.868,9.546
+ C7.701,39.493,7.897,39.685,8.143,39.685z M38.445,8.749c-0.605,0-1.09,0.481-1.102,1.097l-0.492,19.851l0.492,9.552
+ c0.012,0.608,0.496,1.089,1.102,1.089c0.604,0,1.086-0.48,1.1-1.096v0.008l0.552-9.552L39.545,9.844
+ C39.531,9.23,39.049,8.749,38.445,8.749z M23.055,40.33c0.418,0,0.763-0.341,0.783-0.776l0.768-9.863l-0.768-18.878
+ c-0.021-0.436-0.365-0.776-0.783-0.776c-0.422,0-0.766,0.341-0.784,0.776c0,0.001-0.68,18.878-0.68,18.878l0.681,9.867
+ C22.289,39.989,22.633,40.33,23.055,40.33z M31.631,39.399v-0.005l0.66-9.7l-0.66-21.144c-0.016-0.525-0.43-0.937-0.941-0.937
+ c-0.514,0-0.928,0.411-0.942,0.937l-0.586,21.143l0.587,9.705c0.014,0.52,0.428,0.931,0.941,0.931c0.512,0,0.924-0.411,0.941-0.934
+ V39.399z M81.549,17.506c-1.567,0-3.062,0.317-4.424,0.888C76.215,8.086,67.571,0,57.027,0c-2.58,0-5.095,0.508-7.316,1.367
+ c-0.863,0.334-1.093,0.678-1.101,1.345v36.3c0.009,0.7,0.552,1.283,1.235,1.352c0.029,0.003,31.499,0.019,31.703,0.019
+ c6.316,0,11.437-5.121,11.437-11.438S87.865,17.506,81.549,17.506z M46.272,2.68c-0.687,0-1.251,0.564-1.261,1.257l-0.516,25.765
+ l0.517,9.351c0.009,0.683,0.573,1.246,1.26,1.246c0.685,0,1.249-0.563,1.259-1.256v0.011l0.561-9.352L47.531,3.935
+ C47.521,3.244,46.957,2.68,46.272,2.68z M9.236,47.654c-1.353-0.318-1.719-0.488-1.719-1.024c0-0.378,0.305-0.769,1.219-0.769
+ c0.781,0,1.391,0.317,1.939,0.878l1.231-1.194c-0.805-0.841-1.78-1.341-3.108-1.341c-1.684,0-3.049,0.951-3.049,2.5
+ c0,1.682,1.098,2.182,2.67,2.547c1.609,0.365,1.902,0.61,1.902,1.159c0,0.646-0.477,0.927-1.487,0.927
+ c-0.817,0-1.585-0.28-2.183-0.977L5.42,51.458c0.646,0.951,1.891,1.548,3.316,1.548c2.33,0,3.354-1.097,3.354-2.718
+ C12.09,48.434,10.59,47.971,9.236,47.654z M17.09,44.204c-2.328,0-3.705,1.804-3.705,4.401s1.377,4.4,3.705,4.4
+ s3.707-1.803,3.707-4.4S19.418,44.204,17.09,44.204z M17.09,51.312c-1.377,0-1.951-1.183-1.951-2.706
+ c0-1.524,0.574-2.707,1.951-2.707c1.379,0,1.951,1.183,1.951,2.707C19.041,50.129,18.469,51.312,17.09,51.312z M27.686,49.13
+ c0,1.365-0.672,2.207-1.756,2.207c-1.085,0-1.743-0.866-1.743-2.231v-4.769h-1.708v4.793c0,2.486,1.391,3.876,3.451,3.876
+ c2.17,0,3.463-1.427,3.463-3.9v-4.769h-1.707V49.13z M36.756,47.947c0,0.476,0.024,1.548,0.024,1.865
+ c-0.11-0.22-0.39-0.646-0.597-0.964l-3.025-4.512h-1.633v8.536h1.683v-3.756c0-0.476-0.024-1.548-0.024-1.865
+ c0.109,0.219,0.391,0.646,0.597,0.964l3.134,4.657h1.524v-8.536h-1.683V47.947z M43.303,44.337h-2.67v8.536h2.547
+ c2.195,0,4.366-1.269,4.366-4.268C47.546,45.483,45.741,44.337,43.303,44.337z M43.18,51.215h-0.84v-5.219h0.902
+ c1.805,0,2.549,0.865,2.549,2.609C45.791,50.166,44.973,51.215,43.18,51.215z M52.825,45.898c0.768,0,1.256,0.342,1.561,0.927
+ l1.585-0.731c-0.537-1.109-1.513-1.89-3.122-1.89c-2.229,0-3.791,1.804-3.791,4.401c0,2.694,1.499,4.4,3.73,4.4
+ c1.549,0,2.573-0.719,3.158-1.926l-1.438-0.854c-0.451,0.757-0.903,1.086-1.671,1.086c-1.28,0-2.024-1.171-2.024-2.706
+ C50.812,47.021,51.546,45.898,52.825,45.898z M59.156,44.337h-1.707v8.536h5.13v-1.684h-3.423V44.337z M67.076,44.204
+ c-2.33,0-3.707,1.804-3.707,4.401s1.377,4.4,3.707,4.4c2.328,0,3.706-1.803,3.706-4.4S69.404,44.204,67.076,44.204z M67.076,51.312
+ c-1.379,0-1.951-1.183-1.951-2.706c0-1.524,0.572-2.707,1.951-2.707c1.376,0,1.949,1.183,1.949,2.707
+ C69.025,50.129,68.452,51.312,67.076,51.312z M77.67,49.13c0,1.365-0.669,2.207-1.754,2.207c-1.087,0-1.744-0.866-1.744-2.231
+ v-4.769h-1.707v4.793c0,2.486,1.39,3.876,3.451,3.876c2.17,0,3.462-1.427,3.462-3.9v-4.769H77.67V49.13z M84.181,44.337h-2.669
+ v8.536h2.547c2.196,0,4.365-1.269,4.365-4.268C88.424,45.483,86.62,44.337,84.181,44.337z M84.059,51.215h-0.841v-5.219h0.903
+ c1.803,0,2.547,0.865,2.547,2.609C86.668,50.166,85.851,51.215,84.059,51.215z"/>
+</svg>
|