Playlist Tree: Query Eye for the OCD Guy
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.

2 Responses to “Playlist Tree: Query Eye for the OCD Guy”

  1. cmdrpaddy Says:

    can you put wildcards in the date?
    It might be slightly more efficient if the date thing was

    date IS 196*

    or maybe not…

  2. shakey_snake Says:

    Awesome Chris.
    I’ve gone through the wiki before and still felt completely lost, but this I get.
    Thanks for this great tutorial.