File info: Implemented support for Album Artist and Codec fields

CQTexperiment
Christopher Snowhill 2021-10-01 19:18:42 -07:00
parent e5aec4b618
commit fdae7eec21
44 changed files with 413 additions and 47 deletions

View File

@ -33,6 +33,7 @@
IBOutlet NSMenuItem *showIndexColumn;
IBOutlet NSMenuItem *showTitleColumn;
IBOutlet NSMenuItem *showAlbumArtistColumn;
IBOutlet NSMenuItem *showArtistColumn;
IBOutlet NSMenuItem *showAlbumColumn;
IBOutlet NSMenuItem *showGenreColumn;

View File

@ -1,8 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="17701" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="19162" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<dependencies>
<deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="17701"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="19162"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<objects>
@ -15,16 +15,16 @@
<customObject id="-3" userLabel="Application" customClass="NSObject"/>
<window title="Info Inspector" separatorStyle="none" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" hidesOnDeactivate="YES" visibleAtLaunch="NO" frameAutosaveName="InfoInspector" animationBehavior="default" titlebarAppearsTransparent="YES" id="1" customClass="NSPanel">
<windowStyleMask key="styleMask" titled="YES" closable="YES" resizable="YES" utility="YES" nonactivatingPanel="YES" HUD="YES"/>
<rect key="contentRect" x="700" y="80" width="300" height="450"/>
<rect key="screenRect" x="0.0" y="0.0" width="1792" height="1095"/>
<rect key="contentRect" x="700" y="80" width="300" height="494"/>
<rect key="screenRect" x="0.0" y="0.0" width="1920" height="1055"/>
<value key="minSize" type="size" width="240" height="420"/>
<value key="maxSize" type="size" width="400" height="600"/>
<view key="contentView" id="2">
<rect key="frame" x="0.0" y="0.0" width="300" height="450"/>
<rect key="frame" x="0.0" y="0.0" width="300" height="494"/>
<autoresizingMask key="autoresizingMask"/>
<subviews>
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="9">
<rect key="frame" x="69" y="416" width="37" height="14"/>
<rect key="frame" x="69" y="438" width="37" height="14"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" controlSize="small" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Artist:" id="10">
<font key="font" metaFont="smallSystem"/>
@ -33,7 +33,7 @@
</textFieldCell>
</textField>
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="11">
<rect key="frame" x="63" y="394" width="43" height="14"/>
<rect key="frame" x="63" y="416" width="43" height="14"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" controlSize="small" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Album:" id="12">
<font key="font" metaFont="smallSystem"/>
@ -42,7 +42,7 @@
</textFieldCell>
</textField>
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="13">
<rect key="frame" x="68" y="350" width="38" height="14"/>
<rect key="frame" x="68" y="372" width="38" height="14"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" controlSize="small" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Track:" id="14">
<font key="font" metaFont="smallSystem"/>
@ -51,7 +51,7 @@
</textFieldCell>
</textField>
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="15">
<rect key="frame" x="61" y="328" width="45" height="14"/>
<rect key="frame" x="61" y="350" width="45" height="14"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" controlSize="small" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Length:" id="16">
<font key="font" metaFont="smallSystem"/>
@ -60,7 +60,7 @@
</textFieldCell>
</textField>
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="17">
<rect key="frame" x="74" y="306" width="32" height="14"/>
<rect key="frame" x="74" y="328" width="32" height="14"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" controlSize="small" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Year:" id="18">
<font key="font" metaFont="smallSystem"/>
@ -69,7 +69,7 @@
</textFieldCell>
</textField>
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="19">
<rect key="frame" x="66" y="284" width="40" height="14"/>
<rect key="frame" x="66" y="306" width="40" height="14"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" controlSize="small" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Genre:" id="20">
<font key="font" metaFont="smallSystem"/>
@ -78,7 +78,7 @@
</textFieldCell>
</textField>
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="21">
<rect key="frame" x="33" y="240" width="73" height="14"/>
<rect key="frame" x="33" y="262" width="73" height="14"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" controlSize="small" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Sample Rate:" id="22">
<font key="font" metaFont="smallSystem"/>
@ -87,7 +87,7 @@
</textFieldCell>
</textField>
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="27">
<rect key="frame" x="49" y="218" width="57" height="14"/>
<rect key="frame" x="49" y="240" width="57" height="14"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" controlSize="small" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Channels:" id="28">
<font key="font" metaFont="smallSystem"/>
@ -96,7 +96,7 @@
</textFieldCell>
</textField>
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="29">
<rect key="frame" x="64" y="196" width="42" height="14"/>
<rect key="frame" x="64" y="218" width="42" height="14"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" controlSize="small" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Bitrate:" id="32">
<font key="font" metaFont="smallSystem"/>
@ -105,7 +105,7 @@
</textFieldCell>
</textField>
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="30">
<rect key="frame" x="17" y="174" width="89" height="14"/>
<rect key="frame" x="17" y="196" width="89" height="14"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" controlSize="small" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Bits Per Sample:" id="31">
<font key="font" metaFont="smallSystem"/>
@ -114,7 +114,7 @@
</textFieldCell>
</textField>
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="23">
<rect key="frame" x="74" y="372" width="32" height="14"/>
<rect key="frame" x="74" y="394" width="32" height="14"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" controlSize="small" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Title:" id="24">
<font key="font" metaFont="smallSystem"/>
@ -123,7 +123,7 @@
</textFieldCell>
</textField>
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="33" customClass="ToolTipTextField">
<rect key="frame" x="113" y="416" width="170" height="14"/>
<rect key="frame" x="113" y="438" width="170" height="14"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" controlSize="small" lineBreakMode="truncatingMiddle" sendsActionOnEndEditing="YES" title="N/A" id="34">
<font key="font" metaFont="smallSystem"/>
@ -135,7 +135,7 @@
</connections>
</textField>
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="35" customClass="ToolTipTextField">
<rect key="frame" x="113" y="394" width="170" height="14"/>
<rect key="frame" x="113" y="416" width="170" height="14"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" controlSize="small" lineBreakMode="truncatingMiddle" sendsActionOnEndEditing="YES" title="N/A" id="36">
<font key="font" metaFont="smallSystem"/>
@ -147,7 +147,7 @@
</connections>
</textField>
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="37" customClass="ToolTipTextField">
<rect key="frame" x="113" y="372" width="170" height="14"/>
<rect key="frame" x="113" y="394" width="170" height="14"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" controlSize="small" lineBreakMode="truncatingMiddle" sendsActionOnEndEditing="YES" title="N/A" id="38">
<font key="font" metaFont="smallSystem"/>
@ -159,7 +159,7 @@
</connections>
</textField>
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="39" customClass="ToolTipTextField">
<rect key="frame" x="113" y="350" width="170" height="14"/>
<rect key="frame" x="113" y="372" width="170" height="14"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" controlSize="small" lineBreakMode="truncatingMiddle" sendsActionOnEndEditing="YES" title="N/A" id="40">
<font key="font" metaFont="smallSystem"/>
@ -172,7 +172,7 @@
</connections>
</textField>
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="41" customClass="ToolTipTextField">
<rect key="frame" x="113" y="328" width="170" height="14"/>
<rect key="frame" x="113" y="350" width="170" height="14"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" controlSize="small" lineBreakMode="truncatingMiddle" sendsActionOnEndEditing="YES" title="N/A" id="42">
<font key="font" metaFont="smallSystem"/>
@ -185,7 +185,7 @@
</connections>
</textField>
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="43" customClass="ToolTipTextField">
<rect key="frame" x="113" y="306" width="170" height="14"/>
<rect key="frame" x="113" y="328" width="170" height="14"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" controlSize="small" lineBreakMode="truncatingMiddle" sendsActionOnEndEditing="YES" title="N/A" id="44">
<font key="font" metaFont="smallSystem"/>
@ -200,7 +200,7 @@
</connections>
</textField>
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="45" customClass="ToolTipTextField">
<rect key="frame" x="113" y="284" width="170" height="14"/>
<rect key="frame" x="113" y="306" width="170" height="14"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" controlSize="small" lineBreakMode="truncatingMiddle" sendsActionOnEndEditing="YES" title="N/A" id="46">
<font key="font" metaFont="smallSystem"/>
@ -212,7 +212,7 @@
</connections>
</textField>
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="49" customClass="ToolTipTextField">
<rect key="frame" x="113" y="240" width="170" height="14"/>
<rect key="frame" x="113" y="262" width="170" height="14"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" controlSize="small" lineBreakMode="truncatingMiddle" sendsActionOnEndEditing="YES" title="N/A" id="50">
<font key="font" metaFont="smallSystem"/>
@ -224,7 +224,7 @@
</connections>
</textField>
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="51" customClass="ToolTipTextField">
<rect key="frame" x="113" y="218" width="170" height="14"/>
<rect key="frame" x="113" y="240" width="170" height="14"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" controlSize="small" lineBreakMode="truncatingMiddle" sendsActionOnEndEditing="YES" title="N/A" id="52">
<font key="font" metaFont="smallSystem"/>
@ -236,7 +236,7 @@
</connections>
</textField>
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="53" customClass="ToolTipTextField">
<rect key="frame" x="113" y="196" width="170" height="14"/>
<rect key="frame" x="113" y="218" width="170" height="14"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" controlSize="small" lineBreakMode="truncatingMiddle" sendsActionOnEndEditing="YES" title="N/A" id="54">
<font key="font" metaFont="smallSystem"/>
@ -248,7 +248,7 @@
</connections>
</textField>
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="55" customClass="ToolTipTextField">
<rect key="frame" x="113" y="174" width="170" height="14"/>
<rect key="frame" x="113" y="196" width="170" height="14"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" controlSize="small" lineBreakMode="truncatingMiddle" sendsActionOnEndEditing="YES" title="N/A" id="56">
<font key="font" metaFont="smallSystem"/>
@ -259,8 +259,29 @@
<binding destination="-2" name="value" keyPath="valueToDisplay.bitsPerSample" id="122"/>
</connections>
</textField>
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="QPg-Mb-Urn">
<rect key="frame" x="66" y="174" width="40" height="14"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" controlSize="small" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Codec:" id="cbq-TT-CZX">
<font key="font" metaFont="smallSystem"/>
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="ijS-y2-eCZ" customClass="ToolTipTextField">
<rect key="frame" x="113" y="174" width="170" height="14"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" controlSize="small" lineBreakMode="truncatingMiddle" sendsActionOnEndEditing="YES" title="N/A" id="Yby-OU-cqP">
<font key="font" metaFont="smallSystem"/>
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<connections>
<binding destination="-2" name="value" keyPath="valueToDisplay.codec" id="Tle-Vx-BN5"/>
</connections>
</textField>
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="84">
<rect key="frame" x="50" y="262" width="56" height="14"/>
<rect key="frame" x="50" y="284" width="56" height="14"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" controlSize="small" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Filename:" id="85">
<font key="font" metaFont="smallSystem"/>
@ -269,7 +290,7 @@
</textFieldCell>
</textField>
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="86" customClass="ToolTipTextField">
<rect key="frame" x="113" y="262" width="170" height="14"/>
<rect key="frame" x="113" y="284" width="170" height="14"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" controlSize="small" lineBreakMode="truncatingMiddle" sendsActionOnEndEditing="YES" title="N/A" id="87">
<font key="font" metaFont="smallSystem"/>
@ -294,6 +315,27 @@
</binding>
</connections>
</imageView>
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="vB6-9J-5qg">
<rect key="frame" x="33" y="460" width="72" height="14"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" controlSize="small" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" title="Album Artist:" id="LFJ-QQ-gGr">
<font key="font" metaFont="smallSystem"/>
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField verticalHuggingPriority="750" fixedFrame="YES" translatesAutoresizingMaskIntoConstraints="NO" id="cj0-Tw-xpq" customClass="ToolTipTextField">
<rect key="frame" x="112" y="460" width="170" height="14"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
<textFieldCell key="cell" controlSize="small" lineBreakMode="truncatingMiddle" sendsActionOnEndEditing="YES" title="N/A" id="B8w-o8-ZBw">
<font key="font" metaFont="smallSystem"/>
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<connections>
<binding destination="-2" name="value" keyPath="valueToDisplay.albumartist" id="gTS-bf-rHT"/>
</connections>
</textField>
</subviews>
</view>
<point key="canvasLocation" x="136" y="131"/>

View File

@ -1,8 +1,8 @@
<?xml version="1.0" encoding="UTF-8"?>
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="19115.3" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<document type="com.apple.InterfaceBuilder3.Cocoa.XIB" version="3.0" toolsVersion="19162" targetRuntime="MacOSX.Cocoa" propertyAccessControl="none" useAutolayout="YES">
<dependencies>
<deployment identifier="macosx"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="19115.3"/>
<plugIn identifier="com.apple.InterfaceBuilder.CocoaPlugin" version="19162"/>
<capability name="documents saved in the Xcode 8 format" minToolsVersion="8.0"/>
</dependencies>
<objects>
@ -32,10 +32,10 @@
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<clipView key="contentView" drawsBackground="NO" copiesOnScroll="NO" id="KWC-Ti-8KY">
<rect key="frame" x="0.0" y="0.0" width="1000" height="378"/>
<autoresizingMask key="autoresizingMask"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<subviews>
<tableView focusRingType="none" verticalHuggingPriority="750" allowsExpansionToolTips="YES" alternatingRowBackgroundColors="YES" autosaveName="Playlist" rowHeight="18" headerView="1517" id="207" customClass="PlaylistView">
<rect key="frame" x="0.0" y="0.0" width="1000" height="361"/>
<rect key="frame" x="0.0" y="0.0" width="1086" height="361"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<size key="intercellSpacing" width="3" height="6"/>
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
@ -79,7 +79,7 @@
</binding>
</connections>
</tableColumn>
<tableColumn identifier="title" editable="NO" width="152" minWidth="96" maxWidth="1024" id="208">
<tableColumn identifier="title" editable="NO" width="125.5" minWidth="96" maxWidth="1024" id="208">
<tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border" alignment="left" title="Title">
<color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" white="0.33333299" alpha="1" colorSpace="calibratedWhite"/>
@ -100,6 +100,26 @@
<binding destination="1689" name="fontSize" keyPath="values.fontSize" id="1914"/>
</connections>
</tableColumn>
<tableColumn identifier="index" editable="NO" width="150" minWidth="96" maxWidth="1024" id="yGV-gP-Wl6">
<tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border" alignment="left" title="Album Artist">
<color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" white="0.33333299" alpha="1" colorSpace="calibratedWhite"/>
</tableHeaderCell>
<textFieldCell key="dataCell" lineBreakMode="truncatingTail" selectable="YES" editable="YES" alignment="left" title="Text Cell" id="M6d-rj-lEz">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<tableColumnResizingMask key="resizingMask" resizeWithTable="YES" userResizable="YES"/>
<connections>
<binding destination="1689" name="fontSize" keyPath="values.fontSize" id="dJs-UO-m5r"/>
<binding destination="218" name="value" keyPath="arrangedObjects.albumartist" id="OFk-g8-Jbd">
<dictionary key="options">
<bool key="NSConditionallySetsEditable" value="YES"/>
</dictionary>
</binding>
</connections>
</tableColumn>
<tableColumn identifier="artist" editable="NO" width="149.5" minWidth="96" maxWidth="1024" id="391">
<tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border" alignment="left" title="Artist">
<color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/>
@ -195,7 +215,7 @@
<binding destination="1689" name="fontSize" keyPath="values.fontSize" id="1922"/>
</connections>
</tableColumn>
<tableColumn identifier="track" editable="NO" width="72" minWidth="24" maxWidth="72" id="850">
<tableColumn identifier="track" editable="NO" width="34.5" minWidth="24" maxWidth="72" id="850">
<tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border" alignment="right" title="№">
<color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="headerColor" catalog="System" colorSpace="catalog"/>
@ -251,6 +271,26 @@
<binding destination="1689" name="fontSize" keyPath="values.fontSize" id="1925"/>
</connections>
</tableColumn>
<tableColumn identifier="filename" editable="NO" width="64" minWidth="32" maxWidth="1024" hidden="YES" id="3A3-9o-Gh9" userLabel="Codec">
<tableHeaderCell key="headerCell" lineBreakMode="truncatingTail" borderStyle="border" alignment="left" title="Filename">
<color key="textColor" name="headerTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="headerColor" catalog="System" colorSpace="catalog"/>
</tableHeaderCell>
<textFieldCell key="dataCell" lineBreakMode="truncatingTail" selectable="YES" editable="YES" alignment="left" title="Text Cell" id="lBy-Uc-vCA">
<font key="font" metaFont="system"/>
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlBackgroundColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<tableColumnResizingMask key="resizingMask" resizeWithTable="YES" userResizable="YES"/>
<connections>
<binding destination="1689" name="fontSize" keyPath="values.fontSize" id="VQf-MC-VR1"/>
<binding destination="218" name="value" keyPath="arrangedObjects.codec" id="hO0-YW-E7w">
<dictionary key="options">
<bool key="NSConditionallySetsEditable" value="YES"/>
</dictionary>
</binding>
</connections>
</tableColumn>
</tableColumns>
<connections>
<binding destination="1689" name="rowHeight" keyPath="values.fontSize" id="1927">
@ -278,7 +318,7 @@
<autoresizingMask key="autoresizingMask"/>
</scroller>
<tableHeaderView key="headerView" wantsLayer="YES" id="1517" customClass="PlaylistHeaderView">
<rect key="frame" x="0.0" y="0.0" width="1000" height="17"/>
<rect key="frame" x="0.0" y="0.0" width="1086" height="17"/>
<autoresizingMask key="autoresizingMask"/>
</tableHeaderView>
</scrollView>
@ -562,7 +602,7 @@
<outlet property="initialFirstResponder" destination="207" id="720"/>
<outlet property="playlistView" destination="206" id="mah-wo-1nd"/>
</connections>
<point key="canvasLocation" x="130.5" y="131"/>
<point key="canvasLocation" x="130" y="131"/>
</window>
<window title="Cog" separatorStyle="none" allowsToolTipsWhenApplicationIsInactive="NO" releasedWhenClosed="NO" visibleAtLaunch="NO" frameAutosaveName="Mini Window" animationBehavior="default" toolbarStyle="unified" id="2234" userLabel="Mini Window (Window)" customClass="MiniWindow">
<windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES" resizable="YES"/>
@ -1755,6 +1795,7 @@ Gw
<menuItem title="Track" state="on" keyEquivalent="R" id="1343"/>
<menuItem title="Year" state="on" keyEquivalent="Y" id="1344"/>
</items>
<point key="canvasLocation" x="-166" y="-282"/>
</menu>
<customView id="1611" userLabel="Volume View">
<rect key="frame" x="0.0" y="0.0" width="32" height="168"/>

View File

@ -7,7 +7,6 @@
objects = {
/* Begin PBXBuildFile section */
174C7A370F4FD43100E18B0F /* libz.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 174C7A360F4FD43100E18B0F /* libz.dylib */; };
32AE5A5A14E70ED600420CA0 /* config.h in Headers */ = {isa = PBXBuildFile; fileRef = 32AE59A014E70ED600420CA0 /* config.h */; settings = {ATTRIBUTES = (Public, ); }; };
32AE5A5C14E70ED600420CA0 /* apefile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 32AE59A414E70ED600420CA0 /* apefile.cpp */; };
32AE5A5D14E70ED600420CA0 /* apefile.h in Headers */ = {isa = PBXBuildFile; fileRef = 32AE59A514E70ED600420CA0 /* apefile.h */; settings = {ATTRIBUTES = (Public, ); }; };
@ -149,12 +148,13 @@
32AE5AFF14E70ED700420CA0 /* taglib_config.h in Headers */ = {isa = PBXBuildFile; fileRef = 32AE5A5914E70ED600420CA0 /* taglib_config.h */; settings = {ATTRIBUTES = (Public, ); }; };
32AE5B0014E70F4700420CA0 /* tlist.tcc in Headers */ = {isa = PBXBuildFile; fileRef = 32AE5A4614E70ED600420CA0 /* tlist.tcc */; settings = {ATTRIBUTES = (Public, ); }; };
32AE5B0114E70F4A00420CA0 /* tmap.tcc in Headers */ = {isa = PBXBuildFile; fileRef = 32AE5A4814E70ED600420CA0 /* tmap.tcc */; settings = {ATTRIBUTES = (Public, ); }; };
4872B8881A675CCB00674347 /* libiconv.dylib in Frameworks */ = {isa = PBXBuildFile; fileRef = 4872B8871A675CCB00674347 /* libiconv.dylib */; };
83790D241809E8CA0073CF51 /* opusfile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 83790D201809E8CA0073CF51 /* opusfile.cpp */; };
83790D261809E8CA0073CF51 /* opusproperties.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 83790D221809E8CA0073CF51 /* opusproperties.cpp */; };
83942C67269116530058BD3B /* flacfile.h in Headers */ = {isa = PBXBuildFile; fileRef = 32AE59BF14E70ED600420CA0 /* flacfile.h */; settings = {ATTRIBUTES = (Public, ); }; };
83AF2CBE2622643300538240 /* apegenfile.cpp in Sources */ = {isa = PBXBuildFile; fileRef = 83AF2CBC2622643300538240 /* apegenfile.cpp */; };
83AF2CBF2622643300538240 /* apegenfile.h in Headers */ = {isa = PBXBuildFile; fileRef = 83AF2CBD2622643300538240 /* apegenfile.h */; };
83B46FCA2707EED200847FC9 /* libiconv.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 83B46FC92707EED200847FC9 /* libiconv.tbd */; };
83B46FCC2707EEDB00847FC9 /* libz.tbd in Frameworks */ = {isa = PBXBuildFile; fileRef = 83B46FCB2707EEDB00847FC9 /* libz.tbd */; };
8DC2EF530486A6940098B216 /* InfoPlist.strings in Resources */ = {isa = PBXBuildFile; fileRef = 089C1666FE841158C02AAC07 /* InfoPlist.strings */; };
EDE862FD25CF6BD70086EFD3 /* tpropertymap.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EDE862FC25CF6BD60086EFD3 /* tpropertymap.cpp */; };
EDE8630225CF6C260086EFD3 /* tfilestream.cpp in Sources */ = {isa = PBXBuildFile; fileRef = EDE8630025CF6C260086EFD3 /* tfilestream.cpp */; };
@ -358,7 +358,6 @@
32AE5A5714E70ED600420CA0 /* wavpackproperties.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = wavpackproperties.cpp; sourceTree = "<group>"; };
32AE5A5814E70ED600420CA0 /* wavpackproperties.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = wavpackproperties.h; sourceTree = "<group>"; };
32AE5A5914E70ED600420CA0 /* taglib_config.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; name = taglib_config.h; path = taglib/taglib_config.h; sourceTree = "<group>"; };
4872B8871A675CCB00674347 /* libiconv.dylib */ = {isa = PBXFileReference; lastKnownFileType = "compiled.mach-o.dylib"; name = libiconv.dylib; path = usr/lib/libiconv.dylib; sourceTree = SDKROOT; };
833F683D1CDBCAB300AFB9F0 /* es */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = es; path = es.lproj/InfoPlist.strings; sourceTree = "<group>"; };
835C889822CC1889001B4B3F /* en */ = {isa = PBXFileReference; lastKnownFileType = text.plist.strings; name = en; path = en.lproj/InfoPlist.strings; sourceTree = "<group>"; };
83790D201809E8CA0073CF51 /* opusfile.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = opusfile.cpp; sourceTree = "<group>"; };
@ -367,6 +366,8 @@
83790D231809E8CA0073CF51 /* opusproperties.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = opusproperties.h; sourceTree = "<group>"; };
83AF2CBC2622643300538240 /* apegenfile.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = apegenfile.cpp; sourceTree = "<group>"; };
83AF2CBD2622643300538240 /* apegenfile.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = apegenfile.h; sourceTree = "<group>"; };
83B46FC92707EED200847FC9 /* libiconv.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libiconv.tbd; path = usr/lib/libiconv.tbd; sourceTree = SDKROOT; };
83B46FCB2707EEDB00847FC9 /* libz.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libz.tbd; path = usr/lib/libz.tbd; sourceTree = SDKROOT; };
8DC2EF5A0486A6940098B216 /* Info.plist */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist; path = Info.plist; sourceTree = "<group>"; };
8DC2EF5B0486A6940098B216 /* TagLib.framework */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; path = TagLib.framework; sourceTree = BUILT_PRODUCTS_DIR; };
EDE862FC25CF6BD60086EFD3 /* tpropertymap.cpp */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.cpp.cpp; path = tpropertymap.cpp; sourceTree = "<group>"; };
@ -488,8 +489,8 @@
isa = PBXFrameworksBuildPhase;
buildActionMask = 2147483647;
files = (
4872B8881A675CCB00674347 /* libiconv.dylib in Frameworks */,
174C7A370F4FD43100E18B0F /* libz.dylib in Frameworks */,
83B46FCA2707EED200847FC9 /* libiconv.tbd in Frameworks */,
83B46FCC2707EEDB00847FC9 /* libz.tbd in Frameworks */,
);
runOnlyForDeploymentPostprocessing = 0;
};
@ -507,11 +508,11 @@
0867D691FE84028FC02AAC07 /* TagLib */ = {
isa = PBXGroup;
children = (
4872B8871A675CCB00674347 /* libiconv.dylib */,
8E75700C09F318D70080F1EE /* Source */,
089C1665FE841158C02AAC07 /* Resources */,
0867D69AFE84028FC02AAC07 /* External Frameworks and Libraries */,
034768DFFF38A50411DB9C8B /* Products */,
83B46FC82707EED200847FC9 /* Frameworks */,
);
name = TagLib;
sourceTree = "<group>";
@ -897,6 +898,15 @@
path = opus;
sourceTree = "<group>";
};
83B46FC82707EED200847FC9 /* Frameworks */ = {
isa = PBXGroup;
children = (
83B46FCB2707EEDB00847FC9 /* libz.tbd */,
83B46FC92707EED200847FC9 /* libiconv.tbd */,
);
name = Frameworks;
sourceTree = "<group>";
};
8E75700C09F318D70080F1EE /* Source */ = {
isa = PBXGroup;
children = (

View File

@ -123,6 +123,15 @@ String APE::Tag::title() const
return d->itemListMap["TITLE"].values().toString();
}
String APE::Tag::albumartist() const
{
if(!d->itemListMap["ALBUMARTIST"].isEmpty())
return d->itemListMap["ALBUMARTIST"].values().toString();
if(!d->itemListMap["ALBUM ARTIST"].isEmpty())
return d->itemListMap["ALBUM ARTIST"].values().toString();
return String();
}
String APE::Tag::artist() const
{
if(d->itemListMap["ARTIST"].isEmpty())
@ -198,6 +207,11 @@ void APE::Tag::setTitle(const String &s)
addValue("TITLE", s, true);
}
void APE::Tag::setAlbumArtist(const String &s)
{
addValue("ALBUMARTIST", s, true);
}
void APE::Tag::setArtist(const String &s)
{
addValue("ARTIST", s, true);

View File

@ -88,6 +88,7 @@ namespace TagLib {
// Reimplementations.
virtual String title() const;
virtual String albumartist() const;
virtual String artist() const;
virtual String album() const;
virtual String comment() const;
@ -100,6 +101,7 @@ namespace TagLib {
virtual float rgTrackPeak() const;
virtual void setTitle(const String &s);
virtual void setAlbumArtist(const String &s);
virtual void setArtist(const String &s);
virtual void setAlbum(const String &s);
virtual void setComment(const String &s);

View File

@ -55,6 +55,11 @@ String ASF::Tag::title() const
return d->title;
}
String ASF::Tag::albumartist() const
{
return String();
}
String ASF::Tag::artist() const
{
return d->artist;
@ -135,6 +140,10 @@ void ASF::Tag::setTitle(const String &value)
d->title = value;
}
void ASF::Tag::setAlbumArtist(const String &)
{
}
void ASF::Tag::setArtist(const String &value)
{
d->artist = value;

View File

@ -54,6 +54,11 @@ namespace TagLib {
*/
virtual String title() const;
/*!
* Returns the album artist name.
*/
virtual String albumartist() const;
/*!
* Returns the artist name.
*/
@ -108,6 +113,11 @@ namespace TagLib {
*/
virtual void setTitle(const String &s);
/*!
* Sets the artist to \a s.
*/
virtual void setAlbumArtist(const String &s);
/*!
* Sets the artist to \a s.
*/

View File

@ -59,6 +59,11 @@ String Mod::Tag::title() const
return d->title;
}
String Mod::Tag::albumartist() const
{
return String();
}
String Mod::Tag::artist() const
{
return String();
@ -119,6 +124,10 @@ void Mod::Tag::setTitle(const String &title)
d->title = title;
}
void Mod::Tag::setAlbumArtist(const String &)
{
}
void Mod::Tag::setArtist(const String &)
{
}

View File

@ -56,6 +56,12 @@ namespace TagLib {
*/
virtual String title() const;
/*!
* Not supported by module files. Therefore always returns String::null.
*/
virtual String albumartist() const;
/*!
* Not supported by module files. Therefore always returns String::null.
*/
@ -127,6 +133,11 @@ namespace TagLib {
*/
virtual void setTitle(const String &title);
/*!
* Not supported by module files and therefore ignored.
*/
virtual void setAlbumArtist(const String &albumartist);
/*!
* Not supported by module files and therefore ignored.
*/

View File

@ -732,6 +732,14 @@ MP4::Tag::artist() const
return String();
}
String
MP4::Tag::albumartist() const
{
if(d->items.contains("aART"))
return d->items["aART"].toStringList().toString(", ");
return String();
}
String
MP4::Tag::album() const
{
@ -802,6 +810,12 @@ MP4::Tag::setTitle(const String &value)
setTextItem("\251nam", value);
}
void
MP4::Tag::setAlbumArtist(const String &value)
{
setTextItem("aART", value);
}
void
MP4::Tag::setArtist(const String &value)
{

View File

@ -54,6 +54,7 @@ namespace TagLib {
bool save();
virtual String title() const;
virtual String albumartist() const;
virtual String artist() const;
virtual String album() const;
virtual String comment() const;
@ -66,6 +67,7 @@ namespace TagLib {
float rgTrackPeak() const;
virtual void setTitle(const String &value);
virtual void setAlbumArtist(const String &value);
virtual void setArtist(const String &value);
virtual void setAlbum(const String &value);
virtual void setComment(const String &value);

View File

@ -132,6 +132,11 @@ String ID3v1::Tag::title() const
return d->title;
}
String ID3v1::Tag::albumartist() const
{
return String();
}
String ID3v1::Tag::artist() const
{
return d->artist;
@ -187,6 +192,10 @@ void ID3v1::Tag::setTitle(const String &s)
d->title = s;
}
void ID3v1::Tag::setAlbumArtist(const String &)
{
}
void ID3v1::Tag::setArtist(const String &s)
{
d->artist = s;

View File

@ -136,6 +136,7 @@ namespace TagLib {
// Reimplementations.
virtual String title() const;
virtual String albumartist() const;
virtual String artist() const;
virtual String album() const;
virtual String comment() const;
@ -148,6 +149,7 @@ namespace TagLib {
virtual float rgTrackPeak() const;
virtual void setTitle(const String &s);
virtual void setAlbumArtist(const String &s);
virtual void setArtist(const String &s);
virtual void setAlbum(const String &s);
virtual void setComment(const String &s);

View File

@ -156,6 +156,13 @@ String ID3v2::Tag::artist() const
return String();
}
String ID3v2::Tag::albumartist() const
{
if(!d->frameListMap["TPE2"].isEmpty())
return d->frameListMap["TPE2"].front()->toString();
return String();
}
String ID3v2::Tag::album() const
{
if(!d->frameListMap["TALB"].isEmpty())
@ -282,6 +289,11 @@ void ID3v2::Tag::setArtist(const String &s)
setTextFrame("TPE1", s);
}
void ID3v2::Tag::setAlbumArtist(const String &s)
{
setTextFrame("TPE2", s);
}
void ID3v2::Tag::setAlbum(const String &s)
{
setTextFrame("TALB", s);

View File

@ -157,6 +157,7 @@ namespace TagLib {
// Reimplementations.
virtual String title() const;
virtual String albumartist() const;
virtual String artist() const;
virtual String album() const;
virtual String comment() const;
@ -171,6 +172,7 @@ namespace TagLib {
virtual float rgTrackPeak() const;
virtual void setTitle(const String &s);
virtual void setAlbumArtist(const String &s);
virtual void setArtist(const String &s);
virtual void setAlbum(const String &s);
virtual void setComment(const String &s);

View File

@ -85,6 +85,15 @@ String Ogg::XiphComment::title() const
return d->fieldListMap["TITLE"].toString();
}
String Ogg::XiphComment::albumartist() const
{
if(!d->fieldListMap["ALBUMARTIST"].isEmpty())
return d->fieldListMap["ALBUMARTIST"].toString();
if(!d->fieldListMap["ALBUM ARTIST"].isEmpty())
return d->fieldListMap["ALBUM ARTIST"].toString();
return String();
}
String Ogg::XiphComment::artist() const
{
if(d->fieldListMap["ARTIST"].isEmpty())
@ -172,6 +181,11 @@ void Ogg::XiphComment::setTitle(const String &s)
addField("TITLE", s);
}
void Ogg::XiphComment::setAlbumArtist(const String &s)
{
addField("ALBUMARTIST", s);
}
void Ogg::XiphComment::setArtist(const String &s)
{
addField("ARTIST", s);

View File

@ -81,6 +81,7 @@ namespace TagLib {
virtual ~XiphComment();
virtual String title() const;
virtual String albumartist() const;
virtual String artist() const;
virtual String album() const;
virtual String comment() const;
@ -93,6 +94,7 @@ namespace TagLib {
virtual float rgTrackPeak() const;
virtual void setTitle(const String &s);
virtual void setAlbumArtist(const String &s);
virtual void setArtist(const String &s);
virtual void setAlbum(const String &s);
virtual void setComment(const String &s);

View File

@ -93,6 +93,11 @@ String RIFF::Info::Tag::title() const
return fieldText("INAM");
}
String RIFF::Info::Tag::albumartist() const
{
return String();
}
String RIFF::Info::Tag::artist() const
{
return fieldText("IART");
@ -148,6 +153,10 @@ void RIFF::Info::Tag::setTitle(const String &s)
setFieldText("INAM", s);
}
void RIFF::Info::Tag::setAlbumArtist(const String &)
{
}
void RIFF::Info::Tag::setArtist(const String &s)
{
setFieldText("IART", s);

View File

@ -103,6 +103,7 @@ namespace TagLib {
// Reimplementations
virtual String title() const;
virtual String albumartist() const;
virtual String artist() const;
virtual String album() const;
virtual String comment() const;
@ -115,6 +116,7 @@ namespace TagLib {
virtual float rgTrackPeak() const;
virtual void setTitle(const String &s);
virtual void setAlbumArtist(const String &s);
virtual void setArtist(const String &s);
virtual void setAlbum(const String &s);
virtual void setComment(const String &s);

View File

@ -47,6 +47,7 @@ Tag::~Tag()
bool Tag::isEmpty() const
{
return (title().isEmpty() &&
albumartist().isEmpty() &&
artist().isEmpty() &&
album().isEmpty() &&
comment().isEmpty() &&
@ -60,6 +61,8 @@ PropertyMap Tag::properties() const
PropertyMap map;
if(!(title().isEmpty()))
map["TITLE"].append(title());
if(!(albumartist().isEmpty()))
map["ALBUMARTIST"].append(albumartist());
if(!(artist().isEmpty()))
map["ARTIST"].append(artist());
if(!(album().isEmpty()))
@ -91,6 +94,16 @@ PropertyMap Tag::setProperties(const PropertyMap &origProps)
} else
setTitle(String());
if(properties.contains("ALBUMARTIST") ||
properties.contains("ALBUM ARTIST")) {
if (properties.contains("ALBUMARTIST"))
setAlbumArtist(properties["ALBUMARTIST"].front());
else
setAlbumArtist(properties["ALBUM ARTIST"].front());
oneValueSet.append("ALBUMARTIST");
} else
setAlbumArtist(String());
if(properties.contains("ARTIST")) {
setArtist(properties["ARTIST"].front());
oneValueSet.append("ARTIST");
@ -154,6 +167,7 @@ void Tag::duplicate(const Tag *source, Tag *target, bool overwrite) // static
{
if(overwrite) {
target->setTitle(source->title());
target->setAlbumArtist(source->albumartist());
target->setArtist(source->artist());
target->setAlbum(source->album());
target->setComment(source->comment());
@ -164,6 +178,8 @@ void Tag::duplicate(const Tag *source, Tag *target, bool overwrite) // static
else {
if(target->title().isEmpty())
target->setTitle(source->title());
if(target->albumartist().isEmpty())
target->setAlbumArtist(source->albumartist());
if(target->artist().isEmpty())
target->setArtist(source->artist());
if(target->album().isEmpty())

View File

@ -84,6 +84,12 @@ namespace TagLib {
*/
virtual String title() const = 0;
/*!
* Returns the album artist name; if no artist name is present in the tag
* String::null will be returned.
*/
virtual String albumartist() const = 0;
/*!
* Returns the artist name; if no artist name is present in the tag
* String::null will be returned.
@ -149,6 +155,12 @@ namespace TagLib {
*/
virtual void setTitle(const String &s) = 0;
/*!
* Sets the album artist to \a s. If \a s is String::null then this value will be
* cleared.
*/
virtual void setAlbumArtist(const String &s) = 0;
/*!
* Sets the artist to \a s. If \a s is String::null then this value will be
* cleared.

View File

@ -178,6 +178,11 @@ String TagUnion::title() const
stringUnion(title);
}
String TagUnion::albumartist() const
{
stringUnion(albumartist);
}
String TagUnion::artist() const
{
stringUnion(artist);
@ -233,6 +238,11 @@ void TagUnion::setTitle(const String &s)
setUnion(Title, s);
}
void TagUnion::setAlbumArtist(const String &s)
{
setUnion(AlbumArtist, s);
}
void TagUnion::setArtist(const String &s)
{
setUnion(Artist, s);

View File

@ -60,6 +60,7 @@ namespace TagLib {
void removeUnsupportedProperties(const StringList &unsupported);
virtual String title() const;
virtual String albumartist() const;
virtual String artist() const;
virtual String album() const;
virtual String comment() const;
@ -72,6 +73,7 @@ namespace TagLib {
virtual float rgTrackPeak() const;
virtual void setTitle(const String &s);
virtual void setAlbumArtist(const String &s);
virtual void setArtist(const String &s);
virtual void setAlbum(const String &s);
virtual void setComment(const String &s);

View File

@ -26,6 +26,7 @@
NSURL *URL;
NSString *artist;
NSString *albumartist;
NSString *album;
NSString *title;
NSString *genre;
@ -50,6 +51,8 @@
BOOL Unsigned;
float sampleRate;
NSString *codec;
NSString *endian;
BOOL seekable;
@ -97,6 +100,7 @@
@property(retain) NSURL *URL;
@property(retain) NSString *artist;
@property(retain) NSString *albumartist;
@property(retain) NSString *album;
@property(nonatomic, retain) NSString *title;
@property(retain) NSString *genre;
@ -114,6 +118,8 @@
@property BOOL Unsigned;
@property float sampleRate;
@property(retain) NSString *codec;
@property float replayGainAlbumGain;
@property float replayGainAlbumPeak;
@property float replayGainTrackGain;

View File

@ -28,6 +28,7 @@
@synthesize URL;
@synthesize artist;
@synthesize albumartist;
@synthesize album;
@synthesize genre;
@synthesize year;
@ -41,6 +42,8 @@
@synthesize Unsigned;
@synthesize sampleRate;
@synthesize codec;
@synthesize replayGainAlbumGain;
@synthesize replayGainAlbumPeak;
@synthesize replayGainTrackGain;
@ -89,7 +92,7 @@
+ (NSSet *)keyPathsForValuesAffectingSpam
{
return [NSSet setWithObjects:@"artist", @"title", @"album", @"track", @"totalFrames", @"currentPosition", @"bitrate", nil];
return [NSSet setWithObjects:@"albumartist", @"artist", @"title", @"album", @"track", @"totalFrames", @"currentPosition", @"bitrate", nil];
}
+ (NSSet *)keyPathsForValuesAffectingPositionText
@ -131,6 +134,7 @@
self.URL = nil;
self.artist = nil;
self.albumartist = nil;
self.album = nil;
self.title = nil;
self.genre = nil;
@ -139,6 +143,7 @@
self.albumArtInternal = nil;
self.endian = nil;
self.codec = nil;
}
// Get the URL if the title is blank
@ -167,12 +172,14 @@
{
BOOL hasBitrate = (self.bitrate != 0);
BOOL hasArtist = (self.artist != nil) && (![self.artist isEqualToString:@""]);
BOOL hasAlbumArtist = (self.albumartist != nil) && (![self.albumartist isEqualToString:@""]);
BOOL hasAlbum = (self.album != nil) && (![self.album isEqualToString:@""]);
BOOL hasTrack = (self.track != 0);
BOOL hasLength = (self.totalFrames != 0);
BOOL hasCurrentPosition = (self.currentPosition != 0) && (self.current);
BOOL hasExtension = NO;
BOOL hasTitle = (title != nil) && (![title isEqualToString:@""]);
BOOL hasCodec = (self.codec != nil) && (![self.codec isEqualToString:@""]);
NSMutableString * filename = [NSMutableString stringWithString:[self filename]];
NSRange dotPosition = [filename rangeOfString:@"." options:NSBackwardsSearch];
@ -192,7 +199,12 @@
if (hasExtension) {
[elements addObject:@"["];
[elements addObject:[extension uppercaseString]];
if (hasCodec) {
[elements addObject:self.codec];
}
else {
[elements addObject:[extension uppercaseString]];
}
if (hasBitrate) {
[elements addObject:@"@"];
[elements addObject:[NSString stringWithFormat:@"%u", self.bitrate]];
@ -202,7 +214,12 @@
}
if (hasArtist) {
[elements addObject:self.artist];
if (hasAlbumArtist) {
[elements addObject:self.albumartist];
}
else {
[elements addObject:self.artist];
}
[elements addObject:@" - "];
}
@ -223,6 +240,11 @@
[elements addObject:filename];
}
if (hasAlbumArtist && hasArtist) {
[elements addObject:@" // "];
[elements addObject:self.artist];
}
if (hasCurrentPosition || hasLength) {
SecondsFormatter *secondsFormatter = [[SecondsFormatter alloc] init];
[elements addObject:@" ("];

View File

@ -74,6 +74,7 @@
[NSNumber numberWithBool:NO], @"floatingPoint",
[NSNumber numberWithInt:2], @"channels", //output from gme_play is in stereo
[NSNumber numberWithBool:YES], @"seekable",
[NSString stringWithUTF8String:m_player->gettype().c_str()], @"codec",
@"host", @"endian",
nil];
}

View File

@ -479,6 +479,7 @@ int lockmgr_callback(void ** mutex, enum AVLockOp op)
[NSNumber numberWithDouble:totalFrames], @"totalFrames",
[NSNumber numberWithInt:bitrate], @"bitrate",
[NSNumber numberWithBool:seekable], @"seekable",
[NSString stringWithUTF8String:avcodec_get_name(codecCtx->codec_id)], @"codec",
@"host", @"endian",
nil];
}

View File

@ -317,6 +317,7 @@ void ErrorCallback(const FLAC__StreamDecoder *decoder, FLAC__StreamDecoderErrorS
[NSNumber numberWithFloat:frequency],@"sampleRate",
[NSNumber numberWithDouble:totalFrames],@"totalFrames",
[NSNumber numberWithBool:[source seekable]], @"seekable",
@"FLAC",@"codec",
@"big",@"endian",
nil];
}

View File

@ -19,6 +19,7 @@ extern gme_err_t readCallback( void* data, void* out, long count );
id<CogSource> source;
long length;
long fade;
NSString* codec;
}
- (void)setSource:(id<CogSource>)s;

View File

@ -261,6 +261,10 @@ static int psf_info_meta(void * context, const char * name, const char * value)
{
taglc = @"year";
}
else if ([taglc isEqualToString:@"album artist"])
{
taglc = @"albumartist";
}
if ([taglc hasPrefix:@"replaygain_"])
{
@ -296,6 +300,7 @@ static int psf_info_meta(void * context, const char * name, const char * value)
state->utf8 = true;
}
else if ([taglc isEqualToString:@"title"] ||
[taglc isEqualToString:@"albumartist"] ||
[taglc isEqualToString:@"artist"] ||
[taglc isEqualToString:@"album"] ||
[taglc isEqualToString:@"year"] ||
@ -1686,6 +1691,19 @@ static int usf_info(void * context, const char * name, const char * value)
- (NSDictionary *)properties
{
NSString* codec = nil;
switch (type) {
case 1: codec = @"PSF"; break;
case 2: codec = @"PSF2"; break;
case 0x11: codec = @"SSF"; break;
case 0x12: codec = @"DSF"; break;
case 0x21: codec = @"USF"; break;
case 0x22: codec = @"GSF"; break;
case 0x24: codec = @"2SF"; break;
case 0x25: codec = @"NCSF"; break;
case 0x41: codec = @"QSF"; break;
}
return [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithInt:2], @"channels",
[NSNumber numberWithInt:16], @"bitsPerSample",
@ -1698,6 +1716,7 @@ static int usf_info(void * context, const char * name, const char * value)
[NSNumber numberWithFloat:replayGainTrackGain], @"replayGainTrackGain",
[NSNumber numberWithFloat:replayGainTrackPeak], @"replayGainTrackPeak",
[NSNumber numberWithFloat:volume], @"volume",
codec, @"codec",
@"host", @"endian",
nil];
}

View File

@ -114,6 +114,7 @@ static OSType getOSType(const char * in_)
[NSNumber numberWithBool:YES], @"floatingPoint",
[NSNumber numberWithInt:2], @"channels", //output from gme_play is in stereo
[NSNumber numberWithBool:YES], @"seekable",
@"MIDI", @"codec",
@"host", @"endian",
nil];
}

View File

@ -211,6 +211,7 @@ mpc_bool_t CanSeekProc(mpc_reader *p_reader)
[NSNumber numberWithBool:YES], @"floatingPoint",
[NSNumber numberWithInt:2], @"channels",
[NSNumber numberWithBool:[source seekable]], @"seekable",
@"Musepack", @"codec",
@"host",@"endian",
nil];
}

View File

@ -144,6 +144,7 @@ opus_int64 sourceTell(void *_stream)
[NSNumber numberWithDouble:totalFrames], @"totalFrames",
[NSNumber numberWithInt:bitrate], @"bitrate",
[NSNumber numberWithBool:([source seekable] && seekable)], @"seekable",
@"Opus", @"codec",
@"host", @"endian",
nil];
}

View File

@ -93,6 +93,7 @@
[NSNumber numberWithFloat:frequency],@"sampleRate",
[NSNumber numberWithDouble:totalFrames],@"totalFrames",
[NSNumber numberWithBool:seekable ],@"seekable",
@"Shorten",@"codec",
@"little",@"endian",
nil];
}

View File

@ -137,6 +137,7 @@ BOOL probe_length( Song * synSong, unsigned long * intro_length, unsigned long *
[NSNumber numberWithBool:NO], @"floatingPoint",
[NSNumber numberWithInt:2], @"channels",
[NSNumber numberWithBool:YES], @"seekable",
@"Syntrax", @"codec",
@"host", @"endian",
nil];
}

View File

@ -71,11 +71,12 @@
if (tag)
{
TagLib::String artist, title, album, genre, comment;
TagLib::String artist, albumartist, title, album, genre, comment;
int year, track;
float rgAlbumGain, rgAlbumPeak, rgTrackGain, rgTrackPeak;
artist = tag->artist();
albumartist = tag->albumartist();
title = tag->title();;
album = tag->album();
genre = tag->genre();
@ -98,6 +99,9 @@
if (!artist.isEmpty())
[dict setObject:[NSString stringWithUTF8String:artist.toCString(true)] forKey:@"artist"];
if (!albumartist.isEmpty())
[dict setObject:[NSString stringWithUTF8String:albumartist.toCString(true)] forKey:@"albumartist"];
if (!album.isEmpty())
[dict setObject:[NSString stringWithUTF8String:album.toCString(true)] forKey:@"album"];

View File

@ -138,6 +138,7 @@ long sourceTell(void *datasource)
[NSNumber numberWithDouble:totalFrames], @"totalFrames",
[NSNumber numberWithInt:bitrate], @"bitrate",
[NSNumber numberWithBool:([source seekable] && seekable)], @"seekable",
@"Vorbis", @"codec",
@"host", @"endian",
nil];
}

View File

@ -290,6 +290,7 @@ int32_t WriteBytesProc(void *ds, void *data, int32_t bcount)
[NSNumber numberWithBool:floatingPoint],@"floatingPoint",
[NSNumber numberWithDouble:totalFrames],@"totalFrames",
[NSNumber numberWithBool:[[wv source] seekable]], @"seekable",
@"Wavpack",@"codec",
@"little",@"endian",
nil];
}

View File

@ -11,6 +11,21 @@
#import "PlaylistController.h"
static NSString* get_description_tag(const char* description, const char *tag, char delimiter) {
// extract a "tag" from the description string
const char* pos = strstr(description, tag);
const char* eos = NULL;
if (pos != NULL) {
pos += strlen(tag);
eos = strchr(pos, delimiter);
if (eos == NULL) eos = pos + strlen(pos);
NSMutableData* data = [NSData dataWithBytes:pos length:(eos - pos + 1)];
((char *)[data mutableBytes])[eos - pos] = '\0';
return [NSString stringWithUTF8String:[data bytes]];
}
return nil;
}
@implementation VGMInfoCache
+(id)sharedCache {
@ -48,6 +63,9 @@
long totalFrames = vgmstream_get_samples(stream);
int bitrate = get_vgmstream_average_bitrate(stream);
char description[1024];
describe_vgmstream(stream, description, 1024);
NSString * path = [url absoluteString];
NSRange fragmentRange = [path rangeOfString:@"#" options:NSBackwardsSearch];
@ -67,12 +85,16 @@
NSNumber *year = [NSNumber numberWithInt:0];
NSNumber *track = [NSNumber numberWithInt:0];
NSString *title = @"";
NSString *codec;
NSNumber *rgTrackGain = [NSNumber numberWithInt:0];
NSNumber *rgTrackPeak = [NSNumber numberWithInt:0];
NSNumber *rgAlbumGain = [NSNumber numberWithInt:0];
NSNumber *rgAlbumPeak = [NSNumber numberWithInt:0];
codec = get_description_tag(description, "encoding: ", 0);
STREAMFILE *tagFile = cogsf_create_from_url(tagurl);
if (tagFile) {
VGMSTREAM_TAGS *tags;
@ -134,6 +156,7 @@
rgAlbumPeak, @"replayGainAlbumPeak",
rgTrackGain, @"replayGainTrackGain",
rgTrackPeak, @"replayGainTrackPeak",
codec, @"codec",
@"host", @"endian",
nil];

View File

@ -73,3 +73,9 @@
/* Class = "NSTextFieldCell"; title = "N/A"; ObjectID = "87"; */
"87.title" = "N/A";
/* Class = "NSTextFieldCell"; title = "Album Artist:"; ObjectID = "vB6-9J-5qg"; */
"vB6-9J-5qg.title" = "Album Artist:";
/* Class = "NSTextFieldCell"; title = "Codec:"; ObjectID = "QPg-Mb-Urn"; */
"QPg-Mb-Urn.title" = "Codec:";

View File

@ -625,3 +625,9 @@
/* Class = "NSMenuItem"; title = "Properties"; ObjectID = "Eds-my-DQr"; */
"Eds-my-DQr.title" = "Properties";
/* Class = "NSTableColumn"; title = "Album Artist"; ObjectID = "yGV-gP-Wl6"; */
"yGV-gP-Wl6.title" = "Album Artist";
/* Class = "NSTableColumn"; title = "Codec"; ObjectID = "3A3-9o-Gh9"; */
"3A3-9o-Gh9.title" = "Codec";

View File

@ -73,3 +73,9 @@
/* Class = "NSTextFieldCell"; title = "N/A"; ObjectID = "87"; */
"87.title" = "N/A";
/* Class = "NSTextFieldCell"; title = "Album Artist:"; ObjectID = "vB6-9J-5qg"; */
"vB6-9J-5qg.title" = "Album Artist:";
/* Class = "NSTextFieldCell"; title = "Codec:"; ObjectID = "QPg-Mb-Urn"; */
"QPg-Mb-Urn.title" = "Codec:";

View File

@ -622,3 +622,9 @@
/* Class = "NSMenuItem"; title = "Properties"; ObjectID = "Eds-my-DQr"; */
"Eds-my-DQr.title" = "Properties";
/* Class = "NSTableColumn"; title = "Album Artist"; ObjectID = "yGV-gP-Wl6"; */
"yGV-gP-Wl6.title" = "Album Artist";
/* Class = "NSTableColumn"; title = "Codec"; ObjectID = "3A3-9o-Gh9"; */
"3A3-9o-Gh9.title" = "Codec";