Re: [Rhythmbox-devel] Automatic Playlist UI work
- From: Jonathan Matthew <jonathan kaolin hn org>
- To: rhythmbox-devel gnome org
- Subject: Re: [Rhythmbox-devel] Automatic Playlist UI work
- Date: Thu, 28 Apr 2005 09:25:49 +1000
On Tue, Apr 26, 2005 at 11:04:53PM +1000, James Livingston wrote:
> G'day everyone,
>
> I've got some more autoplaylist goodness for you all, hot off the press:
> support for Recently Added & Recently Played criteria.
>
> Recently Played isn't very much use at the moment, because the playlist
> will only update when Rhythmbox re-runs the query - which from my
> experience (in the last 10 minutes) is when you quit and restart the RB.
>
> One word of warning: if you have a playlist that uses either of these
> two criteria, and try to open an older version that doesn't support them
> _IT WILL CRASH_ as older versions don't understand my new
> "current-time-within" operator.
Does anyone think it's worth handling this a bit better? Maybe show
the playlist as broken or disabled, and somehow manage to write the
query out to the playlist file untouched?
> I think I've pretty much got everything apart from polish done on the
> playlist criteria - so if you see anything like bugs, typos, defaults
> that could have better values, etc. let me know. Also if there are
> criteria that aren't there though you think should be (or ones that are
> there that shouldn't be) let me know too.
The attached patch fixes a bug where you'd get an assertion failure if
you had text in the search box and you selected an artist/album/genre
from the browser. The resulting query has 3 components (song type,
search text, artist/album/genre), but rhythmbox_query_magic_transform
was only handling queries with 2 components.
thanks,
-jonathan
--- orig/rhythmdb/rhythmdb.c
+++ mod/rhythmdb/rhythmdb.c
@@ -2975,59 +2975,60 @@
rhythmdb_query_magic_transform(GPtrArray *query)
{
int i;
+ int q;
RhythmDBQueryData *qdata;
GPtrArray *subquery;
GTimeVal current_time;
+ gulong relative_time;
+ gulong absolute_time;
/* make sure it is a valid query to transform */
- if (query == NULL || query->len == 1)
+ if (query == NULL || query->len == 0)
return;
- qdata = g_ptr_array_index (query, 1);
- if (qdata->type != RHYTHMDB_QUERY_SUBQUERY)
- return;
-
- g_assert (query->len == 2);
-
- subquery = qdata->subquery;
-
/*
* Determine things that will be needed to convert the operators,
* such as the current time
*/
g_get_current_time (¤t_time);
-
- for (i = 0; i < subquery->len; i++) {
- RhythmDBQueryData *data = g_ptr_array_index (subquery, i);
- switch (data->type) {
- /*
- * Convert the current-time relative operators into ones that
- * the backend(s) understand
- */
- case RHYTHMDB_QUERY_PROP_CURRENT_TIME_WITHIN:
- {
- gulong relative_time = g_value_get_ulong (data->val);
- gulong absolute_time = current_time.tv_sec - relative_time;
-
- rb_debug("Converting current-time-within operator. Rel %d(%s), Abs %d", relative_time, G_VALUE_TYPE_NAME (data->val), absolute_time);
+ /* process all subqueries */
+ for (q = 0; q < query->len; q++) {
+ qdata = g_ptr_array_index (query, q);
+ if (qdata->type != RHYTHMDB_QUERY_SUBQUERY)
+ continue;
+
+ subquery = qdata->subquery;
+
+ for (i = 0; i < subquery->len; i++) {
+ RhythmDBQueryData *data = g_ptr_array_index (subquery, i);
+
+
+ switch (data->type) {
+ /*
+ * Convert the current-time relative operators into ones that
+ * the backend(s) understand
+ */
+ case RHYTHMDB_QUERY_PROP_CURRENT_TIME_WITHIN:
+ relative_time = g_value_get_ulong (data->val);
+ absolute_time = current_time.tv_sec - relative_time;
+ rb_debug("Converting current-time-within operator. Rel %d(%s), Abs %d",
+ relative_time, G_VALUE_TYPE_NAME (data->val), absolute_time);
g_value_set_ulong(data->val, absolute_time);
data->type = RHYTHMDB_QUERY_PROP_GREATER_EQUALS;
- }
- break;
-
- case RHYTHMDB_QUERY_PROP_CURRENT_TIME_NOT_WITHIN:
- {
- gulong relative_time = g_value_get_ulong (data->val);
- gulong absolute_time = current_time.tv_sec - relative_time;
-
- rb_debug("Converting current-time-not-within operator. Rel %d, Abs %d", relative_time, absolute_time);
+ break;
+
+ case RHYTHMDB_QUERY_PROP_CURRENT_TIME_NOT_WITHIN:
+ relative_time = g_value_get_ulong (data->val);
+ absolute_time = current_time.tv_sec - relative_time;
+ rb_debug("Converting current-time-not-within operator. Rel %d, Abs %d",
+ relative_time, absolute_time);
g_value_set_ulong(data->val, absolute_time);
data->type = RHYTHMDB_QUERY_PROP_LESS;
+ break;
}
- break;
}
}
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]