[banshee: 9/61] [InternetArchive] Lots of little improvements



commit c3a9ce1ebcb9b1389607b991b0c6e91a110f081c
Author: Gabriel Burt <gabriel burt gmail com>
Date:   Wed Oct 7 17:31:09 2009 -0700

    [InternetArchive] Lots of little improvements
    
    Exclude collection items in the search, tweak the default-visible
    columns, fix a crasher related to db transactions.

 .../Banshee.InternetArchive/HeaderFilters.cs       |   23 ++++-
 .../Banshee.InternetArchive/Source.cs              |  101 ++++++++++++--------
 .../InternetArchive/Collection.cs                  |   40 ++++++++
 .../InternetArchive/Item.cs                        |   17 ++--
 .../InternetArchive/MediaType.cs                   |   79 ++++++++--------
 .../InternetArchive/Search.cs                      |    6 +-
 src/Extensions/Banshee.InternetArchive/Makefile.am |    1 +
 7 files changed, 172 insertions(+), 95 deletions(-)
---
diff --git a/src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/HeaderFilters.cs b/src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/HeaderFilters.cs
index 4d217e5..5f566ec 100644
--- a/src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/HeaderFilters.cs
+++ b/src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/HeaderFilters.cs
@@ -92,7 +92,7 @@ namespace Banshee.InternetArchive
         private void BuildSearchEntry ()
         {
             var entry = search_entry = new Banshee.Widgets.SearchEntry () {
-                WidthRequest = 200,
+                WidthRequest = 150,
                 Visible = true,
                 EmptyMessage = String.Format (Catalog.GetString ("Optional Query"))
             };
@@ -108,6 +108,7 @@ namespace Banshee.InternetArchive
             combo.AppendText (Catalog.GetString ("Popular This Week"));
             combo.AppendText (Catalog.GetString ("Highly Rated"));
             combo.AppendText (Catalog.GetString ("Year"));
+            combo.AppendText (Catalog.GetString ("Recently Added"));
             combo.Active = 0;
 
             PackStart (new Label (Catalog.GetString ("Sort by:")), false, false, 0);
@@ -129,17 +130,31 @@ namespace Banshee.InternetArchive
         {
             source.Search.Sorts.Clear ();
 
-            string [] sorts = { "downloads desc", "week asc", "avg_rating desc", "year asc" };
+            string [] sorts = { "downloads desc", "week asc", "avg_rating desc", "year asc", "addeddate desc" };
             source.Search.Sorts.Add (new IA.Sort () { Id = sorts[sort_combo.Active] });
 
+            // And if the above sort value is the same for two items, sort by creator then by title
+            source.Search.Sorts.Add (new IA.Sort () { Id = "creatorSorter asc" });
+            source.Search.Sorts.Add (new IA.Sort () { Id = "titleSorter asc" });
+
             TreeIter iter;
             if (media_type_combo.GetActiveIter (out iter)) {
                 var media_type = media_type_store.GetValue (iter, 0) as IA.FieldValue;
-                source.Search.Query = media_type.ToString ();
+                string query = media_type.ToString ();
+
+                if (media_type is IA.Collection) {
+                    if ((media_type as IA.Collection).MediaType.Id == "music") {
+                        //query += " AND (format:mp3 OR format:ogg OR format:flac OR format:shorten)";
+                    }
+                }
+
+                query += " AND -mediatype:collection";//(format:mp3 OR format:ogg OR format:flac OR format:shorten)";
 
                 if (!String.IsNullOrEmpty (search_entry.Query)) {
-                    source.Search.Query += String.Format (" AND (title:\"{0}\" OR description:\"{0}\" OR creator:\"{0}\")", search_entry.Query);
+                    query += String.Format (" AND (title:\"{0}\" OR description:\"{0}\" OR creator:\"{0}\")", search_entry.Query);
                 }
+
+                source.Search.Query = query;
             }
         }
     }
diff --git a/src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/Source.cs b/src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/Source.cs
index 3af5278..17946cb 100644
--- a/src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/Source.cs
+++ b/src/Extensions/Banshee.InternetArchive/Banshee.InternetArchive/Source.cs
@@ -66,6 +66,9 @@ namespace Banshee.InternetArchive
 
         public Source () : base (name, name, "internet-archive", 210)
         {
+            IA.Search.UserAgent = Banshee.Web.Browser.UserAgent;
+            IA.Search.TimeoutMs = 12*1000;
+
             search = new IA.Search () {
                 Format = IA.ResultsFormat.Json
             };
@@ -77,30 +80,36 @@ namespace Banshee.InternetArchive
 
             Properties.SetString ("TrackView.ColumnControllerXml", String.Format (@"
                 <column-controller>
-                  <add-default column=""IndicatorColumn"" visible=""true"" />
-                  <add-default column=""TitleColumn"" visible=""true"" />
-                  <add-default column=""ArtistColumn"" visible=""true"" />
-                  <add-default column=""ComposerColumn"" visible=""true"" />
-                  <add-default column=""CommentColumn"" visible=""true"" />
+                  <add-default column=""TitleColumn"" />
+                  <add-default column=""ArtistColumn"" />
+                  <add-default column=""ComposerColumn"" />
+                  <add-default column=""CommentColumn"" />
                   <add-default column=""RatingColumn"" />
-                  <add-default column=""DurationColumn"" visible=""true"" />
-                  <add-default column=""GenreColumn"" />
                   <add-default column=""YearColumn"" />
-                  <add-default column=""FileSizeColumn"" visible=""true"" />
-                  <add-default column=""PlayCountColumn"" visible=""true"" />
-                  <add-default column=""MimeTypeColumn"" visible=""true"" />
+                  <add-default column=""PlayCountColumn"" />
+                  <add-default column=""MimeTypeColumn"" />
                   <add-default column=""LicenseUriColumn"" />
+                  <column modify-default=""TitleColumn"">
+                      <width>0.50</width>
+                  </column>
                   <column modify-default=""ArtistColumn"">
+                    <width>0.25</width>
                     <title>{0}</title><long-title>{0}</long-title>
                   </column>
                   <column modify-default=""PlayCountColumn"">
                     <title>{1}</title><long-title>{1}</long-title>
                   </column>
+                  <column modify-default=""RatingColumn""><visible>true</visible></column>
+                  <column modify-default=""YearColumn""><visible>true</visible></column>
+                  <column modify-default=""PlayCountColumn""><visible>true</visible></column>
+                  <column modify-default=""LicenseUriColumn""><visible>true</visible></column>
                   <column modify-default=""CommentColumn"">
                     <title>{2}</title><long-title>{2}</long-title>
+                    <visible>false</visible>
                   </column>
                   <column modify-default=""ComposerColumn"">
                     <title>{3}</title><long-title>{3}</long-title>
+                    <visible>false</visible>
                   </column>
                 </column-controller>",
                 Catalog.GetString ("Creator"), Catalog.GetString ("Downloads"),
@@ -139,41 +148,51 @@ namespace Banshee.InternetArchive
                 SetStatus (Catalog.GetString ("Searching the Internet Archive"), false, true, "gtk-find");
             });
 
+            IA.JsonResults results = null;
+
             try {
-                var results = new IA.JsonResults (search.GetResults ());
+                results = new IA.JsonResults (search.GetResults ());
                 total_results = results.TotalResults;
-
-                ServiceManager.DbConnection.BeginTransaction ();
-
-                ServiceManager.DbConnection.Execute ("DELETE FROM CoreTracks WHERE PrimarySourceID = ?", this.DbId);
-                DatabaseTrackModel.Clear ();
-
-                foreach (var item in results.Items) {
-                    var track = new DatabaseTrackInfo () {
-                        PrimarySource = this,
-                        ArtistName = item.GetJoined (IA.Field.Creator, ", ") ?? "",
-                        Comment    = Hyena.StringUtil.RemoveHtml (item.Get<string> (IA.Field.Description)),
-                        Composer   = item.GetJoined (IA.Field.Publisher, ", ") ?? "",
-                        LicenseUri = item.Get<string> (IA.Field.LicenseUrl),
-                        PlayCount  = (int) item.Get<double> (IA.Field.Downloads),
-                        Rating     = (int) Math.Round (item.Get<double> (IA.Field.AvgRating)),
-                        TrackTitle = item.Get<string> (IA.Field.Title),
-                        Uri        = new Banshee.Base.SafeUri (item.Url),
-                        MimeType   = item.GetJoined (IA.Field.Format, ", "),
-                        Year       = (int) item.Get<double> (IA.Field.Year)
-                    };
-
-                    if (track.Comment == "There is currently no description for this item.")
-                        track.Comment = null;
-
-                    track.Save (false);
-                }
-
-                ServiceManager.DbConnection.CommitTransaction ();
-                success = true;
             } catch (Exception e) {
-                ServiceManager.DbConnection.RollbackTransaction ();
                 Hyena.Log.Exception ("Error searching the Internet Archive", e);
+                results = null;
+            }
+
+            if (results != null) {
+                try {
+                    ServiceManager.DbConnection.BeginTransaction ();
+
+                    ServiceManager.DbConnection.Execute ("DELETE FROM CoreTracks WHERE PrimarySourceID = ?", this.DbId);
+                    DatabaseTrackModel.Clear ();
+
+                    foreach (var item in results.Items) {
+                        var track = new DatabaseTrackInfo () {
+                            PrimarySource = this,
+                            ArtistName = item.GetJoined (IA.Field.Creator, ", ") ?? "",
+                            Comment    = Hyena.StringUtil.RemoveHtml (item.Get<string> (IA.Field.Description)),
+                            Composer   = item.GetJoined (IA.Field.Publisher, ", ") ?? "",
+                            LicenseUri = item.Get<string> (IA.Field.LicenseUrl),
+                            PlayCount  = (int) item.Get<double> (IA.Field.Downloads),
+                            Rating     = (int) Math.Round (item.Get<double> (IA.Field.AvgRating)),
+                            TrackTitle = item.Get<string> (IA.Field.Title),
+                            Uri        = new Banshee.Base.SafeUri (item.WebpageUrl),
+                            MimeType   = item.GetJoined (IA.Field.Format, ", "),
+                            //MimeType   = item.GetJoined (IA.Field.MediaType, ", "),
+                            Year       = (int) item.Get<double> (IA.Field.Year)
+                        };
+
+                        if (track.Comment == "There is currently no description for this item.")
+                            track.Comment = null;
+
+                        track.Save (false);
+                    }
+
+                    ServiceManager.DbConnection.CommitTransaction ();
+                    success = true;
+                } catch (Exception e) {
+                    ServiceManager.DbConnection.RollbackTransaction ();
+                    Hyena.Log.Exception ("Error searching the Internet Archive", e);
+                }
             }
 
             if (success) {
diff --git a/src/Extensions/Banshee.InternetArchive/InternetArchive/Collection.cs b/src/Extensions/Banshee.InternetArchive/InternetArchive/Collection.cs
new file mode 100644
index 0000000..ddd8988
--- /dev/null
+++ b/src/Extensions/Banshee.InternetArchive/InternetArchive/Collection.cs
@@ -0,0 +1,40 @@
+//
+// Collection.cs
+//  
+// Author:
+//       Gabriel Burt <gabriel burt gmail com>
+// 
+// Copyright (c) 2009 Gabriel Burt
+// 
+// Permission is hereby granted, free of charge, to any person obtaining a copy
+// of this software and associated documentation files (the "Software"), to deal
+// in the Software without restriction, including without limitation the rights
+// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
+// copies of the Software, and to permit persons to whom the Software is
+// furnished to do so, subject to the following conditions:
+// 
+// The above copyright notice and this permission notice shall be included in
+// all copies or substantial portions of the Software.
+// 
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
+// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
+// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
+// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
+// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
+// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
+// THE SOFTWARE.
+
+using System;
+using System.Collections.Generic;
+
+using Mono.Unix;
+
+namespace InternetArchive
+{
+    public class Collection : FieldValue
+    {
+        public Collection (string id, string name) : base (Field.Collection, id, name) {}
+
+        public MediaType MediaType { get; internal set; }
+    }
+}
diff --git a/src/Extensions/Banshee.InternetArchive/InternetArchive/Item.cs b/src/Extensions/Banshee.InternetArchive/InternetArchive/Item.cs
index b8373db..8167b27 100644
--- a/src/Extensions/Banshee.InternetArchive/InternetArchive/Item.cs
+++ b/src/Extensions/Banshee.InternetArchive/InternetArchive/Item.cs
@@ -48,15 +48,16 @@ namespace InternetArchive
             return null;
         }
 
-        public string Url {
-            get {
-                string id = Get<string> (Field.Identifier);
-                if (id != null) {
-                    return String.Format ("http://www.archive.org/details/{0}";, id);
-                }
+        public string Id {
+            get { return Get<string> (Field.Identifier); }
+        }
 
-                return null;
-            }
+        public string JsonDetailsUrl {
+            get { return String.Format ("{0}&output=json", WebpageUrl); }
+        }
+
+        public string WebpageUrl {
+            get { return String.Format ("http://www.archive.org/details/{0}";, Id); }
         }
 
         public abstract T Get<T> (Field field);
diff --git a/src/Extensions/Banshee.InternetArchive/InternetArchive/MediaType.cs b/src/Extensions/Banshee.InternetArchive/InternetArchive/MediaType.cs
index bb66cbe..f82459c 100644
--- a/src/Extensions/Banshee.InternetArchive/InternetArchive/MediaType.cs
+++ b/src/Extensions/Banshee.InternetArchive/InternetArchive/MediaType.cs
@@ -33,67 +33,68 @@ namespace InternetArchive
 {
     public class MediaType : FieldValue
     {
-        private MediaType (string id, string name) : base (Field.MediaType, id, name) {}
+        public MediaType (string id, string name) : base (Field.MediaType, id, name) {}
 
-        private MediaType AddChildren (params FieldValue [] children)
+        public MediaType AddChildren (params Collection [] children)
         {
             if (Children == null) {
-                Children = new List<FieldValue> ();
+                Children = new List<Collection> ();
             }
 
             foreach (var child in children) {
                 Children.Add (child);
+                child.MediaType = this;
             }
 
             return this;
         }
 
-        public IList<FieldValue> Children { get; set; }
+        public IList<Collection> Children { get; set; }
 
         public static MediaType [] Options = new MediaType [] {
             new MediaType ("movies", Catalog.GetString ("Moving Images")).AddChildren (
-                new FieldValue (Field.Collection, "animationandcartoons", Catalog.GetString ("Animation & Cartoons")),
-                new FieldValue (Field.Collection, "artsandmusicvideos", Catalog.GetString ("Arts & Music")),
-                new FieldValue (Field.Collection, "computersandtechvideos", Catalog.GetString ("Computers & Technology")),
-                new FieldValue (Field.Collection, "culturalandacademicfilms", Catalog.GetString ("Cultural & Academic Films")),
-                new FieldValue (Field.Collection, "ephemera", Catalog.GetString ("Ephemeral Films")),
-                new FieldValue (Field.Collection, "home_movies", Catalog.GetString ("Home Movies")),
-                new FieldValue (Field.Collection, "moviesandfilms", Catalog.GetString ("Movies")),
-                new FieldValue (Field.Collection, "newsandpublicaffairs", Catalog.GetString ("News & Public Affairs")),
-                new FieldValue (Field.Collection, "opensource_movies", Catalog.GetString ("Open Source Movies")),
-                new FieldValue (Field.Collection, "prelinger", Catalog.GetString ("Prelinger Archives")),
-                new FieldValue (Field.Collection, "spiritualityandreligion", Catalog.GetString ("Spirituality & Religion")),
-                new FieldValue (Field.Collection, "sports", Catalog.GetString ("Sports Videos")),
-                new FieldValue (Field.Collection, "gamevideos", Catalog.GetString ("Videogame Videos")),
-                new FieldValue (Field.Collection, "vlogs", Catalog.GetString ("Vlogs")),
-                new FieldValue (Field.Collection, "youth_media", Catalog.GetString ("Youth Media"))
+                new Collection ("animationandcartoons", Catalog.GetString ("Animation & Cartoons")),
+                new Collection ("artsandmusicvideos", Catalog.GetString ("Arts & Music")),
+                new Collection ("computersandtechvideos", Catalog.GetString ("Computers & Technology")),
+                new Collection ("culturalandacademicfilms", Catalog.GetString ("Cultural & Academic Films")),
+                new Collection ("ephemera", Catalog.GetString ("Ephemeral Films")),
+                new Collection ("home_movies", Catalog.GetString ("Home Movies")),
+                new Collection ("moviesandfilms", Catalog.GetString ("Movies")),
+                new Collection ("newsandpublicaffairs", Catalog.GetString ("News & Public Affairs")),
+                new Collection ("opensource_movies", Catalog.GetString ("Open Source Movies")),
+                new Collection ("prelinger", Catalog.GetString ("Prelinger Archives")),
+                new Collection ("spiritualityandreligion", Catalog.GetString ("Spirituality & Religion")),
+                new Collection ("sports", Catalog.GetString ("Sports Videos")),
+                new Collection ("gamevideos", Catalog.GetString ("Videogame Videos")),
+                new Collection ("vlogs", Catalog.GetString ("Vlogs")),
+                new Collection ("youth_media", Catalog.GetString ("Youth Media"))
             ),
             new MediaType ("texts", Catalog.GetString ("Texts")).AddChildren (
-                new FieldValue (Field.Collection, "americana", Catalog.GetString ("American Libraries")),
-                new FieldValue (Field.Collection, "toronto", Catalog.GetString ("Canadian Libraries")),
-                new FieldValue (Field.Collection, "universallibrary", Catalog.GetString ("Universal Library")),
-                new FieldValue (Field.Collection, "gutenberg", Catalog.GetString ("Project Gutenberg")),
-                new FieldValue (Field.Collection, "iacl", Catalog.GetString ("Children's Library")),
-                new FieldValue (Field.Collection, "biodiversity", Catalog.GetString ("Biodiversity Heritage Library")),
-                new FieldValue (Field.Collection, "additional_collections", Catalog.GetString ("Additional Collections"))
+                new Collection ("americana", Catalog.GetString ("American Libraries")),
+                new Collection ("toronto", Catalog.GetString ("Canadian Libraries")),
+                new Collection ("universallibrary", Catalog.GetString ("Universal Library")),
+                new Collection ("gutenberg", Catalog.GetString ("Project Gutenberg")),
+                new Collection ("iacl", Catalog.GetString ("Children's Library")),
+                new Collection ("biodiversity", Catalog.GetString ("Biodiversity Heritage Library")),
+                new Collection ("additional_collections", Catalog.GetString ("Additional Collections"))
             ),
             new MediaType ("audio", Catalog.GetString ("Audio")).AddChildren (
-                new FieldValue (Field.Collection, "audio_bookspoetry", Catalog.GetString ("Audio Books & Poetry")),
-                new FieldValue (Field.Collection, "audio_tech", Catalog.GetString ("Computers & Technology")),
-                new FieldValue (Field.Collection, "GratefulDead", Catalog.GetString ("Grateful Dead")),
-                new FieldValue (Field.Collection, "etree", Catalog.GetString ("Live Music Archive")),
-                new FieldValue (Field.Collection, "audio_music", Catalog.GetString ("Music & Arts")),
-                new FieldValue (Field.Collection, "netlabels", Catalog.GetString ("Netlabels")),
-                new FieldValue (Field.Collection, "audio_news", Catalog.GetString ("News & Public Affairs")),
-                new FieldValue (Field.Collection, "audio_foreign", Catalog.GetString ("Non-English Audio")),
-                new FieldValue (Field.Collection, "opensource_audio", Catalog.GetString ("Open Source Audio")),
-                new FieldValue (Field.Collection, "audio_podcast", Catalog.GetString ("Podcasts")),
-                new FieldValue (Field.Collection, "radioprograms", Catalog.GetString ("Radio Programs")),
-                new FieldValue (Field.Collection, "audio_religion", Catalog.GetString ("Spirituality & Religion"))
+                new Collection ("audio_bookspoetry", Catalog.GetString ("Audio Books & Poetry")),
+                new Collection ("audio_tech", Catalog.GetString ("Computers & Technology")),
+                new Collection ("GratefulDead", Catalog.GetString ("Grateful Dead")),
+                new Collection ("etree", Catalog.GetString ("Live Music Archive")),
+                new Collection ("audio_music", Catalog.GetString ("Music & Arts")),
+                new Collection ("netlabels", Catalog.GetString ("Netlabels")),
+                new Collection ("audio_news", Catalog.GetString ("News & Public Affairs")),
+                new Collection ("audio_foreign", Catalog.GetString ("Non-English Audio")),
+                new Collection ("opensource_audio", Catalog.GetString ("Open Source Audio")),
+                new Collection ("audio_podcast", Catalog.GetString ("Podcasts")),
+                new Collection ("radioprograms", Catalog.GetString ("Radio Programs")),
+                new Collection ("audio_religion", Catalog.GetString ("Spirituality & Religion"))
             ),
             new MediaType ("education", Catalog.GetString ("Education")),
             new MediaType ("software", Catalog.GetString ("Software")).AddChildren (
-                new FieldValue (Field.Collection, "clasp", Catalog.GetString ("CLASP"))
+                new Collection ("clasp", Catalog.GetString ("CLASP"))
             )
         };
     }
diff --git a/src/Extensions/Banshee.InternetArchive/InternetArchive/Search.cs b/src/Extensions/Banshee.InternetArchive/InternetArchive/Search.cs
index c78ecb2..2f5f4d6 100644
--- a/src/Extensions/Banshee.InternetArchive/InternetArchive/Search.cs
+++ b/src/Extensions/Banshee.InternetArchive/InternetArchive/Search.cs
@@ -57,7 +57,6 @@ namespace InternetArchive
         List<Sort> sorts = new List<Sort> ();
         List<Field> result_fields = new List<Field> ();
         int NumResults;
-        //bool indent = false;
 
         public IList<Field>  ReturnFields { get { return result_fields; } }
         public IList<Sort>   Sorts { get { return sorts; } }
@@ -65,7 +64,7 @@ namespace InternetArchive
         public string Query { get; set; }
 
         static Search () {
-            //UserAgent = "InternetArchiveSharp";
+            UserAgent = "InternetArchiveSharp";
             TimeoutMs = 20000;
         }
 
@@ -83,6 +82,7 @@ namespace InternetArchive
                 Field.Identifier,
                 Field.Language,
                 Field.LicenseUrl,
+                Field.MediaType,
                 Field.NumReviews,
                 Field.Publisher,
                 Field.Title,
@@ -96,7 +96,7 @@ namespace InternetArchive
         {
             var sb = new System.Text.StringBuilder ();
 
-            sb.AppendFormat ("q={0}", System.Web.HttpUtility.UrlEncode (Query));//"(collection%3Aaudio+OR+mediatype%3Aaudio)+AND+-mediatype%3Acollection");
+            sb.AppendFormat ("q={0}", System.Web.HttpUtility.UrlEncode (Query));
 
             foreach (var field in result_fields) {
                 sb.AppendFormat ("&fl[]={0}", System.Web.HttpUtility.UrlEncode (field.Id));
diff --git a/src/Extensions/Banshee.InternetArchive/Makefile.am b/src/Extensions/Banshee.InternetArchive/Makefile.am
index 08b281d..64590df 100644
--- a/src/Extensions/Banshee.InternetArchive/Makefile.am
+++ b/src/Extensions/Banshee.InternetArchive/Makefile.am
@@ -4,6 +4,7 @@ LINK = $(REF_EXTENSION_INTERNETARCHIVE)
 INSTALL_DIR = $(EXTENSIONS_INSTALL_DIR)
 
 SOURCES = \
+	InternetArchive/Collection.cs \
 	InternetArchive/Field.cs \
 	InternetArchive/FieldValue.cs \
 	InternetArchive/MediaType.cs \



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]