////////////////////////////////////////////////////////////////////////////// function OnInit(initData) { initData.name = "Column.Folder: MusicFolder"; initData.desc = "Columns for music folders (coverart dimension/playtime etc.)"; initData.copyright = "tbone"; initData.min_version = "11.5.5"; initData.version = "0.1"; initData.default_enable = true; var col; col = initData.AddColumn(); col.name = "MusicFolder.Playtime"; col.label = "Playtime"; col.method = "Column_Playtime_Discs_Sampler_Artist_Album_Year_Genre"; col.multicol = true; col.autogroup = true; col.autorefresh = true; col.justify = "right"; var col; col = initData.AddColumn(); col.name = "MusicFolder.Discs"; col.label = "Discs"; col.method = "Column_Playtime_Discs_Sampler_Artist_Album_Year_Genre"; col.multicol = true; col.autogroup = true; col.autorefresh = true; col.justify = "right"; var col; col = initData.AddColumn(); col.name = "MusicFolder.Sampler"; col.label = "Sampler"; col.method = "Column_Playtime_Discs_Sampler_Artist_Album_Year_Genre"; col.multicol = true; col.autogroup = true; col.autorefresh = true; col.justify = "right"; var col; col = initData.AddColumn(); col.name = "MusicFolder.Artist"; col.label = "Artist"; col.method = "Column_Playtime_Discs_Sampler_Artist_Album_Year_Genre"; col.multicol = true; col.autogroup = true; col.autorefresh = true; col.justify = "left"; var col; col = initData.AddColumn(); col.name = "MusicFolder.Album"; col.label = "Album"; col.method = "Column_Playtime_Discs_Sampler_Artist_Album_Year_Genre"; col.multicol = true; col.autogroup = true; col.autorefresh = true; col.justify = "left"; var col; col = initData.AddColumn(); col.name = "MusicFolder.Year"; col.label = "Year"; col.method = "Column_Playtime_Discs_Sampler_Artist_Album_Year_Genre"; col.multicol = true; col.autogroup = true; col.autorefresh = true; col.justify = "right"; var col; col = initData.AddColumn(); col.name = "MusicFolder.Genre"; col.label = "Genre"; col.method = "Column_Playtime_Discs_Sampler_Artist_Album_Year_Genre"; col.multicol = true; col.autogroup = true; col.autorefresh = true; col.justify = "left"; var col; col = initData.AddColumn(); col.name = "MusicFolder.CoverDimensions.do"; col.method = "Column_CoverArt_DO"; col.label = "Cover WxH (do)"; col.autogroup = true; col.autorefresh = true; col.justify = "right"; var col; col = initData.AddColumn(); col.name = "MusicFolder.CoverDimensions.js"; col.method = "Column_CoverArt_JS"; col.label = "Cover WxH (js)"; col.autogroup = true; col.autorefresh = true; col.justify = "right"; initData.config.CoverArtImages = DOpus.NewVector('folder.jpg', 'cover.jpg', 'coverart.jpg'); } ////////////////////////////////////////////////////////////////////////////// function Column_Playtime_Discs_Sampler_Artist_Album_Year_Genre(data) { if(!data.item.is_dir){ data.value=""; return false; } var itemsEnum = ReadFolder(data.item.realpath, true, false); if (!itemsEnum) return; var fileCount = 0; var discCount = 0; var songLengthTotal = 0; var isSampler = false; var artistNames = { tagName:"mp3artist", store:new Array(), storeIndexed:new Array(), countDistinct:0 ,topKey:""}; var albumNames = { tagName:"mp3album", store:new Array(), storeIndexed:new Array(), countDistinct:0 ,topKey:""}; var yearEntries = { tagName:"mp3year", store:new Array(), storeIndexed:new Array(), countDistinct:0 ,topKey:""}; var genreEntries = { tagName:"mp3genre", store:new Array(), storeIndexed:new Array(), countDistinct:0 ,topKey:""}; while(!itemsEnum.Complete){ var item = itemsEnum.Next(); /////////////////////////////////////////////////////////////////////// if(item.is_dir){ var discNumberMatch = new String(item.name).match(/(\d+|I)/); if(discNumberMatch) discCount++; continue; } /////////////////////////////////////////////////////////////////////// var audio = item.metadata.audio; var ext = item.ext.toLowerCase(); if (ext!=".mp3" && ext!=".wma") continue; //DOpus.Output("Sfx-Item: " + item.name); fileCount++; /////////////////////////////////////////////////////////////////////// if (audio.mp3songlength) songLengthTotal += audio.mp3songlength; /////////////////////////////////////////////////////////////////////// CollectDistinctTagData(audio, artistNames); CollectDistinctTagData(audio, albumNames); CollectDistinctTagData(audio, yearEntries); CollectDistinctTagData(audio, genreEntries); } ////////////////////////////////////////////////////////////////////////// data.columns("MusicFolder.Playtime").value = SecondsToTime(songLengthTotal, 'hh:mm:ss'); //'d:hh:mm:ss' data.columns("MusicFolder.Playtime").sort = songLengthTotal; ////////////////////////////////////////////////////////////////////////// data.columns("MusicFolder.Discs").value = ( discCount==0 ? 1 : discCount); ////////////////////////////////////////////////////////////////////////// if ((artistNames.countDistinct/fileCount) > 0.25) isSampler = true; data.columns("MusicFolder.Sampler").value = ( isSampler ? "Sampler" : ""); ////////////////////////////////////////////////////////////////////////// if (isSampler) data.columns("MusicFolder.Artist").value = artistNames.storeIndexed.join(", "); else data.columns("MusicFolder.Artist").value = artistNames.topKey; ////////////////////////////////////////////////////////////////////////// data.columns("MusicFolder.Album").value = albumNames.topKey; data.columns("MusicFolder.Year").value = yearEntries.topKey; data.columns("MusicFolder.Genre").value = genreEntries.topKey; } ////////////////////////////////////////////////////////////////////////////// function CollectTagData_Unused( audio, tagObj){ //DOpus.Output(" Collect():"); //DOpus.Output(" tagName : " + tagObj.tagName); //DOpus.Output(" tagValue: " + audio[tagObj.tagName]); var tagValue = audio[tagObj.tagName]; if (tagValue && tagValue!="" && !tagObj.store[tagValue]){ tagObj.store[tagObj.store.length] = tagValue; } } ////////////////////////////////////////////////////////////////////////////// function CollectDistinctTagData( audio, tagObj){ //DOpus.Output(" CollectDistinct():"); //DOpus.Output(" tagName : " + tagObj.tagName); //DOpus.Output(" tagValue: " + audio[tagObj.tagName]); var tagValue = audio[tagObj.tagName]; if (!tagObj.store[tagValue]){ tagObj.store[tagValue] = 1; tagObj.storeIndexed[tagObj.storeIndexed.length] = tagValue; tagObj.countDistinct++; } else { tagObj.store[tagValue]++; if (tagObj.topKey=="") tagObj.topKey = tagValue; else { if (tagObj.store[tagValue] > tagObj.store[tagObj.topKey]){ tagObj.topKey = tagValue; } } } } ////////////////////////////////////////////////////////////////////////////// function SecondsToTime( s, f) { // seconds, format var d = h = m = 0; switch (true) { case (s > 86400): d = Math.floor(s / 86400); s %= 86400; case (s > 3600): h = Math.floor(s / 3600); s %= 3600; case (s > 60): m = Math.floor(s / 60); s %= 60; } if (f != null) { var f = f.replace('dd', (d < 10) ? "0" + d : d); f = f.replace('d', d); f = f.replace('hh', (h < 10) ? "0" + h : h); f = f.replace('h', h); f = f.replace('mm', (m < 10) ? "0" + m : m); f = f.replace('m', m); f = f.replace('ss', (s < 10) ? "0" + s : s); f = f.replace('s', s); } else { f = d + ':' + h + ':' + m + ':' + s; } return f; // :) omg... } ////////////////////////////////////////////////////////////////////////////// function Column_CoverArt_DO(data) { return Column_CoverArt( data, "DO"); } ////////////////////////////////////////////////////////////////////////////// function Column_CoverArt_JS(data) { return Column_CoverArt( data, "JS"); } ////////////////////////////////////////////////////////////////////////////// function Column_CoverArt(data, how) { var dims = null; if (!data.item.is_dir){ var coverFile = ""+data.item.realpath; } else { var coverFile = GetCoverFilepath(data.item, Script.config.CoverArtImages); } if (!coverFile){ data.value = ""; return false; } if (how=="DO") data.value = GetCoverDimensions_DO(coverFile); if (how=="JS") data.value = GetCoverDimensions_JS(coverFile); data.sort = data.value; return true; } ////////////////////////////////////////////////////////////////////////////// function GetCoverFilepath(folderItem, imageNames) { for (var i=0;i>16)|((hi<<16)>>8)); } function GetByte2(Value,ByteToGet){ return (Value & (0xFF<<(ByteToGet*8)))>>>(ByteToGet*8); } function SwapHiLo(w){ return MakeWord(GetByte2(w,1),GetByte2(w,0)); } // Simplifies using a Blob by making it behave more like a file. var soBeginning=0; var soCurrent=1; var soEnd=2; function BlobStream(blob){ this.blob=blob; this.position=0; this.size=0; this.type="blob"; if (this.blob){ if (this.blob["size"]!=undefined){ this.size=this.blob.size; } if (this.blob.length!=undefined){ this.size=this.blob.length; this.type="array"; } //DOpus.Output("Blobsize: "+this.size); //DOpus.Output("Blobtype: "+this.type); } } BlobStream.prototype.Seek=function(offset,mode){ switch(mode){ case soBeginning: { this.position=offset; return this.position; } case soCurrent: { this.position=this.position+offset; return this.position; } case soEnd:{ this.position=blob.size-offset; return this.position; } default: return -1; } }; BlobStream.prototype.ReadByte=function(){ if (this.type=="array") return this.blob[this.position++]; if (this.type=="blob") return this.blob(this.position++); }; BlobStream.prototype.ReadWord=function(){ return MakeWord(this.ReadByte(),this.ReadByte()); }; BlobStream.prototype.ReadLong=function(){ return MakeLong(MakeWord(this.ReadByte(),this.ReadByte()),MakeWord(this.ReadByte(),this.ReadByte())); }; BlobStream.prototype.ReadBytes=function(numbytes){ var retval=[]; for (var i=0;i0){ var x = 3 * (1 << ((GIFHeader.Flags & 7) + 1)); stream.Seek(x,soBeginning); } bFound=false; while(stream.position15) {d>>=4;h=hD.substr(d&15,1)+h;} return h; } this.h2d = function(h) { return parseInt(h,16); } this.WriteAll = function(what) { //Create Stream object var BinaryStream = new ActiveXObject("ADODB.Stream"); //Specify stream type - we cheat and get string but 'like' binary BinaryStream.Type = adTypeText; BinaryStream.CharSet = '437'; //Open the stream BinaryStream.Open(); // Write to the stream BinaryStream.WriteText(this.Forward437(what)); // Write the string to the disk BinaryStream.SaveToFile(this.path, adSaveCreateOverWrite); // Clearn up BinaryStream.Close(); } this.ReadAll = function() { //Create Stream object - needs ADO 2.5 or heigher var BinaryStream = new ActiveXObject("ADODB.Stream"); //Specify stream type - we cheat and get string but 'like' binary BinaryStream.Type = adTypeText; BinaryStream.CharSet = codePage; //Open the stream BinaryStream.Open(); //Load the file data from disk To stream object BinaryStream.LoadFromFile(this.path); //Open the stream And get binary 'string' from the object var what = BinaryStream.ReadText; // Clean up BinaryStream.Close(); return what; return this.Backward437(what); } /* Convert a octet number to a code page 437 char code */ this.Forward437 = function(inString) { var encArray = new Array(); var tmp=''; var i=0; var c=0; var l=inString.length; var cc; var h; for(;i1;) { var l=encArray.length; for(var c=0;c1;) { var l=encArray.length; for(var c=0;c