// FOOBAR2000 (www.foobar2000.com) // TITLE-FORMATTING : Playlist // Author: Gilles Bouthenot - megar(@ath@)easyconnect(.doth.)fr // Playlist-name: The Oracle // Recommended font: onuava 9pt fixed-width (http://www.dafont.com/dl.php?os=win&fichier=onuava) // Recommended background: r=24 g=22 b=72 // Last-Version: http://www.atomas.com/foobar/ // Version 2.3: optional Replaygain values // Version 2.1b- ogg->vorbis // Version 2.0 - Everything guessed is now BLUE (uglier but handful to see which tracks has no tags) // Version 2.0 - Many cosmetic changes // Version 1.1 - Color for album - better track detection - %composer%/%performer% handling // Version 1.1 - isplaying: upper and time/replaygain highlight // Colors and _isplaying changes $puts(DEF,$if(%_isplaying%,d6cdcd|d6cdcd,9E9292|9E9292)) $puts(PL,$if(%_isplaying%,fff0f0|fff0f0,8E8282|8E8282)) $puts(PN,$if(%_isplaying%,---->,$num(%_playlist_number%,4) )) $puts(CYAN,$if(%_isplaying%,f0f0a5|f0f0a5,b0b065|b0b065)) $puts(GREEN,$if(%_isplaying%,B7E79D|B7E79D,7FAF65|7FAF65)) $puts(BLUE,$if(%_isplaying%,e0cbc6|e0cbc6,ce9e92|ce9e92)) $puts(ORANGE,$if(%_isplaying%,75c6f9|75c6f9,3187bd|3187bd)) $puts(NORG,$if(%_isplaying%,C2BCF7|C2BCF7,8076e0|8076e0)) // Format tags $puts(A,%_filename%[%_directoryname%][%title%][%artist%]) $puts(FN-L,$len(%_filename%)) $puts(DN-L,$add($get(FN-L),$len([%_directoryname%]))) $puts(TITLE-L,$add($get(DN-L),$len([%title%]))) $puts(ARTIST-L,$add($get(TITLE-L),$len([%artist%]))) $puts(A,$replace($replace($replace($replace($upper($get(A)), ,!),'',!),",!),.,!)) $puts(A,$replace($replace($replace($replace($get(A),{,!),},!),'(',!),')',!)) $puts(A,$replace($replace($replace($replace($get(A),:,!),',',!),-,!),_,!)) $puts(A,$replace($replace($replace($replace($get(A),À,A),È,E),Â,A),Ô,O)) $puts(A,$replace($replace($replace($replace($get(A),/,!),?,!),É,E),Ù,U)) $puts(A,$replace($get(A),*,!)) $puts(FN,%_filename%) $puts(FN1,$left($get(A),$get(FN-L))) $puts(FN2,$replace($get(FN1),!,)) $puts(DN,%_directoryname%) $puts(DN1,$if(%_directoryname%,$substr($get(A),$add($get(FN-L),1),$get(DN-L)),)) $puts(TITLE1,$if(%title%,$substr($get(A),$add($get(DN-L),1),$get(TITLE-L)),)) $puts(ARTIST1,$if(%artist%,$substr($get(A),$add($get(TITLE-L),1),$get(ARTIST-L)),)) // Guess year from directoryname. remove it if found $puts(A,$strstr(%_directoryname%,'(19')) $ifgreater($get(A),0,,$puts(A,$strstr(%_directoryname%,'(20'))) $ifgreater($get(A),0,$puts(YEAR,$substr(%_directoryname%,$add($get(A),1),$add($get(A),4))),) $put(COLY,$get(BLUE)) $puts(DN,$replace(%_directoryname%,'('$get(YEAR)')',)) $puts(DN1,$replace($get(DN1),!$get(YEAR)!,)) $puts(A,$left($get(DN1),1))$puts(B,$substr($get(DN1),2,2))$puts(C,$substr($get(DN1),$sub($len($get(DN1)),1),$sub($len($get(DN1)),1)))$puts(D,$right($get(DN1),1)) $if($strcmp($get(A),!),$puts(DN,$right($get(DN),$sub($len($get(DN)),1)))$puts(DN1,$right($get(DN1),$sub($len($get(DN1)),1))) $if($strcmp($get(B),!),$puts(DN,$right($get(DN),$sub($len($get(DN)),1)))$puts(DN1,$right($get(DN1),$sub($len($get(DN1)),1))) )) $if($strcmp($get(D),!),$puts(DN,$left($get(DN),$sub($len($get(DN)),1)))$puts(DN1,$left($get(DN1),$sub($len($get(DN1)),1))) $if($strcmp($get(C),!),$puts(DN,$left($get(DN),$sub($len($get(DN)),1)))$puts(DN1,$left($get(DN1),$sub($len($get(DN1)),1))) )) // Remove ARTIST from FN $puts(A,$strstr($get(FN1),$get(ARTIST1))) $ifgreater($get(A),0, $puts(FN,$left($get(FN),$sub($get(A),1))$right($get(FN),$add($sub($len($get(FN1)),$add($get(A),$len($get(ARTIST1)))),1))) $puts(FN1,$left($get(FN1),$sub($get(A),1))$right($get(FN1),$add($sub($len($get(FN1)),$add($get(A),$len($get(ARTIST1)))),1))) $puts(A,$left($get(FN1),1))$puts(B,$substr($get(FN1),2,2))$puts(C,$substr($get(FN1),3,3))$puts(D,$substr($get(FN1),4,4)) $if($strcmp($get(A),!),$puts(FN,$right($get(FN),$sub($len($get(FN)),1)))$puts(FN1,$right($get(FN1),$sub($len($get(FN1)),1))) $if($strcmp($get(B),!),$puts(FN,$right($get(FN),$sub($len($get(FN)),1)))$puts(FN1,$right($get(FN1),$sub($len($get(FN1)),1))) $if($strcmp($get(C),!),$puts(FN,$right($get(FN),$sub($len($get(FN)),1)))$puts(FN1,$right($get(FN1),$sub($len($get(FN1)),1))) $if($strcmp($get(D),!),$puts(FN,$right($get(FN),$sub($len($get(FN)),1)))$puts(FN1,$right($get(FN1),$sub($len($get(FN1)),1))) )))) ,) // Remove DN from FN $puts(A,$strstr($get(FN1),$get(DN1))) $ifgreater($get(A),0, $puts(FN,$left($get(FN),$sub($get(A),1))$right($get(FN),$add($sub($len($get(FN1)),$add($get(A),$len($get(DN1)))),1))) $puts(FN1,$left($get(FN1),$sub($get(A),1))$right($get(FN1),$add($sub($len($get(FN1)),$add($get(A),$len($get(DN1)))),1))) $puts(A,$left($get(FN1),1))$puts(B,$substr($get(FN1),2,2))$puts(C,$substr($get(FN1),3,3))$puts(D,$substr($get(FN1),4,4)) $if($strcmp($get(A),!),$puts(FN,$right($get(FN),$sub($len($get(FN)),1)))$puts(FN1,$right($get(FN1),$sub($len($get(FN1)),1))) $if($strcmp($get(B),!),$puts(FN,$right($get(FN),$sub($len($get(FN)),1)))$puts(FN1,$right($get(FN1),$sub($len($get(FN1)),1))) $if($strcmp($get(C),!),$puts(FN,$right($get(FN),$sub($len($get(FN)),1)))$puts(FN1,$right($get(FN1),$sub($len($get(FN1)),1))) $if($strcmp($get(D),!),$puts(FN,$right($get(FN),$sub($len($get(FN)),1)))$puts(FN1,$right($get(FN1),$sub($len($get(FN1)),1))) )))) $puts(C,$substr($get(FN1),$sub($len($get(FN1)),1),$sub($len($get(FN1)),1)))$puts(D,$right($get(FN1),1)) $if($strcmp($get(D),!),$puts(FN,$left($get(FN),$sub($len($get(FN)),1)))$puts(FN1,$left($get(FN1),$sub($len($get(FN1)),1))) $if($strcmp($get(C),!),$puts(FN,$left($get(FN),$sub($len($get(FN)),1)))$puts(FN1,$left($get(FN1),$sub($len($get(FN1)),1))) )),) // Guess track number from filename $puts(A,$left($get(FN1),1))$puts(B,$substr($get(FN1),2,2))$puts(C,$substr($get(FN1),3,3))$puts(D,$substr($get(FN1),4,4)) $if( $and($and($or($greater($get(A),0),$strcmp($get(A),0)),$or($greater($get(B),0),$strcmp($get(B),0))), $or($and($strcmp($get(C),!),$not($greater($get(A),2))), $and($and($or($greater($get(C),0),$strcmp($get(C),0)),$strcmp($get(D),!)),$not($greater($get(B),2))))), // track guessed $puts(TN,$num($mod($if2(%tracknumber%,$get(FN1)),100),2)) $puts(FN,$substr($get(FN),4,200)) $puts(FN1,$substr($get(FN1),4,200)) $puts(A,$left($get(FN1),1))$puts(B,$substr($get(FN1),2,2))$puts(C,$substr($get(FN1),3,3))$puts(D,$substr($get(FN1),4,4)) $if($strcmp($get(A),!),$puts(FN,$right($get(FN),$sub($len($get(FN)),1))) $if($strcmp($get(B),!),$puts(FN,$right($get(FN),$sub($len($get(FN)),1))) $if($strcmp($get(C),!),$puts(FN,$right($get(FN),$sub($len($get(FN)),1))) $if($strcmp($get(D),!),$puts(FN,$right($get(FN),$sub($len($get(FN)),1))) )))) , // track not guessed $puts(TN,$num($mod($if2(%tracknumber%,),100),2)) ) $puts(COLTN,$if($strcmp($num($mod(%tracknumber%,100),2),$get(TN)),$get(DEF),$get(BLUE))) // Get info from tags YEAR, DATE $if(%year%%date%,$puts(YEAR,[%year%][%date%])$put(COLY,$get(CYAN))) // Get TITLE-Part 1: Remove track number from it $puts(C,$substr($get(TITLE1),3,3)) $puts(D,$substr($get(TITLE1),4,4)) $puts(TITLE, $ifgreater($get(TN),0, $if($and($strcmp($num(%title%,2),$get(TN)),$strcmp($get(C),!)), $substr(%title%,4,200)$puts(TITLE1,$substr($get(TITLE1,4,200))), $if($and($strcmp($num($substr(%title%,2,3),2),$get(TN),$strcmp(get(C),!))), $substr(%title%,5,200)$puts(TITLE1,$substr($get(TITLE1),5,200)), [%title%])) ,[%title%])) // Get TITLE-Part 2: Add/ReplaceBy filename $puts(TITLE, $if($and(%title%,$not($strcmp($left($get(TITLE1),5),TRACK))), $puts(TITLE2,$replace($get(TITLE1),!,)) $puts(TITLE3,$left($get(TITLE2),$min(20,$max($sub($len($get(TITLE2)),8),5)))) $if($or($strstr($get(FN2),$get(TITLE3)),$strstr($get(TITLE2),$replace($get(FN1),!,))) ,$padcut($get(TITLE),56) ,$padcut($left($get(TITLE) ,35)$get(BLUE)$get(FN),71) ) ,$get(BLUE)$padcut($get(FN),56))) // Guess Artist/Directoryname $puts(A,$if2(%artist%,$replace($get(DN),[%album%],))) $puts(COLA,$if(%artist%,$get(CYAN),$get(BLUE))) $if(%composer%%performer%%artist%%album%, $puts(A, $if($strstr($upper(%performer%),$upper(%artist%)),,[%performer%/]) $if($strstr($upper(%performer%%artist%),$upper(%composer%)),,[%composer%-]) $get(A)) ) // Format ARTIST/ALBUM $puts(B,$div($mul($len($get(A)),48),$len([$get(A)][ %album%]))) $puts(ARTIST,$left($get(A),$get(B))) $puts(ALBUM,$padcut([ %album%],$sub(54,$len($get(ARTIST))))) // set TYPE to "wav", "mp2", "mp3", "flac", "monkey", "wv", "wvc", "wav", "mpc" (6 characters) $puts(TYPE,$if($stricmp(%__codec%,mp2), mp2,)) $puts(TYPE,$if($stricmp(%__codec%,mp3), mp3,$get(TYPE))) $puts(TYPE,$if($stricmp(%__codec%,flac), flac,$get(TYPE))) $puts(TYPE,$if($stricmp(%__codec%,vorbis),vorbis,$get(TYPE))) $puts(TYPE,$if($stricmp(%__codec%,pcm), wav,$get(TYPE))) $puts(TYPE,$if($stricmp(%__codec%,musepack), mpc,$get(TYPE))) //$puts(TYPE,$if($strstr($lower(%__codec%),monkey),monkey,$get(TYPE))) $puts(TYPE,$if($and($stricmp(%__codec%,wavepack),$strstr(%%__compression,lossless)), wv,$get(TYPE))) $puts(TYPE,$if($and($stricmp(%__codec%,wavepack),$strstr(%%__compression,lossy)), wvc,$get(TYPE))) /////////// // Start QUAL // mp2:128<=br<=325 ---> 0<=Q<=530 // mp3:128<=br<=195 ---> 0<=Q<=530 // vorbis: 80<=br<=156 ---> 0<=Q<=530 // mpc: 64<=br<=152 ---> 0<=Q<=530 // flac, monkey, wav, wv, wvc --> Q=530 $if($strstr($get(TYPE),mp2), $puts(QUAL,$mul($sub(%__bitrate%,192),3))) $if($strstr($get(TYPE),mp3), $puts(QUAL,$mul($sub(%__bitrate%,128),8))) $if($strstr($get(TYPE),vorbis), $puts(QUAL,$mul($sub(%__bitrate%,80),7))) $if($strstr($get(TYPE),mpc), $puts(QUAL,$mul($sub(%__bitrate%,64),6))) $if($or($or($or($strstr($get(TYPE),wv),$strstr($get(TYPE),wav)),$strstr($get(TYPE),monkey)),$strstr($get(TYPE),flac)), $puts(QUAL,530)) // Limit QUAL to 0<=Q<=530 $puts(QUAL,$max(0,$get(QUAL)))$puts(QUAL,$min(530,$get(QUAL))) // Mono -> dim Q by 132 <=44100Khz -> dim Q by 260 $ifgreater(2,%__channels%,$puts(QUAL,$sub($get(QUAL),130)),) $ifgreater(44100,%__samplerate%,$puts(QUAL,$sub($get(QUAL),260)),) // Limit QUAL to 0<=Q<=530 $puts(QUAL,$max(0,$get(QUAL)))$puts(QUAL,$min(530,$get(QUAL))) // End QUAL //////////// // format rg_track and rg_album $puts(rg,%__replaygain_track_gain%) $puts(rg,$if($strcmp($substr($get(rg),3,3),.),$substr($get(rg),1,2)$substr($get(rg),4,5),$substr($get(rg),1,3)$substr($get(rg),5,6))) $puts(rg,$padcut_right($sub(8905,$get(rg)),5)) $puts(rg_track,$if(%__replaygain_track_gain%,$substr($get(rg),1,3).$substr($get(rg),4,4), )) $puts(rg,%__replaygain_album_gain%) $puts(rg,$if($strcmp($substr($get(rg),3,3),.),$substr($get(rg),1,2)$substr($get(rg),4,5),$substr($get(rg),1,3)$substr($get(rg),5,6))) $puts(rg,$padcut_right($sub(8905,$get(rg)),5)) $puts(rg_album,$if(%__replaygain_album_gain%,$substr($get(rg),1,3).$substr($get(rg),4,4), )) // Set Time to 12:34 or 12m if >=10:00, set BITRATE to "111" or "11M" (3 characters) $puts(TIME,$ifgreater(%_length_seconds%,599, $padcut_right($div($add(%_length_seconds%,30),60)m,4) ,%_length%)) $puts(BITRATE,$if($greater(%__bitrate%,999),$padcut_right($div($add(%__bitrate%,500),1000),2)M,$padcut_right(%__bitrate%,3))) // Format YEAR, TITLE, Colorize BITRATE if codec is known, Set RG to (color=red) if no replay gain, Default TYPE. $iflonger($get(YEAR),, $puts(YEAR,'['$padcut($get(YEAR),4)']') $puts(TITLE,$padcut($get(TITLE),$sub($len($get(TITLE)),6))) ,) $iflonger($get(TYPE),, //$puts(BITRATE,$blend(1717C8|1717C8,17C830|17C830,$get(QUAL),530)$get(BITRATE)),) $ifgreater($get(QUAL),265 ,$puts(BITRATE,$blend(50e0e0|50e0e0,50d050|50d050,$sub($get(QUAL),265),265)$get(BITRATE)) ,$puts(BITRATE,$blend(5050d0|5050d0,50e0e0|50e0e0,$get(QUAL),265)$get(BITRATE)) ),) $puts(RG,$if(%__replaygain_track_gain%,$get(DEF),$get(NORG))) $if($longer($get(TYPE),),,$puts(TYPE,$padcut_right(%__codec%,6))) $puts(ALBUM,$padcut($get(ALBUM),$sub($ifgreater($get(TN),0,50,54),$add($iflonger($get(ARTIST),1,0)),$len($get(ARTIST))))) $puts(TN,$ifgreater($get(TN),0, #$get(TN),)) // Format display $puts(DISPLAY,$get(PL)$get(PN)$get(COLA)$get(ARTIST)$get(ORANGE)$get(ALBUM)$get(COLTN)$get(TN) $get(GREEN)$get(TITLE)$get(COLY)$get(YEAR) $get(rg_track) $get(rg_album) $char(9) $get(DEF)$get(TYPE)$get(BITRATE) $get(RG)$get(TIME)) // DISPLAY ! $if(%_isplaying%,$upper($get(DISPLAY)),$get(DISPLAY))