0.7.11.5
This commit is contained in:
337
MainMenu.nib/designable.nib
generated
337
MainMenu.nib/designable.nib
generated
@@ -52,21 +52,20 @@
|
||||
</customObject>
|
||||
<window allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" visibleAtLaunch="NO" frameAutosaveName="ProgressBarWindow" animationBehavior="default" id="21" userLabel="ProgressWindow">
|
||||
<windowStyleMask key="styleMask" titled="YES" miniaturizable="YES" resizable="YES"/>
|
||||
<windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
|
||||
<rect key="contentRect" x="472" y="537" width="500" height="83"/>
|
||||
<rect key="contentRect" x="472" y="537" width="600" height="83"/>
|
||||
<rect key="screenRect" x="0.0" y="0.0" width="1440" height="878"/>
|
||||
<value key="minSize" type="size" width="500" height="83"/>
|
||||
<value key="minSize" type="size" width="600" height="83"/>
|
||||
<value key="maxSize" type="size" width="1200" height="83"/>
|
||||
<view key="contentView" id="2">
|
||||
<rect key="frame" x="0.0" y="0.0" width="500" height="83"/>
|
||||
<rect key="frame" x="0.0" y="0.0" width="600" height="83"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<subviews>
|
||||
<progressIndicator wantsLayer="YES" verticalHuggingPriority="750" maxValue="100" bezeled="NO" indeterminate="YES" style="bar" id="204">
|
||||
<rect key="frame" x="18" y="27" width="372" height="20"/>
|
||||
<rect key="frame" x="18" y="27" width="472" height="20"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
|
||||
</progressIndicator>
|
||||
<textField verticalHuggingPriority="750" allowsCharacterPickerTouchBarItem="YES" id="205">
|
||||
<rect key="frame" x="18" y="55" width="465" height="17"/>
|
||||
<rect key="frame" x="18" y="55" width="565" height="17"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
|
||||
<textFieldCell key="cell" lineBreakMode="clipping" sendsActionOnEndEditing="YES" baseWritingDirection="leftToRight" alignment="left" id="472">
|
||||
<font key="font" metaFont="system"/>
|
||||
@@ -75,7 +74,7 @@
|
||||
</textFieldCell>
|
||||
</textField>
|
||||
<button verticalHuggingPriority="750" id="206">
|
||||
<rect key="frame" x="400" y="20" width="86" height="32"/>
|
||||
<rect key="frame" x="500" y="20" width="86" height="32"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMinY="YES"/>
|
||||
<buttonCell key="cell" type="push" title="Quit" bezelStyle="rounded" alignment="center" borderStyle="border" inset="2" id="473">
|
||||
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
|
||||
@@ -109,25 +108,25 @@ Gw
|
||||
</textFieldCell>
|
||||
</textField>
|
||||
<scrollView autohidesScrollers="YES" horizontalLineScroll="10" horizontalPageScroll="10" verticalLineScroll="10" verticalPageScroll="10" hasHorizontalScroller="NO" usesPredominantAxisScrolling="NO" id="304">
|
||||
<rect key="frame" x="20" y="-203" width="455" height="202"/>
|
||||
<rect key="frame" x="20" y="-203" width="555" height="202"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
|
||||
<clipView key="contentView" copiesOnScroll="NO" id="2mm-QF-kpX">
|
||||
<rect key="frame" x="1" y="1" width="453" height="200"/>
|
||||
<clipView key="contentView" drawsBackground="NO" copiesOnScroll="NO" id="2mm-QF-kpX">
|
||||
<rect key="frame" x="1" y="1" width="553" height="200"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<textView editable="NO" importsGraphics="NO" richText="NO" verticallyResizable="YES" findStyle="panel" allowsDocumentBackgroundColorChange="YES" linkDetection="YES" id="307">
|
||||
<rect key="frame" x="0.0" y="0.0" width="453" height="200"/>
|
||||
<rect key="frame" x="0.0" y="0.0" width="553" height="200"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
<size key="minSize" width="453" height="200"/>
|
||||
<size key="maxSize" width="463" height="10000000"/>
|
||||
<color key="insertionPointColor" white="0.0" alpha="1" colorSpace="calibratedWhite"/>
|
||||
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||
<size key="minSize" width="553" height="200"/>
|
||||
<size key="maxSize" width="553" height="10000000"/>
|
||||
<color key="insertionPointColor" name="textColor" catalog="System" colorSpace="catalog"/>
|
||||
<connections>
|
||||
<outlet property="delegate" destination="207" id="489"/>
|
||||
</connections>
|
||||
</textView>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
</clipView>
|
||||
<scroller key="horizontalScroller" hidden="YES" verticalHuggingPriority="750" doubleValue="1" horizontal="YES" id="481">
|
||||
<rect key="frame" x="-100" y="-100" width="87" height="18"/>
|
||||
@@ -143,7 +142,7 @@ Gw
|
||||
<connections>
|
||||
<outlet property="delegate" destination="207" id="377"/>
|
||||
</connections>
|
||||
<point key="canvasLocation" x="67" y="301.5"/>
|
||||
<point key="canvasLocation" x="87" y="313"/>
|
||||
</window>
|
||||
<menu title="MainMenu" systemMenu="main" id="29" userLabel="MainMenu">
|
||||
<items>
|
||||
@@ -159,6 +158,18 @@ Gw
|
||||
<menuItem isSeparatorItem="YES" id="233">
|
||||
<modifierMask key="keyEquivalentModifierMask" command="YES"/>
|
||||
</menuItem>
|
||||
<menuItem title="Preferences..." id="reA-2d-BZ0">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<connections>
|
||||
<action selector="menuItemSelected:" target="207" id="x6l-Tq-pHp"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Check for updates..." id="jWa-5b-mBK" userLabel="Check for updates...">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<connections>
|
||||
<action selector="menuItemSelected:" target="207" id="VBb-a8-Cku"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Services" id="235">
|
||||
<menu key="submenu" title="Services" systemMenu="services" id="234"/>
|
||||
</menuItem>
|
||||
@@ -239,77 +250,218 @@ Gw
|
||||
</items>
|
||||
</menu>
|
||||
</menuItem>
|
||||
<menuItem title="Edit" id="163">
|
||||
<menu key="submenu" title="Edit" id="8AD-nO-Nv5">
|
||||
<menuItem title="Edit" id="OYz-zT-LAM">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<menu key="submenu" title="Edit" id="gbe-PM-Daj">
|
||||
<items>
|
||||
<menuItem title="Undo" keyEquivalent="z" id="WsN-Bo-RAi">
|
||||
<menuItem title="Undo" keyEquivalent="z" id="6BN-ih-O2m">
|
||||
<connections>
|
||||
<action selector="undo:" target="-1" id="swp-Rd-xai"/>
|
||||
<action selector="undo:" target="-1" id="oH0-3R-wus"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Redo" keyEquivalent="z" id="lwR-9k-Jds">
|
||||
<menuItem title="Redo" keyEquivalent="z" id="TgQ-5S-p2w">
|
||||
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
|
||||
<connections>
|
||||
<action selector="redo:" target="-1" id="t0d-JF-Jxf"/>
|
||||
<action selector="redo:" target="-1" id="bxh-7G-6rR"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem isSeparatorItem="YES" id="f7y-jW-w4a">
|
||||
<modifierMask key="keyEquivalentModifierMask" command="YES"/>
|
||||
</menuItem>
|
||||
<menuItem title="Cut" keyEquivalent="x" id="gYg-Fm-Vd0">
|
||||
<menuItem isSeparatorItem="YES" id="ktb-NS-TU3"/>
|
||||
<menuItem title="Cut" keyEquivalent="x" id="yLq-sd-YR5">
|
||||
<connections>
|
||||
<action selector="cut:" target="-1" id="uo1-1q-hcK"/>
|
||||
<action selector="cut:" target="-1" id="46i-iL-VLK"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Copy" keyEquivalent="c" id="gPx-QX-E5Y">
|
||||
<menuItem title="Copy" keyEquivalent="c" id="s3v-O1-6pA">
|
||||
<connections>
|
||||
<action selector="copy:" target="-1" id="dyg-Qh-MrF"/>
|
||||
<action selector="copy:" target="-1" id="jxG-ij-fh7"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Paste" keyEquivalent="v" id="Onj-KJ-eWD">
|
||||
<menuItem title="Paste" keyEquivalent="v" id="6Ld-ut-13f">
|
||||
<connections>
|
||||
<action selector="paste:" target="-1" id="ZQo-9c-pWs"/>
|
||||
<action selector="paste:" target="-1" id="PGw-sA-Gma"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Delete" id="NRV-Nu-dQo">
|
||||
<menuItem title="Paste and Match Style" keyEquivalent="V" id="GyB-HZ-4kH">
|
||||
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
|
||||
<connections>
|
||||
<action selector="delete:" target="-1" id="PJy-am-8nR"/>
|
||||
<action selector="pasteAsPlainText:" target="-1" id="AlS-iZ-R4l"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Select All" keyEquivalent="a" id="aZ7-KE-7Nh">
|
||||
<menuItem title="Delete" id="YkA-TP-1J9">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<connections>
|
||||
<action selector="selectAll:" target="-1" id="gnq-iF-2hE"/>
|
||||
<action selector="delete:" target="-1" id="cE3-5v-CP0"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem isSeparatorItem="YES" id="ckZ-kQ-yF7">
|
||||
<modifierMask key="keyEquivalentModifierMask" command="YES"/>
|
||||
<menuItem title="Select All" keyEquivalent="a" id="z4j-fk-SUb">
|
||||
<connections>
|
||||
<action selector="selectAll:" target="-1" id="eM9-h9-WVo"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Find" id="EgA-FB-eXQ">
|
||||
<menu key="submenu" title="Find" id="xIX-bE-bd8">
|
||||
<menuItem isSeparatorItem="YES" id="FXg-ZR-vZj"/>
|
||||
<menuItem title="Find" id="amO-Yt-228">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<menu key="submenu" title="Find" id="9XE-hK-Hbc">
|
||||
<items>
|
||||
<menuItem title="Find…" tag="1" keyEquivalent="f" id="3k0-IU-cL5">
|
||||
<menuItem title="Find…" tag="1" keyEquivalent="f" id="yA2-y8-dhZ">
|
||||
<connections>
|
||||
<action selector="performFindPanelAction:" target="-1" id="wAh-50-CiI"/>
|
||||
<action selector="performFindPanelAction:" target="-1" id="zqc-0l-nEk"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Find Next" tag="2" keyEquivalent="g" id="EAX-qd-XMX">
|
||||
<menuItem title="Find and Replace…" tag="12" keyEquivalent="f" id="ceF-be-hip">
|
||||
<modifierMask key="keyEquivalentModifierMask" option="YES" command="YES"/>
|
||||
<connections>
|
||||
<action selector="performFindPanelAction:" target="-1" id="LvO-Xz-du1"/>
|
||||
<action selector="performFindPanelAction:" target="-1" id="Fno-81-Q2N"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Find Previous" tag="3" keyEquivalent="G" id="n5T-AH-BNm">
|
||||
<menuItem title="Find Next" tag="2" keyEquivalent="g" id="6FX-CW-rwT">
|
||||
<connections>
|
||||
<action selector="performFindPanelAction:" target="-1" id="FgQ-Gb-Qnu"/>
|
||||
<action selector="performFindPanelAction:" target="-1" id="AeZ-8e-DSZ"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Use Selection for Find" tag="7" keyEquivalent="e" id="xKU-AA-Gj3">
|
||||
<menuItem title="Find Previous" tag="3" keyEquivalent="G" id="kIR-xV-7pl">
|
||||
<connections>
|
||||
<action selector="performFindPanelAction:" target="-1" id="j7C-hb-eo3"/>
|
||||
<action selector="performFindPanelAction:" target="-1" id="ALM-eS-1XU"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Jump to Selection" keyEquivalent="j" id="mpE-JG-s67">
|
||||
<menuItem title="Use Selection for Find" tag="7" keyEquivalent="e" id="yTY-2E-Cp9">
|
||||
<connections>
|
||||
<action selector="centerSelectionInVisibleArea:" target="-1" id="H4Z-6R-SO2"/>
|
||||
<action selector="performFindPanelAction:" target="-1" id="Gbj-g6-cYJ"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Jump to Selection" keyEquivalent="j" id="80n-rn-d7I">
|
||||
<connections>
|
||||
<action selector="centerSelectionInVisibleArea:" target="-1" id="qfH-cs-Cdv"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
</items>
|
||||
</menu>
|
||||
</menuItem>
|
||||
<menuItem title="Spelling and Grammar" id="uWG-xr-cNT">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<menu key="submenu" title="Spelling" id="Xoa-7u-7zM">
|
||||
<items>
|
||||
<menuItem title="Show Spelling and Grammar" keyEquivalent=":" id="rZl-3I-YFV">
|
||||
<connections>
|
||||
<action selector="showGuessPanel:" target="-1" id="CSh-4b-cGc"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Check Document Now" keyEquivalent=";" id="tjk-pc-YjK">
|
||||
<connections>
|
||||
<action selector="checkSpelling:" target="-1" id="O3S-v5-8Ra"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem isSeparatorItem="YES" id="ohv-rn-e7b"/>
|
||||
<menuItem title="Check Spelling While Typing" id="E3o-iC-0NO">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<connections>
|
||||
<action selector="toggleContinuousSpellChecking:" target="-1" id="k4Q-aZ-O6y"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Check Grammar With Spelling" id="mUP-Jd-Tu1">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<connections>
|
||||
<action selector="toggleGrammarChecking:" target="-1" id="Ypd-WC-IMS"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Correct Spelling Automatically" id="qq3-jk-TYN">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<connections>
|
||||
<action selector="toggleAutomaticSpellingCorrection:" target="-1" id="Ob8-wh-bLR"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
</items>
|
||||
</menu>
|
||||
</menuItem>
|
||||
<menuItem title="Substitutions" id="8Ti-fk-PNH">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<menu key="submenu" title="Substitutions" id="NeW-07-aln">
|
||||
<items>
|
||||
<menuItem title="Show Substitutions" id="DXm-9z-Sle">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<connections>
|
||||
<action selector="orderFrontSubstitutionsPanel:" target="-1" id="z43-IC-kpA"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem isSeparatorItem="YES" id="aVP-JA-dKq"/>
|
||||
<menuItem title="Smart Copy/Paste" id="Pcq-B9-JQ5">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<connections>
|
||||
<action selector="toggleSmartInsertDelete:" target="-1" id="iu4-Nn-DU4"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Smart Quotes" id="iDT-WP-ISR">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<connections>
|
||||
<action selector="toggleAutomaticQuoteSubstitution:" target="-1" id="pnI-ku-LV9"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Smart Dashes" id="QFc-JW-5qE">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<connections>
|
||||
<action selector="toggleAutomaticDashSubstitution:" target="-1" id="pY9-lv-EM7"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Smart Links" id="opP-BJ-vhR">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<connections>
|
||||
<action selector="toggleAutomaticLinkDetection:" target="-1" id="lfD-XD-tfO"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Data Detectors" id="zWu-P7-fpg">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<connections>
|
||||
<action selector="toggleAutomaticDataDetection:" target="-1" id="EAz-S6-L7B"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Text Replacement" id="2R8-fL-H32">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<connections>
|
||||
<action selector="toggleAutomaticTextReplacement:" target="-1" id="7Lb-Uz-uJ9"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
</items>
|
||||
</menu>
|
||||
</menuItem>
|
||||
<menuItem title="Transformations" id="v1A-Fi-A5j">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<menu key="submenu" title="Transformations" id="B0B-bK-IZ3">
|
||||
<items>
|
||||
<menuItem title="Make Upper Case" id="1P0-qI-ZAM">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<connections>
|
||||
<action selector="uppercaseWord:" target="-1" id="cre-Qh-bSZ"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Make Lower Case" id="sK6-Xl-9uz">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<connections>
|
||||
<action selector="lowercaseWord:" target="-1" id="qid-xu-iAw"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Capitalize" id="zvd-g7-rwM">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<connections>
|
||||
<action selector="capitalizeWord:" target="-1" id="0tj-lN-nE0"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
</items>
|
||||
</menu>
|
||||
</menuItem>
|
||||
<menuItem title="Speech" id="bsj-0j-07E">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<menu key="submenu" title="Speech" id="r3p-Q2-qJZ">
|
||||
<items>
|
||||
<menuItem title="Start Speaking" id="8Hl-RR-cUq">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<connections>
|
||||
<action selector="startSpeaking:" target="-1" id="Zbb-Tp-HBE"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
<menuItem title="Stop Speaking" id="SLa-Tk-XGJ">
|
||||
<modifierMask key="keyEquivalentModifierMask"/>
|
||||
<connections>
|
||||
<action selector="stopSpeaking:" target="-1" id="Oyc-KO-3qC"/>
|
||||
</connections>
|
||||
</menuItem>
|
||||
</items>
|
||||
@@ -363,20 +515,19 @@ Gw
|
||||
<connections>
|
||||
<outlet property="delegate" destination="207" id="525"/>
|
||||
</connections>
|
||||
<point key="canvasLocation" x="-21" y="164"/>
|
||||
<point key="canvasLocation" x="36" y="0.0"/>
|
||||
</menu>
|
||||
<window allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" showsToolbarButton="NO" visibleAtLaunch="NO" frameAutosaveName="TextWindow" animationBehavior="default" id="216" userLabel="TextOutputWindow">
|
||||
<window allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" visibleAtLaunch="NO" frameAutosaveName="TextWindow" animationBehavior="default" id="216" userLabel="TextOutputWindow">
|
||||
<windowStyleMask key="styleMask" titled="YES" miniaturizable="YES" resizable="YES"/>
|
||||
<windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
|
||||
<rect key="contentRect" x="297" y="408" width="508" height="392"/>
|
||||
<rect key="contentRect" x="297" y="408" width="580" height="420"/>
|
||||
<rect key="screenRect" x="0.0" y="0.0" width="1440" height="878"/>
|
||||
<value key="minSize" type="size" width="400" height="200"/>
|
||||
<view key="contentView" id="217">
|
||||
<rect key="frame" x="0.0" y="0.0" width="508" height="392"/>
|
||||
<rect key="frame" x="0.0" y="0.0" width="580" height="420"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<subviews>
|
||||
<button verticalHuggingPriority="750" id="220">
|
||||
<rect key="frame" x="416" y="7" width="86" height="32"/>
|
||||
<rect key="frame" x="488" y="7" width="86" height="32"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxY="YES"/>
|
||||
<buttonCell key="cell" type="push" title="Quit" bezelStyle="rounded" alignment="center" borderStyle="border" inset="2" id="476">
|
||||
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
|
||||
@@ -390,25 +541,25 @@ Gw
|
||||
</connections>
|
||||
</button>
|
||||
<scrollView autohidesScrollers="YES" horizontalLineScroll="10" horizontalPageScroll="10" verticalLineScroll="10" verticalPageScroll="10" hasHorizontalScroller="NO" usesPredominantAxisScrolling="NO" id="226">
|
||||
<rect key="frame" x="9" y="45" width="489" height="339"/>
|
||||
<rect key="frame" x="9" y="45" width="561" height="367"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<clipView key="contentView" drawsBackground="NO" copiesOnScroll="NO" id="Hk1-72-Owa">
|
||||
<rect key="frame" x="1" y="1" width="487" height="337"/>
|
||||
<rect key="frame" x="1" y="1" width="559" height="365"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<subviews>
|
||||
<textView editable="NO" importsGraphics="NO" richText="NO" verticallyResizable="YES" usesFontPanel="YES" findStyle="panel" allowsDocumentBackgroundColorChange="YES" linkDetection="YES" id="225">
|
||||
<rect key="frame" x="0.0" y="0.0" width="487" height="337"/>
|
||||
<rect key="frame" x="0.0" y="0.0" width="559" height="365"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
<size key="minSize" width="487" height="337"/>
|
||||
<size key="maxSize" width="489" height="10000000"/>
|
||||
<color key="insertionPointColor" white="0.0" alpha="1" colorSpace="calibratedWhite"/>
|
||||
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
|
||||
<size key="minSize" width="559" height="365"/>
|
||||
<size key="maxSize" width="561" height="10000000"/>
|
||||
<color key="insertionPointColor" name="textColor" catalog="System" colorSpace="catalog"/>
|
||||
<connections>
|
||||
<outlet property="delegate" destination="207" id="488"/>
|
||||
</connections>
|
||||
</textView>
|
||||
</subviews>
|
||||
<color key="backgroundColor" white="1" alpha="1" colorSpace="calibratedWhite"/>
|
||||
</clipView>
|
||||
<scroller key="horizontalScroller" hidden="YES" verticalHuggingPriority="750" doubleValue="1" horizontal="YES" id="483">
|
||||
<rect key="frame" x="-100" y="-100" width="87" height="18"/>
|
||||
@@ -424,7 +575,7 @@ Gw
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||
</progressIndicator>
|
||||
<textField verticalHuggingPriority="750" allowsCharacterPickerTouchBarItem="YES" id="366">
|
||||
<rect key="frame" x="43" y="17" width="357" height="17"/>
|
||||
<rect key="frame" x="43" y="17" width="429" height="17"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
|
||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" id="477">
|
||||
<font key="font" metaFont="system"/>
|
||||
@@ -439,18 +590,17 @@ Gw
|
||||
</connections>
|
||||
<point key="canvasLocation" x="-478" y="370"/>
|
||||
</window>
|
||||
<window allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" showsToolbarButton="NO" visibleAtLaunch="NO" frameAutosaveName="WebViewWindow" animationBehavior="default" id="247" userLabel="WebOutputWindow">
|
||||
<window allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" releasedWhenClosed="NO" visibleAtLaunch="NO" frameAutosaveName="WebViewWindow" animationBehavior="default" id="247" userLabel="WebOutputWindow">
|
||||
<windowStyleMask key="styleMask" titled="YES" miniaturizable="YES" resizable="YES"/>
|
||||
<windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
|
||||
<rect key="contentRect" x="297" y="408" width="508" height="392"/>
|
||||
<rect key="contentRect" x="297" y="408" width="580" height="420"/>
|
||||
<rect key="screenRect" x="0.0" y="0.0" width="1440" height="878"/>
|
||||
<value key="minSize" type="size" width="400" height="200"/>
|
||||
<view key="contentView" id="248">
|
||||
<rect key="frame" x="0.0" y="0.0" width="508" height="392"/>
|
||||
<rect key="frame" x="0.0" y="0.0" width="580" height="420"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<subviews>
|
||||
<button verticalHuggingPriority="750" id="251">
|
||||
<rect key="frame" x="413" y="12" width="86" height="32"/>
|
||||
<rect key="frame" x="485" y="6" width="86" height="32"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMinX="YES" flexibleMaxY="YES"/>
|
||||
<buttonCell key="cell" type="push" title="Quit" bezelStyle="rounded" alignment="center" state="on" borderStyle="border" inset="2" id="478">
|
||||
<behavior key="behavior" pushIn="YES" lightByBackground="YES" lightByGray="YES"/>
|
||||
@@ -464,14 +614,14 @@ Gw
|
||||
</connections>
|
||||
</button>
|
||||
<box boxType="oldStyle" borderType="line" titlePosition="noTitle" id="257">
|
||||
<rect key="frame" x="8" y="51" width="491" height="333"/>
|
||||
<rect key="frame" x="8" y="45" width="563" height="367"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<view key="contentView" id="X4z-hY-QR7">
|
||||
<rect key="frame" x="1" y="1" width="489" height="331"/>
|
||||
<rect key="frame" x="1" y="1" width="561" height="365"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<webView maintainsBackForwardList="NO" id="258" customClass="STDragWebView">
|
||||
<rect key="frame" x="-1" y="0.0" width="490" height="331"/>
|
||||
<rect key="frame" x="-1" y="0.0" width="562" height="365"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<webPreferences key="preferences" defaultFontSize="12" defaultFixedFontSize="12">
|
||||
<nil key="identifier"/>
|
||||
@@ -489,11 +639,11 @@ Gw
|
||||
</view>
|
||||
</box>
|
||||
<progressIndicator horizontalHuggingPriority="750" verticalHuggingPriority="750" maxValue="100" displayedWhenStopped="NO" bezeled="NO" indeterminate="YES" controlSize="small" style="spinning" id="277">
|
||||
<rect key="frame" x="16" y="21" width="16" height="16"/>
|
||||
<rect key="frame" x="16" y="15" width="16" height="16"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMaxY="YES"/>
|
||||
</progressIndicator>
|
||||
<textField verticalHuggingPriority="750" allowsCharacterPickerTouchBarItem="YES" id="509">
|
||||
<rect key="frame" x="37" y="20" width="357" height="17"/>
|
||||
<rect key="frame" x="37" y="14" width="429" height="17"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMaxY="YES"/>
|
||||
<textFieldCell key="cell" scrollable="YES" lineBreakMode="clipping" sendsActionOnEndEditing="YES" id="510">
|
||||
<font key="font" metaFont="system"/>
|
||||
@@ -507,28 +657,36 @@ Gw
|
||||
<outlet property="delegate" destination="207" id="375"/>
|
||||
</connections>
|
||||
</window>
|
||||
<window title="Droplet" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" oneShot="NO" showsToolbarButton="NO" visibleAtLaunch="NO" frameAutosaveName="DropletWindow" animationBehavior="default" id="490" userLabel="DropletWindow">
|
||||
<window title="Droplet" allowsToolTipsWhenApplicationIsInactive="NO" autorecalculatesKeyViewLoop="NO" visibleAtLaunch="NO" frameAutosaveName="DropletWindow" animationBehavior="default" id="490" userLabel="DropletWindow">
|
||||
<windowStyleMask key="styleMask" titled="YES" closable="YES" miniaturizable="YES"/>
|
||||
<windowPositionMask key="initialPositionMask" leftStrut="YES" rightStrut="YES" topStrut="YES" bottomStrut="YES"/>
|
||||
<rect key="contentRect" x="157" y="273" width="188" height="188"/>
|
||||
<rect key="contentRect" x="157" y="273" width="294" height="280"/>
|
||||
<rect key="screenRect" x="0.0" y="0.0" width="1440" height="878"/>
|
||||
<view key="contentView" id="491">
|
||||
<rect key="frame" x="0.0" y="0.0" width="188" height="188"/>
|
||||
<rect key="frame" x="0.0" y="0.0" width="294" height="280"/>
|
||||
<autoresizingMask key="autoresizingMask"/>
|
||||
<subviews>
|
||||
<textField hidden="YES" verticalHuggingPriority="750" allowsCharacterPickerTouchBarItem="YES" id="519">
|
||||
<rect key="frame" x="0.0" y="0.0" width="294" height="280"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<textFieldCell key="cell" enabled="NO" allowsUndo="NO" sendsActionOnEndEditing="YES" drawsBackground="YES" id="520">
|
||||
<font key="font" metaFont="system"/>
|
||||
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="disabledControlTextColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
</textField>
|
||||
<box autoresizesSubviews="NO" borderType="line" titlePosition="noTitle" id="494">
|
||||
<rect key="frame" x="17" y="16" width="154" height="154"/>
|
||||
<rect key="frame" x="17" y="16" width="260" height="246"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<view key="contentView" id="q0i-G4-K1a">
|
||||
<rect key="frame" x="1" y="1" width="152" height="152"/>
|
||||
<rect key="frame" x="1" y="1" width="258" height="244"/>
|
||||
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
|
||||
<subviews>
|
||||
<progressIndicator wantsLayer="YES" horizontalHuggingPriority="750" verticalHuggingPriority="750" maxValue="100" displayedWhenStopped="NO" bezeled="NO" indeterminate="YES" style="spinning" id="496">
|
||||
<rect key="frame" x="59" y="75" width="32" height="32"/>
|
||||
<rect key="frame" x="112" y="128" width="32" height="32"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
</progressIndicator>
|
||||
<textField verticalHuggingPriority="750" allowsCharacterPickerTouchBarItem="YES" id="499">
|
||||
<rect key="frame" x="39" y="59" width="71" height="34"/>
|
||||
<rect key="frame" x="92" y="112" width="71" height="34"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<textFieldCell key="cell" controlSize="mini" sendsActionOnEndEditing="YES" alignment="center" title="Drop files here" id="500">
|
||||
<font key="font" metaFont="system"/>
|
||||
@@ -537,7 +695,7 @@ Gw
|
||||
</textFieldCell>
|
||||
</textField>
|
||||
<textField verticalHuggingPriority="750" allowsCharacterPickerTouchBarItem="YES" id="505">
|
||||
<rect key="frame" x="15" y="31" width="122" height="36"/>
|
||||
<rect key="frame" x="18" y="44" width="218" height="76"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<textFieldCell key="cell" controlSize="small" sendsActionOnEndEditing="YES" alignment="center" id="506">
|
||||
<font key="font" metaFont="smallSystem"/>
|
||||
@@ -548,21 +706,12 @@ Gw
|
||||
</subviews>
|
||||
</view>
|
||||
</box>
|
||||
<textField hidden="YES" verticalHuggingPriority="750" allowsCharacterPickerTouchBarItem="YES" id="519">
|
||||
<rect key="frame" x="0.0" y="0.0" width="188" height="188"/>
|
||||
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
|
||||
<textFieldCell key="cell" enabled="NO" allowsUndo="NO" sendsActionOnEndEditing="YES" drawsBackground="YES" id="520">
|
||||
<font key="font" metaFont="system"/>
|
||||
<color key="textColor" name="controlTextColor" catalog="System" colorSpace="catalog"/>
|
||||
<color key="backgroundColor" name="disabledControlTextColor" catalog="System" colorSpace="catalog"/>
|
||||
</textFieldCell>
|
||||
</textField>
|
||||
</subviews>
|
||||
</view>
|
||||
<connections>
|
||||
<outlet property="delegate" destination="207" id="RFt-L5-f73"/>
|
||||
</connections>
|
||||
<point key="canvasLocation" x="610" y="363"/>
|
||||
<point key="canvasLocation" x="608" y="262"/>
|
||||
</window>
|
||||
</objects>
|
||||
</document>
|
||||
|
||||
BIN
MainMenu.nib/keyedobjects.nib
generated
BIN
MainMenu.nib/keyedobjects.nib
generated
Binary file not shown.
34
README.md
Normal file
34
README.md
Normal file
@@ -0,0 +1,34 @@
|
||||
<img align="left" src="http://www.profiteroles.org/assets/yuba.png" style="float: left; margin-right: 30px;" width="120">
|
||||
|
||||
# Yuba
|
||||
|
||||
**Yuba** generates a web-browsable SQLite database from an HFS+ filesystem. Its client application gathers forensic-quality data about a locally attached disk, properly interpreting bundles, reading Spotlight data, Finder flags, labels, and other contextual information. It can generate hashes, thumbnails, and gather 3rd party metadata with exiftool and mediainfo. Yuba's filesystem catalogues are comprehensive, lightweight, optimized for massive (1 million+) trees, and reflect incremental changes to contents and metadata. A server-side PHP script is provided, which allows familiar, Finder-style browsing of a catalogue.
|
||||
|
||||
* **⇩ [Download Yuba 0.7.11](http://www.profiteroles.org/downloads/Yuba_0.7.11.zip)**
|
||||
|
||||
## Features
|
||||
|
||||
* Recursive directory scanning
|
||||
* Properly interprets bundles
|
||||
* Uses native macOS methods
|
||||
* Spotlight metadata and icons
|
||||
* Caches assets for re-scans
|
||||
* Optional file hashes
|
||||
* Tested with large filesystems
|
||||
|
||||
## Screenshots
|
||||
|
||||
<img src="http://www.profiteroles.org/assets/yuba_progress.png" width="600">
|
||||
<img src="http://www.profiteroles.org/assets/yuba_browser_1.png" width="1100">
|
||||
<img src="http://www.profiteroles.org/assets/yuba_browser_2.png" width="1100">
|
||||
|
||||
## Notes
|
||||
|
||||
Running Yuba requires disabling Gatekeeper by running `sudo spctl --master-disable` in the Terminal.
|
||||
|
||||
## Building from source
|
||||
|
||||
Building Minat requires Platypus and Pashua
|
||||
|
||||
* https://github.com/sveinbjornt/Platypus
|
||||
* https://github.com/BlueM/Pashua
|
||||
90
Yuba.php
90
Yuba.php
@@ -3,7 +3,7 @@
|
||||
// Yuba
|
||||
// //
|
||||
//////////////////////////////////////////
|
||||
$version = "0.7.10.3";
|
||||
$version = "0.7.11.5";
|
||||
|
||||
ini_set('memory_limit', '10240M');
|
||||
date_default_timezone_set("America/Los_Angeles");
|
||||
@@ -11,23 +11,22 @@ date_default_timezone_set("America/Los_Angeles");
|
||||
// Includes & Prefs
|
||||
//////////////////////////////////////////
|
||||
|
||||
$p = unserialize(file_get_contents("prefs.php"));
|
||||
|
||||
require("functions.php");
|
||||
require("filetypes.php");
|
||||
|
||||
$wopt_noprofile = 0;
|
||||
$wopt_steps = 10;
|
||||
$wopt_currstep = 1;
|
||||
|
||||
$parser = new plistParser();
|
||||
|
||||
$p = unserialize(file_get_contents("prefs.php"));
|
||||
|
||||
// Path & application variables
|
||||
//////////////////////////////////////////
|
||||
|
||||
$stamp = date("Y-m-d_H-i-s", time());
|
||||
|
||||
if (!isset($argv[1])) { echo "Input error"; die; }
|
||||
if (!isset($argv[1])) { echo "No input"; die; }
|
||||
$zpath = realpath(@$argv[1]);
|
||||
if (@$argv[2]) { $bdest = realpath($argv[2]); } else { $bdest = realpath($p['bdest']); }
|
||||
if (!is_dir($zpath) | !is_dir($bdest)) { echo "Filepath error"; die; }
|
||||
@@ -41,38 +40,6 @@ if (!is_dir($bpath)) { mkdir($bpath); }
|
||||
if (!is_dir($bpath."/thumbs")) { mkdir($bpath."/thumbs"); }
|
||||
if (!is_dir($bpath."/contents")) { mkdir($bpath."/contents"); }
|
||||
|
||||
// Treat these directories as files
|
||||
$p['bundles'] = array( "app",
|
||||
"bundle",
|
||||
"sparsebundle",
|
||||
"photoslibrary",
|
||||
"aplibrary",
|
||||
"apvault",
|
||||
"abbu",
|
||||
"calendar",
|
||||
"framework",
|
||||
"plugin",
|
||||
"kext",
|
||||
"rtfd"
|
||||
);
|
||||
|
||||
foreach ($p['bundles'] as $bundle) {
|
||||
$p['nodescend'][] = "*.".$bundle;
|
||||
}
|
||||
|
||||
// Ignore matching files and directories
|
||||
$p['ignore'] = array( ".DS_Store",
|
||||
".Trashes",
|
||||
".DocumentRevisions-V100",
|
||||
".Spotlight-V100",
|
||||
".TemporaryItems",
|
||||
".apdisk",
|
||||
".com.apple.timemachine.donotpresent",
|
||||
".fseventsd",
|
||||
".metadata-never-index",
|
||||
".neofinder.abemeda.volinfo.xml"
|
||||
);
|
||||
|
||||
// Metadata tools
|
||||
$bin_gfi = __DIR__."/bin/GetFileInfo";
|
||||
$bin_mediainfo = __DIR__."/bin/mediainfo";
|
||||
@@ -187,11 +154,11 @@ if ($type == "Disk image") {
|
||||
$image_file = false;
|
||||
}
|
||||
|
||||
if ($wopt_noprofile) {
|
||||
$profile = "disabled";
|
||||
} else {
|
||||
if ($p['profile']) {
|
||||
echo msg("system_profiler");
|
||||
$profile = shell_exec("system_profiler SPHardwareDataType SPStorageDataType SPThunderboltDataType SPUSBDataType 2>&1");
|
||||
} else {
|
||||
$profile = "disabled";
|
||||
}
|
||||
$qlmanage = shell_exec("qlmanage -m 2>&1");
|
||||
$sysvers = shell_exec("sw_vers 2>&1");
|
||||
@@ -460,10 +427,7 @@ echo ProgressBar::finish();
|
||||
// Thow permissions error
|
||||
|
||||
if (count($noread)) {
|
||||
echo msg("Current user (".posix_getuid().") does not have read access to the following files:");
|
||||
foreach ($noread as $file) {
|
||||
echo $file."\n";
|
||||
}
|
||||
echo msg("Current user (".posix_getuid().") does not have read access to the following files:\n").implode("\n",$noread);
|
||||
if ($p['readability']) {
|
||||
echo msg("Exiting...");
|
||||
die;
|
||||
@@ -546,7 +510,7 @@ if ($p['thumbs']) {
|
||||
$tfile = $tpath."/".$fid.".jpg";
|
||||
|
||||
// HACK for ql-thumbnail bug
|
||||
$t_skip = array("emlx");
|
||||
$t_skip = array("emlx","flac");
|
||||
if (count($t_skip) && in_array($ext, $t_skip)) {
|
||||
echo ProgressBar::next("Skipping ".shortlabel($pathname));
|
||||
continue;
|
||||
@@ -571,13 +535,13 @@ if ($p['thumbs']) {
|
||||
|
||||
// first try to make a thumb with external tools
|
||||
$cmd = null;
|
||||
if (in_array($ext, $t_files['sips'])) {
|
||||
if (in_array($ext, $p['t_files']['sips'])) {
|
||||
//$cmd = $bin_tv." ".$shellpath." -o ".$tfile."[Q=90,optimize_coding] --size=".$p['thumb_size'];
|
||||
$cmd = "sips -s format jpeg -s formatOptions 80 --resampleHeightWidthMax ".$p['thumb_size']." ".$shellpath." --out ".$tfile;
|
||||
$stmt->BindValue(":tool","sips");
|
||||
} elseif (in_array($ext, $t_files['ffmpeg'])) {
|
||||
} elseif (in_array($ext, $p['t_files']['ffmpeg'])) {
|
||||
//$cmd = $bin_tf." -i ".$shellpath." -o ".$tfile." -s ".$p['thumb_size']." -c jpg -q 8.5";
|
||||
$cmd = $bin_ffmpeg." -ss $(( $(".$bin_mediainfo." --Inform='Video;%Duration%' ".$shellpath.") / 10000 )) -i ".$shellpath." -vframes 1 -filter:v scale='400:-1' -q:v 3 ".$tfile;
|
||||
$cmd = $bin_ffmpeg." -ss $(( $(".$bin_mediainfo." --Inform='Video;%Duration%' ".$shellpath." | cut -d'.' -f1) / 10000 )) -i ".$shellpath." -vframes 1 -filter:v scale='400:-1' -q:v 3 ".$tfile;
|
||||
$stmt->BindValue(":tool","ffmpeg");
|
||||
}
|
||||
|
||||
@@ -592,7 +556,8 @@ if ($p['thumbs']) {
|
||||
}
|
||||
|
||||
// success, move thumb into the bundle
|
||||
if (file_exists($tfile) && @filesize($tfile)) {
|
||||
// ignore generic music icon thumbs (7133)
|
||||
if (file_exists($tfile) && @filesize($tfile) && @filesize($tfile) != 7133) {
|
||||
$stmt->BindValue(":relative_path",substr($tfile, strlen($bpath)));
|
||||
list($width, $height) = getimagesize($tfile);
|
||||
$stmt->BindValue(":width",$width);
|
||||
@@ -622,7 +587,7 @@ if ($p['contents']) {
|
||||
$ext = pathinfo($pathname,PATHINFO_EXTENSION);
|
||||
$cpath = $bpath."/contents/".substr($fid, 0, 2);
|
||||
$cfile = $cpath."/".$fid.".zip";
|
||||
if (in_array($ext, $c_files)) {
|
||||
if (in_array($ext, $p['c_files'])) {
|
||||
if (!is_dir($cpath)) { mkdir($cpath); }
|
||||
if (!file_exists($cfile) && filesize($pathname) < 25000) {
|
||||
|
||||
@@ -663,12 +628,12 @@ if ($p['meta']) {
|
||||
$ext = pathinfo($pathname,PATHINFO_EXTENSION);
|
||||
$found = 1;
|
||||
|
||||
if (!in_array($ext, $e_files) && !in_array($ext, $m_files)) {
|
||||
if (!in_array($ext, $p['e_files']) && !in_array($ext, $p['m_files'])) {
|
||||
echo ProgressBar::next("Not a media file: ".shortlabel($pathname));
|
||||
continue;
|
||||
}
|
||||
|
||||
if (in_array($ext, $e_files)) {
|
||||
if (in_array($ext, $p['e_files'])) {
|
||||
$check = $dbp->query("SELECT EXISTS(SELECT 1 FROM exiftool WHERE fid='".$fid."')")->fetch()[0];
|
||||
if (!$check) {
|
||||
$arrstring = shell_exec($bin_exiftool." -php ".$shellpath);
|
||||
@@ -685,13 +650,14 @@ if ($p['meta']) {
|
||||
}
|
||||
}
|
||||
|
||||
if (in_array($ext, $m_files)) {
|
||||
if (in_array($ext, $p['m_files'])) {
|
||||
$check = $dbp->query("SELECT EXISTS(SELECT 1 FROM mediainfo WHERE fid='".$fid."')")->fetch()[0];
|
||||
if (!$check) {
|
||||
$stmt = $dbp->prepare("INSERT INTO mediainfo VALUES (:fid, :info)");
|
||||
$stmt->BindValue(":fid",$fid);
|
||||
//$stmt->BindValue(":info",serialize(parseMediaInfo(shell_exec($bin_mediainfo." --Output=OLDXML ".$shellpath." 2>&1"))));
|
||||
$stmt->BindValue(":info",shell_exec($bin_mediainfo." --Output=OLDXML ".$shellpath." 2>&1"));
|
||||
//$stmt->BindValue(":info",shell_exec($bin_mediainfo." --Output=OLDXML ".$shellpath." 2>&1"));
|
||||
$stmt->BindValue(":info",shell_exec($bin_mediainfo." --Output=JSON ".$shellpath." 2>&1"));
|
||||
$stmt->execute();
|
||||
$found = 0;
|
||||
}
|
||||
@@ -1006,7 +972,9 @@ foreach ($files as $splFileInfo) {
|
||||
$yes_contents = $dbp->query("SELECT relative_path FROM contents WHERE fid='".$fid."'")->fetch()[0];
|
||||
$stmt->BindValue(":contents_filename",$yes_contents);
|
||||
|
||||
if (!in_array($extension, $t_skip)) {
|
||||
$fetch_thumb = $dbp->query("SELECT * FROM thumbs WHERE fid='".$fid."'")->fetch();
|
||||
}
|
||||
if (@$fetch_thumb['relative_path']) {
|
||||
$stmt->BindValue(":thumb_filename",$fetch_thumb['relative_path']);
|
||||
$stmt->BindValue(":thumb_width",$fetch_thumb['width']);
|
||||
@@ -1137,14 +1105,18 @@ while ($row_a = $loop->fetch()) {
|
||||
if (isset($row_a['has_mediainfo'])) {
|
||||
|
||||
$row_d = $dbp->query("SELECT * FROM mediainfo WHERE (rowid='".$row_a['has_mediainfo']."')")->fetch();
|
||||
if (substr($row_d['info'],0,5) == "<?xml") {
|
||||
$decoded = @json_decode(json_encode(simplexml_load_string($row_d['info'])),true);
|
||||
$m_base = $decoded['File']['track'];
|
||||
$m['m'] = $decoded['File']['track'][0];
|
||||
} else {
|
||||
$decoded = @json_decode($row_d['info'],true);
|
||||
$m_base = $decoded['media']['track'];
|
||||
$m['m'] = $decoded['media']['track'][0];
|
||||
}
|
||||
|
||||
//custom values
|
||||
|
||||
$m['m']['SkimTrackCount'] = @count($decoded['File']['track']);
|
||||
|
||||
foreach (@$decoded['File']['track'] as $track) {
|
||||
$m['m']['SkimTrackCount'] = @count($m_base);
|
||||
foreach (@$m_base as $track) {
|
||||
if (!@$m['m']['SkimDims'] && @$track['Width'] && @$track['Height']) {
|
||||
$m['m']['SkimDims'] = sanitize($track['Width'],"i").$display_delimiter.sanitize($track['Height'],"i");
|
||||
}
|
||||
|
||||
0
YubaPrefs.php
Normal file
0
YubaPrefs.php
Normal file
@@ -1,10 +1,36 @@
|
||||
<?php
|
||||
|
||||
// Filetypes
|
||||
// 0.7.10.3
|
||||
// 0.7.11.5
|
||||
//////////////////////////////////////////
|
||||
|
||||
$c_files = array( "txt",
|
||||
$p['bundles'] = array( "app",
|
||||
"bundle",
|
||||
"sparsebundle",
|
||||
"photoslibrary",
|
||||
"aplibrary",
|
||||
"apvault",
|
||||
"abbu",
|
||||
"calendar",
|
||||
"framework",
|
||||
"plugin",
|
||||
"kext",
|
||||
"rtfd"
|
||||
);
|
||||
|
||||
$p['ignore'] = array( ".DS_Store",
|
||||
".Trashes",
|
||||
".DocumentRevisions-V100",
|
||||
".Spotlight-V100",
|
||||
".TemporaryItems",
|
||||
".apdisk",
|
||||
".com.apple.timemachine.donotpresent",
|
||||
".fseventsd",
|
||||
".metadata-never-index",
|
||||
".neofinder.abemeda.volinfo.xml"
|
||||
);
|
||||
|
||||
$p['c_files'] = array( "txt",
|
||||
"log",
|
||||
"csv",
|
||||
"webloc",
|
||||
@@ -14,7 +40,7 @@ $c_files = array( "txt",
|
||||
"doc",
|
||||
"docx" );
|
||||
|
||||
$t_files['ffmpeg'] = array( "mkv",
|
||||
$p['t_files']['ffmpeg'] = array( "mkv",
|
||||
"avi",
|
||||
"mpeg",
|
||||
"mpg",
|
||||
@@ -31,7 +57,7 @@ $t_files['ffmpeg'] = array( "mkv",
|
||||
"flv",
|
||||
"webm" );
|
||||
|
||||
$t_files['sips'] = array( "jpg",
|
||||
$p['t_files']['sips'] = array( "jpg",
|
||||
"jpeg",
|
||||
"tif",
|
||||
"tiff",
|
||||
@@ -40,7 +66,7 @@ $t_files['sips'] = array( "jpg",
|
||||
"png",
|
||||
"heic" );
|
||||
|
||||
$m_files = array( "mkv",
|
||||
$p['m_files'] = array( "mkv",
|
||||
"ogg",
|
||||
"avi",
|
||||
"wav",
|
||||
@@ -65,7 +91,7 @@ $m_files = array( "mkv",
|
||||
"aiff",
|
||||
"m2ts" );
|
||||
|
||||
$e_files = array( "ai",
|
||||
$p['e_files'] = array( "ai",
|
||||
"aiff",
|
||||
"ape",
|
||||
"asf",
|
||||
@@ -135,10 +161,11 @@ $e_files = array( "ai",
|
||||
"xmp",
|
||||
"zip" );
|
||||
|
||||
foreach ($c_files as $ext) { $c_files[] = strtoupper($ext); }
|
||||
foreach ($e_files as $ext) { $e_files[] = strtoupper($ext); }
|
||||
foreach ($m_files as $ext) { $m_files[] = strtoupper($ext); }
|
||||
foreach ($t_files['ffmpeg'] as $ext) { $t_files['ffmpeg'][] = strtoupper($ext); }
|
||||
foreach ($t_files['sips'] as $ext) { $t_files['sips'][] = strtoupper($ext); }
|
||||
foreach ($p['bundles'] as $bundle) { $p['nodescend'][] = "*.".$bundle; }
|
||||
foreach ($p['c_files'] as $ext) { $p['c_files'][] = strtoupper($ext); }
|
||||
foreach ($p['e_files'] as $ext) { $p['e_files'][] = strtoupper($ext); }
|
||||
foreach ($p['m_files'] as $ext) { $p['m_files'][] = strtoupper($ext); }
|
||||
foreach ($p['t_files']['ffmpeg'] as $ext) { $p['t_files']['ffmpeg'][] = strtoupper($ext); }
|
||||
foreach ($p['t_files']['sips'] as $ext) { $p['t_files']['sips'][] = strtoupper($ext); }
|
||||
|
||||
?>
|
||||
@@ -59,7 +59,7 @@ class ProgressBar {
|
||||
global $wopt_currstep;
|
||||
$wopt_currstep++;
|
||||
self::$done = 0;
|
||||
return "\n";
|
||||
return "\nREFRESH\n";
|
||||
}
|
||||
|
||||
}
|
||||
@@ -67,17 +67,6 @@ class ProgressBar {
|
||||
// Functions
|
||||
//////////////////////////////////////////
|
||||
|
||||
/*
|
||||
function getParents($zpath, $pathname) {
|
||||
$path = dirname($pathname);
|
||||
$parts = explode("/",trim(substr($path,strlen(basename($zpath))),"/"));
|
||||
foreach ($parts as $index => $part) {
|
||||
$parents[] = array($part, md5($zpath."/".implode("/",array_slice($parts, 0, $index+1))));
|
||||
}
|
||||
return $parents;
|
||||
}
|
||||
*/
|
||||
|
||||
function msg($string) {
|
||||
global $messages_log_file;
|
||||
$logstring = "[".date('Y-m-d h:i:s')."] ".$string."\n";
|
||||
@@ -185,7 +174,7 @@ class plistParser extends XMLReader {
|
||||
case 'false': return false; break;
|
||||
case 'array': return $this->parse_array(); break;
|
||||
case 'dict': return $this->parse_dict(); break;
|
||||
// why the fuck cant this plist parser handle the plist generated from an hdiutil list with no dimgs attached?
|
||||
// why the can't this plist parser handle the plist generated from an hdiutil list with no dimgs attached?
|
||||
//default: throw new Exception(sprintf("Not a valid plist. %s is not a valid type", $this->name), 4);
|
||||
}
|
||||
}
|
||||
|
||||
1
version.txt
Executable file
1
version.txt
Executable file
@@ -0,0 +1 @@
|
||||
0.7.11.5
|
||||
53
web/rtc.php
53
web/rtc.php
@@ -4,14 +4,18 @@
|
||||
// Yuba RTC Browser
|
||||
/////////////////////////////////////////////////////////////////
|
||||
|
||||
$browser_version = "0.7.10.3";
|
||||
$browser_version = "0.7.10.5";
|
||||
|
||||
require "togggle.php";
|
||||
require "lib/debug.php";
|
||||
require "lib/ref/ref.php";
|
||||
|
||||
ref::config('expLvl', 1);
|
||||
ref::config('validHtml', TRUE);
|
||||
|
||||
$db_dir = "data/skim";
|
||||
$icon_size = 96;
|
||||
$pad = 40;
|
||||
$overlay_exts = array("txt","php","inc","sh","md","json","cmd");
|
||||
|
||||
?>
|
||||
|
||||
@@ -22,6 +26,9 @@ $pad = 40;
|
||||
|
||||
html { font-family: Helvetica; word-wrap: break-word; }
|
||||
|
||||
table.file td { width: 33%; }
|
||||
table.dir td:last-of-type { width: 22%; }
|
||||
|
||||
div#exectime { position: absolute; right: 8px; top: 8px; }
|
||||
|
||||
div.container { display: flex; flex-flow: row wrap; justify-content: center; }
|
||||
@@ -61,7 +68,11 @@ div.size { color: grey; margin-top: 3px; }
|
||||
img#thumb { padding: 6px; border: 1px solid gainsboro; }
|
||||
img#item { float: left; margin-right: 10px; width: 32px; height: 32px; }
|
||||
img { margin-bottom: 8px; }
|
||||
|
||||
img#thumb.overlay { border: 0px !important;
|
||||
padding: 6px !important;
|
||||
-webkit-mask-image: url('/icons/mask.png');
|
||||
-webkit-mask-size: 100%;
|
||||
outline: 1px solid black; }
|
||||
div.fileinfo { font-size: 12px; }
|
||||
div.fileinfo span.title { display: table-cell; font-weight: bold; width: 200px; }
|
||||
div.fileinfo span.value { display: table-cell; }
|
||||
@@ -76,10 +87,12 @@ div.dblist { display: none; }
|
||||
|
||||
</style>
|
||||
|
||||
<script src="/lib/ref/ref.js"></script>
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.4.0/jquery.min.js"></script>
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.js"></script>
|
||||
<script src="https://cdnjs.cloudflare.com/ajax/libs/lazysizes/4.1.5/lazysizes.min.js"></script>
|
||||
|
||||
<link type="text/css" rel="stylesheet" href="/lib/ref/ref.css">
|
||||
<link type="text/css" rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/jqueryui/1.12.1/jquery-ui.css">
|
||||
|
||||
<script type="text/javascript">
|
||||
@@ -410,10 +423,14 @@ if ($db_file) {
|
||||
$skim_version = $dbo->query("SELECT version FROM _skim")->fetch()['version'];
|
||||
$spotlight_status = $dbo->query("SELECT mdutil FROM _skim")->fetch()['mdutil'];
|
||||
|
||||
echo "<table><tr>";
|
||||
$row_a = $dbo->query("SELECT rowid, * FROM files WHERE (pid='".$pid."')")->fetch();
|
||||
if (!$row_a) { // this file doesn't exist in this version of the db
|
||||
echo "<meta http-equiv='refresh' content='0; URL=".$_SERVER['REQUEST_URI']."&pid=' />";
|
||||
}
|
||||
|
||||
echo "<table class='file'><tr>";
|
||||
|
||||
echo "<td valign='top'>";
|
||||
$row_a = $dbo->query("SELECT rowid, * FROM files WHERE (pid='".$pid."')")->fetch();
|
||||
if (is_serial($row_a['stat'])) {
|
||||
$row_a['stat'] = unserialize($row_a['stat']);
|
||||
}
|
||||
@@ -530,19 +547,22 @@ if ($db_file) {
|
||||
|
||||
echo "<td valign='top'>";
|
||||
|
||||
debug(array($row_a),"file");
|
||||
r($row_a);
|
||||
|
||||
if ($row_b['spotlight']) {
|
||||
debug(array($row_b),"mdls");
|
||||
r($row_b);
|
||||
}
|
||||
|
||||
echo "</td><td valign='top'>";
|
||||
|
||||
if ($row_c) {
|
||||
debug(array(unserialize($row_c['tags'])),"exiftool");
|
||||
r(unserialize($row_c['tags']));
|
||||
}
|
||||
|
||||
ref::config('expLvl', 2);
|
||||
|
||||
if ($row_d) {
|
||||
debug(array(json_decode(json_encode(simplexml_load_string($row_d['info'])))),"mediainfo");
|
||||
r(json_decode(json_encode(simplexml_load_string(utf8_encode($row_d['info']))))->File->track);
|
||||
}
|
||||
|
||||
echo "</td>";
|
||||
@@ -563,7 +583,7 @@ if ($db_file) {
|
||||
|
||||
echo "<div class='controls'><a href='#' class='info'>info</a></div>";
|
||||
|
||||
echo "<table><tr><td valign='top'>";
|
||||
echo "<table class='dir'><tr><td valign='top'>";
|
||||
echo "<div class='container'>";
|
||||
|
||||
$spotlight_status = $dbo->query("SELECT mdutil FROM _skim")->fetch()['mdutil'];
|
||||
@@ -589,7 +609,15 @@ if ($db_file) {
|
||||
$visibility = "unhidden";
|
||||
}
|
||||
|
||||
//if (in_array($item['Extension'],$overlay_exts) && $item['thumb_filename']) {
|
||||
//
|
||||
//$realfile = dirname($db_file).$item['thumb_filename'];
|
||||
//$icon = "<img id='thumb' class='overlay' src='".$realfile."' width='".($icon_size*.8)."' height='".$icon_size."' data-width='".($icon_size*.8)."' data-height='".$icon_size."'>";
|
||||
|
||||
//} elseif ($item['thumb_filename']) {
|
||||
|
||||
if ($item['thumb_filename']) {
|
||||
|
||||
$aspect = $item['thumb_width']/$item['thumb_height'];
|
||||
if ($aspect > 1) {
|
||||
$width = $icon_size;
|
||||
@@ -604,6 +632,7 @@ if ($db_file) {
|
||||
$icon = "<img src='/icons/directory.png' width='".$icon_size."' height='".$icon_size."' data-width='".$icon_size."' data-height='".$icon_size."'>";
|
||||
} else {
|
||||
$icon = "<img src='".findicon($item['Filename'])."' width='".$icon_size."' height='".$icon_size."' data-width='".$icon_size."' data-height='".$icon_size."'>";
|
||||
|
||||
}
|
||||
|
||||
echo "\n<a class='".$visibility."' href='?db=".$db_file."&pid=".$item['pid']."'>".$icon."</a>";
|
||||
@@ -638,11 +667,11 @@ if ($db_file) {
|
||||
echo "</div>";
|
||||
echo "</td><td valign='top' class='sidebar'>";
|
||||
|
||||
debug($view,$view['Pathname']);
|
||||
r($view);
|
||||
|
||||
if ($dirmdls['spotlight']) {
|
||||
$dirmdls['spotlight'] = $parser->parseString(utf8_for_xml($dirmdls['spotlight']));
|
||||
debug(array($dirmdls),"mdls");
|
||||
r($dirmdls);
|
||||
}
|
||||
|
||||
echo "</td></tr></table>";
|
||||
|
||||
Reference in New Issue
Block a user