April 24th, 2007, posted by cwbowron
This article will build up an absurdly complex playlist tree query from a simple example.
Requirements:
- foo_cwb_hooks
- playlist tree panel
- foo_playcount (official)
- well tagged library
Step 1 – Music from the 60′s
Make sure you have a playlist tree panel in your layout. Then create a new query from the main menu by selecting “Libary->Playlist Tree->Root->New Query…” and fill in the fields with the following information:
Label: <Your choice>
Source: @database
Criteria: date GREATER 1959 AND date LESS 1971
*** Note, it is IMPORTANT that GREATER and LESS and AND be ALL CAPS
Format: $replace(%path%,\,|)
Maximum: 0
Population Sort Order: <blank>
Sort by Display Name: Checked
Automatically Refresh: Unchecked
Now, click Ok, and the query result should show up based on where they are located on your computer.
Step 2 – … And Rating > 2
Middle click, or right click while holding shift, on the query you created in Step 1, and change the criteria.
New Criteria:
date GREATER 1959 AND date LESS 1971
AND rating GREATER 2
Step 3 – … And Songs 4-6 Minutes in Length
New Criteria:
date GREATER 1959 AND date LESS 1971
AND rating GREATER 2
AND %length_seconds% LESS 360 AND %length_seconds% GREATER 240
Step 4 – … And Not Heard in the Last Week
New Criteria:
date GREATER 1959 AND date LESS 1971
AND rating GREATER 2
AND %length_seconds% LESS 360 AND %length_seconds% GREATER 240
AND (“$cwb_datediff(%last_played%,%cwb_systemdate%)” GREATER 7 OR NOT %last_played% HAS 20)
Step 5 – … And By Bob Dylan
New Criteria:
date GREATER 1959 AND date LESS 1971
AND rating GREATER 2
AND %length_seconds% LESS 360 AND %length_seconds% GREATER 240
AND (“$cwb_datediff(%last_played%,%cwb_systemdate%)” GREATER 7 OR NOT %last_played% HAS 20)
AND artist HAS bob dylan
Step 6 – … In Scheme
To use the built in scheme language, you must change the source to @scheme.
Then, you can enter the scheme code into the format field. For doing your own scheme queries, I suggest using an editor that knows how to edit scheme code such as Emacs, then copying and pasting the code into Playlist Tree’s format box.
The following code will give you basically the same query as step 5, but in scheme.
Source: @scheme
New Format:
(let ((filter
(string-append
;; Notice that this filter string is basically the same as we used in the traditional query
;; We can use any traditional query strings here to select which songs we want
“date GREATER 1959 AND date LESS 1971″
” AND %length_seconds% LESS 360 AND %length_seconds% GREATER 240″
” AND rating GREATER 3″
” AND (\”$cwb_datediff(%last_played%,%cwb_systemdate%)\” GREATER 7 OR NOT %last_played% HAS 20)”
” AND artist HAS bob dylan”)))
(for-each-db-entry
(lambda (handle)
(let ((artist (format-title handle “%artist%”))
(album (format-title handle “%album%”))
(title (format-title handle “%title%”)))
(add-node handle (list artist album title))))
filter)
(when start-index
(play-from-playlist start-index)))
Step 7 – … Added to Album Playlists and Start Playing
New Format:
(let ((filter
(string-append
;; Notice that this filter string is basically the same as we used in the traditional query
“date GREATER 1959 AND date LESS 1971″
” AND %length_seconds% LESS 360 AND %length_seconds% GREATER 240″
” AND rating GREATER 3″
” AND (\”$cwb_datediff(%last_played%,%cwb_systemdate%)\” GREATER 7 OR NOT %last_played% HAS 20)”
” AND artist HAS bob dylan”))
(start-index #f))
(for-each-db-entry
(lambda (handle)
(let* ((playlist-name (format-title handle “** %album%”))
(index (find-or-create-playlist playlist-name)))
;;; store the index of the first playlist we make
(when (not start-index)
(set! start-index index))
(add-to-playlist handle index)))
filter)
(when start-index
(play-from-playlist start-index)))
Step 8 – … And Hooked Up To a Button
If you look in the main menu under Libary->Playlist Tree->Refresh you should see options for refreshing all of your scheme queries. To hook up a scheme query to a Columns UI button, make sure you have a button toolbar somewhere in your layout.
Then:
- Right click on the buttons and select “Customize…”.
- Add a new button by clicking the Add button
- Select the “Change…” button to select the action.
- Select “Main Menu Items” from the command group
- Select “None” for the item group
- Find in your the command list “Libary/Playlist Tree/Refresh/<Your Query>”
- Click Ok.
- Change the Display to “Text”
- Check “Use Custom Text”
- Enter some text in there that will refer to the query.
When you are done, a new button should have shown up in your button layout with the label you provided. You can now click on that button to refresh the query which will run the scheme code and begin playing some good old school Bob Dylan that you haven’t listened in a while.
April 25th, 2007 at 7:27 am
can you put wildcards in the date?
It might be slightly more efficient if the date thing was
date IS 196*
or maybe not…
April 25th, 2007 at 3:36 pm
Awesome Chris.
I’ve gone through the wiki before and still felt completely lost, but this I get.
Thanks for this great tutorial.