18 Commits

Author SHA1 Message Date
p
d5cc094120 Update README.md 2025-12-10 03:23:13 -05:00
p
639f563a5c Update README.md 2025-12-10 03:22:31 -05:00
p
56a5ce232b Update README.md 2025-12-10 03:20:08 -05:00
p
4f8b75fe86 Update README.md 2025-03-05 04:26:32 -05:00
d34b6e0954 0.1.8.0 2019-10-03 01:23:16 -07:00
9d1a88c06a 0.1.8.0 2019-10-02 10:19:55 -07:00
4d3a6105d3 0.1.8.0 2019-09-30 09:28:46 -07:00
6aceab7282 0.1.8.0 2019-09-30 09:22:07 -07:00
5c4dc289b9 0.1.8.0 2019-09-30 05:38:01 -07:00
7a80404180 0.1.8.0 2019-09-30 05:34:36 -07:00
e6e29bf7c6 0.1.8.0 2019-09-29 23:27:00 -07:00
p
25abced9f5 Update 2019-09-29 16:46:37 -07:00
1d905c6a70 Update 2019-09-29 16:39:19 -07:00
f8f6c5cad5 0.1.8 2019-09-27 01:56:37 -07:00
6339336048 0.1.8 2019-09-27 01:54:17 -07:00
b92a5cb366 0.1.8 2019-09-27 01:51:39 -07:00
79245e937c 0.1.8 2019-09-27 01:51:03 -07:00
862af085c5 0.1.8 2019-09-27 01:49:14 -07:00
36 changed files with 436 additions and 12774 deletions

1
.gitignore vendored
View File

@@ -1 +0,0 @@
.DS_Store

View File

@@ -1,6 +1,9 @@
# Changelog
All notable changes to this project will be documented in this file.
## [0.1.8]
- Tweaks and bugfixes
## [0.1.7]
- Updated Pashua binary

65
Console/Console.platypus Normal file
View File

@@ -0,0 +1,65 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>AcceptsFiles</key>
<false/>
<key>AcceptsText</key>
<false/>
<key>Authentication</key>
<false/>
<key>Author</key>
<string>profiteroles</string>
<key>BundledFiles</key>
<array/>
<key>Creator</key>
<string>Platypus-5.2</string>
<key>DeclareService</key>
<false/>
<key>DevelopmentVersion</key>
<false/>
<key>Droppable</key>
<false/>
<key>IconPath</key>
<string>/Volumes/Code/Minat/master/Console/icon.icns</string>
<key>Identifier</key>
<string>org.profiteroles.Console</string>
<key>InterfaceType</key>
<string>Text Window</string>
<key>InterpreterPath</key>
<string>/bin/bash</string>
<key>Name</key>
<string>Console</string>
<key>NibPath</key>
<string>/usr/local/share/platypus/MainMenu.nib</string>
<key>OptimizeApplication</key>
<true/>
<key>Overwrite</key>
<false/>
<key>PromptForFileOnLaunch</key>
<false/>
<key>RemainRunning</key>
<false/>
<key>RunInBackground</key>
<true/>
<key>ScriptPath</key>
<string>/Volumes/Code/Minat/master/Console/tail.sh</string>
<key>TextBackground</key>
<string>#23030e</string>
<key>TextFont</key>
<string>SFMono-Regular</string>
<key>TextForeground</key>
<string>#ffc3bd</string>
<key>TextSize</key>
<real>11</real>
<key>UniformTypes</key>
<array>
<string>public.item</string>
<string>public.folder</string>
</array>
<key>UseXMLPlistFormat</key>
<false/>
<key>Version</key>
<string>0.1.0.0</string>
</dict>
</plist>

BIN
Console/icon.icns Normal file

Binary file not shown.

View File

@@ -52,20 +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"/>
<rect key="contentRect" x="472" y="537" width="438" 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="438" height="83"/>
<value key="maxSize" type="size" width="600" 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="438" 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="310" 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="403" 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"/>
@@ -74,7 +74,7 @@
</textFieldCell>
</textField>
<button verticalHuggingPriority="750" id="206">
<rect key="frame" x="338" 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"/>
@@ -108,19 +108,19 @@ 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="393" height="202"/>
<rect key="frame" x="20" y="-203" width="555" height="202"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" flexibleMinY="YES"/>
<clipView key="contentView" drawsBackground="NO" copiesOnScroll="NO" id="2mm-QF-kpX">
<rect key="frame" x="1" y="1" width="391" height="200"/>
<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="391" height="200"/>
<rect key="frame" x="0.0" y="0.0" width="553" height="200"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<color key="textColor" name="textColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="textBackgroundColor" catalog="System" colorSpace="catalog"/>
<size key="minSize" width="391" height="200"/>
<size key="maxSize" width="463" height="10000000"/>
<size key="minSize" width="553" height="200"/>
<size key="maxSize" width="555" height="10000000"/>
<color key="insertionPointColor" name="textColor" catalog="System" colorSpace="catalog"/>
<connections>
<outlet property="delegate" destination="207" id="489"/>
@@ -163,10 +163,9 @@ Gw
<action selector="menuItemSelected:" target="207" id="x6l-Tq-pHp"/>
</connections>
</menuItem>
<menuItem title="Check for Updates..." id="C0p-oO-R2b">
<modifierMask key="keyEquivalentModifierMask"/>
<menuItem title="Check for Updates..." keyEquivalent="u" id="jWa-5b-mBK" userLabel="Check for updates...">
<connections>
<action selector="menuItemSelected:" target="207" id="iT2-Ph-VrL"/>
<action selector="menuItemSelected:" target="207" id="VBb-a8-Cku"/>
</connections>
</menuItem>
<menuItem title="Services" id="235">
@@ -488,16 +487,15 @@ Gw
<menuItem title="Window" id="19">
<menu key="submenu" title="Window" systemMenu="window" id="24">
<items>
<menuItem title="Show Debug Console" id="lMd-a8-8Ow">
<modifierMask key="keyEquivalentModifierMask"/>
<menuItem title="Console" keyEquivalent="0" id="ZMj-KE-Xmg">
<connections>
<action selector="menuItemSelected:" target="207" id="2Lz-zY-3KO"/>
<action selector="menuItemSelected:" target="207" id="uTf-9L-ThU"/>
</connections>
</menuItem>
<menuItem title="Zoom" keyEquivalent="z" id="197">
<menuItem title="Zoom" keyEquivalent="z" id="bf1-wK-fgP">
<modifierMask key="keyEquivalentModifierMask" shift="YES" command="YES"/>
<connections>
<action selector="performZoom:" target="-1" id="198"/>
<action selector="performZoom:" target="-1" id="xLL-JF-YCG"/>
</connections>
</menuItem>
<menuItem title="Minimize" keyEquivalent="m" id="23">
@@ -550,7 +548,7 @@ Gw
<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="559" height="365"/>
<autoresizingMask key="autoresizingMask"/>
<autoresizingMask key="autoresizingMask" widthSizable="YES" heightSizable="YES"/>
<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="559" height="365"/>
@@ -664,14 +662,14 @@ Gw
</window>
<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"/>
<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" misplaced="YES" allowsCharacterPickerTouchBarItem="YES" id="519">
<rect key="frame" x="0.0" y="0.0" width="188" height="188"/>
<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"/>
@@ -679,19 +677,19 @@ Gw
<color key="backgroundColor" name="disabledControlTextColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<box autoresizesSubviews="NO" misplaced="YES" borderType="line" titlePosition="noTitle" id="494">
<rect key="frame" x="17" y="16" width="154" height="154"/>
<box autoresizesSubviews="NO" borderType="line" titlePosition="noTitle" id="494">
<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" misplaced="YES" maxValue="100" displayedWhenStopped="NO" bezeled="NO" indeterminate="YES" style="spinning" id="496">
<rect key="frame" x="61" y="61" width="32" height="32"/>
<progressIndicator wantsLayer="YES" horizontalHuggingPriority="750" verticalHuggingPriority="750" maxValue="100" displayedWhenStopped="NO" bezeled="NO" indeterminate="YES" style="spinning" id="496">
<rect key="frame" x="112" y="128" width="32" height="32"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES"/>
</progressIndicator>
<textField verticalHuggingPriority="750" misplaced="YES" allowsCharacterPickerTouchBarItem="YES" id="499">
<rect key="frame" x="41" y="59" width="71" height="34"/>
<textField verticalHuggingPriority="750" allowsCharacterPickerTouchBarItem="YES" id="499">
<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"/>
@@ -699,6 +697,15 @@ Gw
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
<textField verticalHuggingPriority="750" allowsCharacterPickerTouchBarItem="YES" id="505">
<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"/>
<color key="textColor" name="disabledControlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
</textField>
</subviews>
</view>
</box>
@@ -709,21 +716,5 @@ Gw
</connections>
<point key="canvasLocation" x="608" y="262"/>
</window>
<textField verticalHuggingPriority="750" misplaced="YES" allowsCharacterPickerTouchBarItem="YES" id="505">
<rect key="frame" x="0.0" y="0.0" width="116" height="24"/>
<autoresizingMask key="autoresizingMask" flexibleMaxX="YES" flexibleMinY="YES" heightSizable="YES"/>
<textFieldCell key="cell" controlSize="small" sendsActionOnEndEditing="YES" alignment="center" id="506">
<font key="font" metaFont="smallSystem"/>
<color key="textColor" name="disabledControlTextColor" catalog="System" colorSpace="catalog"/>
<color key="backgroundColor" name="controlColor" catalog="System" colorSpace="catalog"/>
</textFieldCell>
<point key="canvasLocation" x="608" y="270"/>
</textField>
<menuItem title="Check for Updates..." id="U6h-y5-bg3">
<modifierMask key="keyEquivalentModifierMask"/>
<connections>
<action selector="menuItemSelected:" target="207" id="RcS-Le-Wo9"/>
</connections>
</menuItem>
</objects>
</document>

Binary file not shown.

BIN
Minat.app.zip Normal file

Binary file not shown.

121
Minat.php
View File

@@ -3,40 +3,35 @@
// Minat
// Minat Is Not a Transcoder
$version = file_get_contents(__DIR__."/version.txt");
$version = file_get_contents(__DIR__."/current_version.txt");
// Includes
require (__DIR__."/functions.php");
// Prefs
// Load preferences
$prefs = __DIR__."/prefs.php";
if (!file_exists($prefs)) {
alert("Can't read prefs file");
die;
} else {
$p = unserialize(file_get_contents($prefs));
// Extra prefs
$p['phpbin'] = "/usr/bin/php";
$p['flacbin'] = __DIR__."/bin/flac";
$p['metaflacbin'] = __DIR__."/bin/metaflac";
$p['lamebin'] = __DIR__."/bin/lame";
$p['soxbin'] = __DIR__."/bin/sox";
$p['workdir'] = "/tmp/minat/";
$p['logfile'] = getLogPath("minat.log");
$p['disable_tags'] = 0;
$p['disable_artwork'] = 0;
$p['premature'] = 0;
$p['max_size'] = 1000;
$prefs_file = "/Users/".get_current_user()."/Library/Preferences/org.profiteroles.Minat.php";
if (!file_exists($prefs_file)) {
if (!copy(__DIR__."/prefs.php",$prefs_file)) {
echo "Error creating preferences file";
die;
}
}
$p = unserialize(file_get_contents($prefs_file));
$p['phpbin'] = "/usr/bin/php";
$p['flacbin'] = __DIR__."/bin/flac";
$p['metaflacbin'] = __DIR__."/bin/metaflac";
$p['lamebin'] = __DIR__."/bin/lame";
$p['soxbin'] = __DIR__."/bin/sox";
$p['workdir'] = "/tmp/minat/";
$p['logfile'] = getLogPath("minat.log");
$p['disable_tags'] = 0;
$p['disable_artwork'] = 0;
$p['premature'] = 0;
$p['max_size'] = 1000;
if ($p['mode'] != 1) { $p['premature'] = 1; addline("MODE ".$p['mode']." NOT YET IMPLEMENTED."); }
@@ -59,46 +54,34 @@ addline("Minat: ".$version);
addline("PHP: ".PHP_VERSION);
addline(exec("sw_vers | grep ProductVersion"));
// Launch without argv (no files dragged)
// No files dragged
array_shift($argv);
if(count($argv) == 0) {
addline("Launch without argv");
die;
}
// Preferences
if ($argv[0] == "Preferences...") {
exec($p['phpbin']." ".__DIR__."/MinatPrefs.php");
addline("Launch preferences");
die;
}
// Version check
if ($argv[0] == "Check for Updates...") {
$curr_version = file_get_contents("https://www.profiteroles.org/git/profiteroles/Minat/raw/branch/master/version.txt");
addline("Version check, me=".$version." latest=".$curr_version);
if ($curr_version > $version) {
if(askMulti("Minat ".$curr_version." is available (you have ".$version.")", array("Cancel","Download")) == 1) {
exec("open http://git.profiteroles.org/profiteroles/Minat");
switch (@$argv[0]) {
case NULL:
addline("Launch without argv");
die;
case "Preferences...":
exec(escapeshellarg($p['phpbin'])." ".escapeshellarg(__DIR__."/MinatPrefs.php"));
addline("Launch preferences");
die;
case "Console":
exec("open -n ".__DIR__."/bin/Console.app --args ".$p['logfile']);
die;
case "Check for Updates...":
$curr_version = file_get_contents("https://www.profiteroles.org/git/p/Minat/raw/master/current_version.txt");
if ($curr_version > $version) {
if(askMulti("Minat ".$curr_version." is available (you have ".$version.")", array("Cancel","Download")) == 1) {
exec("open https://www.profiteroles.org/git/p/Minat");
echo "QUITAPP\n";
} else {
die;
}
} else {
echo "\nALERT:Up-to-date|".$version." is the latest version.\n";
die;
}
} else {
alert($version." is the latest version","Up-to-date");
die;
}
}
// Console
if ($argv[0] == "Show Debug Console") {
exec("open -n Console.app --args ".$p['logfile']);
die;
}
$stamp = md5(serialize($argv))."_".time();
@@ -175,7 +158,7 @@ foreach ($argv as $target) {
if (!$p['disable_artwork']) {
$mimecmd = $p['metaflacbin']." --list --block-type=PICTURE ".escapeshellarg($files[0])." | head -10 | grep MIME | sed 's:.*/::'";
$mimecmd = escapeshellarg($p['metaflacbin'])." --list --block-type=PICTURE ".escapeshellarg($files[0])." | head -10 | grep MIME | sed 's:.*/::'";
addline($mimecmd);
$mime = exec($mimecmd);
if ($mime == " MIME type:") {
@@ -187,7 +170,7 @@ foreach ($argv as $target) {
addline("embedded cover found in ".$files[0]);
$coverdest = $workdir."cover.".$mime;
exec($p['metaflacbin']." --export-picture-to=".escapeshellarg($coverdest)." ".escapeshellarg($files[0]));
exec(escapeshellarg($p['metaflacbin'])." --export-picture-to=".escapeshellarg($coverdest)." ".escapeshellarg($files[0]));
if (file_exists($coverdest)) { $usecover = $coverdest; } else { addline ("error extracting file"); }
} elseif ($extcover = findCover($target)) {
@@ -228,13 +211,13 @@ foreach ($argv as $target) {
addline("Processing ".$file);
if ($p['check']) {
if (exec($p['flacbin']." -ts ".escapeshellarg($file)." 2>&1")) {
if (exec(escapeshellarg($p['flacbin'])." -ts ".escapeshellarg($file)." 2>&1")) {
addline("Skipping corrupted flac: ".$file);
continue;
}
}
$tagcmd = $p['soxbin']." --i -a ".escapeshellarg($file);
$tagcmd = escapeshellarg($p['soxbin'])." --i -a ".escapeshellarg($file);
if (!$p['disable_tags']) {
@@ -246,8 +229,8 @@ foreach ($argv as $target) {
$dest = $destdir.basename($file,".flac").".mp3";
$lockfile = $workdir.md5($target).".".basename($file,".flac").".lock";
$cmd_flac = $p['flacbin']." -dcs -- ".escapeshellarg($file);
$cmd_lame = $p['lamebin']." -S ".$p['lameopts']." --id3v2-utf16 ".$tags." ".$covertags." - ".escapeshellarg($dest);
$cmd_flac = escapeshellarg($p['flacbin'])." -dcs -- ".escapeshellarg($file);
$cmd_lame = escapeshellarg($p['lamebin'])." -S ".$p['lameopts']." --id3v2-utf16 ".$tags." ".$covertags." - ".escapeshellarg($dest);
$cmd_lock = "touch ".escapeshellarg($lockfile);
$line[] = $cmd_flac." | ".$cmd_lame." ; ".$cmd_lock;
@@ -310,7 +293,7 @@ if ($p['ding']) {
$pass[] = 1;
}
$cmd = "open -n ".__DIR__."/Parallel.app --args ".implode(" ",$pass);
$cmd = "open -n ".escapeshellarg(__DIR__."/bin/Parallel.app")." --args ".implode(" ",$pass);
addline($cmd);
exec($cmd);

70
Minat.platypus Normal file
View File

@@ -0,0 +1,70 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>AcceptsFiles</key>
<true/>
<key>AcceptsText</key>
<false/>
<key>Authentication</key>
<false/>
<key>Author</key>
<string>profiteroles</string>
<key>BundledFiles</key>
<array>
<string>/Volumes/Code/Minat/bin</string>
<string>/Volumes/Code/Minat/master/current_version.txt</string>
<string>/Volumes/Code/Minat/master/functions.php</string>
<string>/Volumes/Code/Minat/master/prefs.php</string>
<string>/Volumes/Code/Minat/master/Minat.php</string>
<string>/Volumes/Code/Minat/master/MinatPrefs.php</string>
<string>/Volumes/Code/Minat/master/hr.png</string>
</array>
<key>Creator</key>
<string>Platypus-5.3</string>
<key>DeclareService</key>
<false/>
<key>DevelopmentVersion</key>
<false/>
<key>Droppable</key>
<true/>
<key>IconPath</key>
<string>/Volumes/Code/Minat/master/icon.icns</string>
<key>Identifier</key>
<string>org.profiteroles.Minat</string>
<key>InterfaceType</key>
<string>Droplet</string>
<key>InterpreterPath</key>
<string>/usr/bin/php</string>
<key>Name</key>
<string>Minat</string>
<key>NibPath</key>
<string>/Volumes/Code/Minat/master/MainMenu.nib</string>
<key>OptimizeApplication</key>
<true/>
<key>Overwrite</key>
<false/>
<key>PromptForFileOnLaunch</key>
<false/>
<key>RemainRunning</key>
<true/>
<key>RunInBackground</key>
<false/>
<key>ScriptPath</key>
<string>/Volumes/Code/Minat/master/script</string>
<key>TextBackground</key>
<string>#ffffff</string>
<key>TextFont</key>
<string>Monaco</string>
<key>TextForeground</key>
<string>#000000</string>
<key>TextSize</key>
<real>13</real>
<key>UniformTypes</key>
<array>
<string>public.folder</string>
</array>
<key>Version</key>
<string>0.0.0.0</string>
</dict>
</plist>

View File

@@ -1,16 +1,121 @@
<?php
// MinatPrefs 0.1.0
// MinatPrefs
//
// Includes
function makeWindowString($p, $strings) {
require (__DIR__."/functions.php");
require (__DIR__."/functions.pashua.php");
$conf = "
# Set window title
*.title = Preferences
*.floating = 1
hr.type = image
hr.path = ".__DIR__."/hr.png"."
hr.width = 320
hr.height = 2
hr.x = 0
hr.y = 564
mode.type = popup
mode.label = Minat Operation
mode.option = ".$strings[2][0]."
mode.option = ".$strings[2][1]."
mode.option = ".$strings[2][2]."
mode.default = ".$strings[2][$p['mode']]."
mode.width = 320
mode.rely = 20
mode.disabled = 1
dest.type = popup
dest.label = Destination
dest.option = ".$strings[0][0]."
dest.option = ".$strings[0][1]."
dest.option = ".$strings[0][2]."
dest.default = ".$strings[0][$p['dest']]."
dest.width = 160
destpath.type = openbrowser
destpath.filetype = directory
destpath.label = Custom destination
destpath.default = ".$p['destpath']."
destpath.width = 320
lameopts.type = textfield
lameopts.label = LAME flags
lameopts.default = ".$p['lameopts']."
lameopts.placeholder = -h -b 320 --ignore-tag-errors
lameopts.width = 320
check.type = checkbox
check.label = Check flacs
check.default = ".$p['check']."
warn_art.type = checkbox
warn_art.label = Warn for missing art
warn_art.default = ".$p['warn_art']."
warn_art.x = 120
warn_art.y = 338
template.type = textfield
template.label = Rename template
template.default = ".$p['template']."
template.placeholder = ^ARTIST^ - ^YEAR^ - ^ALBUM^ {LABEL CAT} [FORMAT]
template.width = 320
template.disabled = 1
spec_dims_x.type = textfield
spec_dims_x.label = Spec dimensions
spec_dims_x.default = ".$p['spec_dims'][0]."
spec_dims_x.width = 60
spec_dims_x.disabled = 1
spec_dims_y.type = textfield
spec_dims_y.default = ".$p['spec_dims'][1]."
spec_dims_y.width = 60
spec_dims_y.x = 80
spec_dims_y.y = 214
spec_dims_y.disabled = 1
postflight.type = popup
postflight.label = When finished
postflight.option = ".$strings[1][0]."
postflight.option = ".$strings[1][1]."
postflight.option = ".$strings[1][2]."
postflight.option = ".$strings[1][3]."
postflight.default = ".$strings[1][$p['postflight']]."
postflight.width = 160
handler.type = openbrowser
handler.filetype = app
handler.label = Handler application
handler.default = ".$p['handler']."
handler.width = 320
stay_open.type = checkbox
stay_open.label = Stay open
stay_open.default = ".$p['stay_open']."
ding.type = checkbox
ding.label = Ding
ding.default = ".$p['ding']."
ding.x = 100
ding.y = 48
cb.type = cancelbutton
db.type = defaultbutton
db.label = Save
";
return $conf;
}
// Read Prefs
$p = unserialize(file_get_contents(__DIR__."/prefs.php"));
$prefs_file = "/Users/".get_current_user()."/Library/Preferences/org.profiteroles.Minat.php";
$p = unserialize(file_get_contents($prefs_file));
if(!$p['destpath']) {
$p['destpath'] = "/Users/".get_current_user()."/Desktop";
}
@@ -21,8 +126,19 @@ $strings[] = array("Temp","Inline","Custom (specify below)");
$strings[] = array("Do nothing","Quicklook","Show in Finder","Open with handler (specify below)");
$strings[] = array("Rename","Transcode","Spectrogram");
$result = Pashua::showDialog(makeWindowString($p, $strings));
// Launch Pashua and parse results
$path = __DIR__."/bin/Pashua.app/Contents/MacOS/Pashua";
$raw = shell_exec("echo ".escapeshellarg(makeWindowString($p, $strings))." | ".escapeshellarg($path)." - ");
$result = array();
foreach (explode("\n", $raw) as $line) {
preg_match('/^(\w+)=(.*)$/', $line, $matches);
if (empty($matches) or empty($matches[1])) {
continue;
}
$result[$matches[1]] = $matches[2];
}
// User cancelled
if (@$result['cb']) {
@@ -43,13 +159,13 @@ if(!$p['destpath']) {
$p['destpath'] = "/Users/".get_current_user()."/Desktop";
}
// Fix a fucking Pashua bug
// Fix a Pashua bug
$result['destpath'] = str_replace("Desktop/Desktop","Desktop",$result['destpath']);
// Write Prefs
file_put_contents("prefs.php",serialize($result));
file_put_contents($prefs_file,serialize($result));
echo "1";
?>

BIN
Parallel/.DS_Store vendored

Binary file not shown.

View File

@@ -0,0 +1,70 @@
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>AcceptsFiles</key>
<false/>
<key>AcceptsText</key>
<false/>
<key>Authentication</key>
<false/>
<key>Author</key>
<string>profiteroles</string>
<key>BundledFiles</key>
<array>
<string>/Volumes/Code/Minat/bin/parallel</string>
<string>/Volumes/Code/Minat/master/Parallel/ding.mp3</string>
</array>
<key>Creator</key>
<string>Platypus-5.2</string>
<key>DeclareService</key>
<false/>
<key>DevelopmentVersion</key>
<false/>
<key>Droppable</key>
<false/>
<key>IconPath</key>
<string>/Volumes/Code/Minat/master/Parallel/icon.icns</string>
<key>Identifier</key>
<string>org.profiteroles.Parallel</string>
<key>InterfaceType</key>
<string>Progress Bar</string>
<key>InterpreterPath</key>
<string>/usr/bin/php</string>
<key>Name</key>
<string>Parallel</string>
<key>NibPath</key>
<string>/Volumes/Code/Minat/master/Parallel/MainMenu.nib</string>
<key>OptimizeApplication</key>
<true/>
<key>Overwrite</key>
<false/>
<key>PromptForFileOnLaunch</key>
<false/>
<key>RemainRunning</key>
<false/>
<key>RunInBackground</key>
<true/>
<key>ScriptArgs</key>
<array/>
<key>ScriptPath</key>
<string>/Volumes/Code/Minat/master/Parallel/Parallel.php</string>
<key>TextBackground</key>
<string>#ffffff</string>
<key>TextFont</key>
<string>Monaco</string>
<key>TextForeground</key>
<string>#000000</string>
<key>TextSize</key>
<real>13</real>
<key>UniformTypes</key>
<array>
<string>public.item</string>
<string>public.folder</string>
</array>
<key>UseXMLPlistFormat</key>
<false/>
<key>Version</key>
<string>0.1.0.0</string>
</dict>
</plist>

BIN
Parallel/icon.icns Normal file

Binary file not shown.

File diff suppressed because it is too large Load Diff

View File

@@ -1,31 +1,27 @@
<img align="left" src="https://www.profiteroles.org/assets/minat.png" style="float: left; margin-right: 30px;" width="120">
<img align='left' src='icon.iconset/icon_512x512.png' width='128'>
# Minat
**Minat** is a simple multithreaded audio transcoder for Mac OS. Minat supports one operation: transcoding flac to mp3, preserving tags and album artwork. Written in PHP, Minat is lightweight and easy to modify.
**Minat** is a simple multithreaded audio transcoder for macOS. Minat supports one operation: transcoding flac to mp3, preserving tags and album artwork. Written in PHP, Minat is lightweight and easy to modify.
Support is planned for two other operations:
* Generate specs from audio files supported by sox
* Rename folders based on the tags of the audio files inside
* **⇩ [Download Minat 0.1.7](https://www.profiteroles.org/downloads/Minat_0.1.7.zip)**
####[⇩ Download Minat 0.1.8.0](https://git1.profiteroles.org/p/Minat/raw/master/Minat.app.zip) ([Changelog](CHANGELOG.md))
## Screenshot
## Screenshots
<img src="https://www.profiteroles.org/assets/minat_prefs.png" width="400">
<img src='screenshot_1.png' width='475'>
## Notes
Running Minat requires disabling Gatekeeper by running `sudo spctl --master-disable` in the Terminal.
## Changelog
http://git.profiteroles.org/profiteroles/Minat/src/branch/master/CHANGELOG.md
Running Minat may require 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
* https://github.com/BlueM/Pashua

BIN
bin/.DS_Store vendored

Binary file not shown.

BIN
bin/flac

Binary file not shown.

BIN
bin/lame

Binary file not shown.

Binary file not shown.

BIN
bin/sox

Binary file not shown.

1
current_version.txt Executable file
View File

@@ -0,0 +1 @@
0.1.8.0

View File

@@ -1,165 +0,0 @@
<?php
// Pashua Stuff
/**
* Static class which wraps the two simple methods used for communicating with Pashua
*/
class Pashua
{
/**
* Invokes a Pashua dialog window with the given window configuration
*
* @param string $conf Configuration string to pass to Pashua
* @param string $customLocation Filesystem path to directory containing Pashua
*
* @throws \RuntimeException
* @return array Associative array of values returned by Pashua
*/
public static function showDialog($conf, $customLocation = null)
{
if (ini_get('safe_mode')) {
$msg = "To use Pashua you will have to disable safe mode or " .
"change " . __FUNCTION__ . "() to fit your environment.\n";
fwrite(STDERR, $msg);
exit(1);
}
// Write configuration string to temporary config file
$configfile = tempnam('/tmp', 'Pashua_');
if (false === $fp = @fopen($configfile, 'w')) {
throw new \RuntimeException("Error trying to open $configfile");
}
fwrite($fp, $conf);
fclose($fp);
$path = __DIR__."/Pashua.app/Contents/MacOS/Pashua";
// Call pashua binary with config file as argument and read result
$result = shell_exec(escapeshellarg($path) . ' ' . escapeshellarg($configfile));
@unlink($configfile);
// Parse result
$parsed = array();
foreach (explode("\n", $result) as $line) {
preg_match('/^(\w+)=(.*)$/', $line, $matches);
if (empty($matches) or empty($matches[1])) {
continue;
}
$parsed[$matches[1]] = $matches[2];
}
return $parsed;
}
}
function makeWindowString($p, $strings) {
$conf = "
# Set window title
*.title = Preferences
*.floating = 1
hr.type = image
hr.path = ".__DIR__."/hr.png"."
hr.width = 320
hr.height = 2
hr.x = 0
hr.y = 564
mode.type = popup
mode.label = Minat Operation
mode.option = ".$strings[2][0]."
mode.option = ".$strings[2][1]."
mode.option = ".$strings[2][2]."
mode.default = ".$strings[2][$p['mode']]."
mode.width = 320
mode.rely = 20
mode.disabled = 1
dest.type = popup
dest.label = Destination
dest.option = ".$strings[0][0]."
dest.option = ".$strings[0][1]."
dest.option = ".$strings[0][2]."
dest.default = ".$strings[0][$p['dest']]."
dest.width = 160
destpath.type = openbrowser
destpath.filetype = directory
destpath.label = Custom destination
destpath.default = ".$p['destpath']."
destpath.width = 320
lameopts.type = textfield
lameopts.label = LAME flags
lameopts.default = ".$p['lameopts']."
lameopts.placeholder = -h -b 320 --ignore-tag-errors
lameopts.width = 320
check.type = checkbox
check.label = Check flacs
check.default = ".$p['check']."
warn_art.type = checkbox
warn_art.label = Warn for missing art
warn_art.default = ".$p['warn_art']."
warn_art.x = 120
warn_art.y = 338
template.type = textfield
template.label = Rename template
template.default = ".$p['template']."
template.placeholder = ^ARTIST^ - ^YEAR^ - ^ALBUM^ {LABEL CAT} [FORMAT]
template.width = 320
template.disabled = 1
spec_dims_x.type = textfield
spec_dims_x.label = Spec dimensions
spec_dims_x.default = ".$p['spec_dims'][0]."
spec_dims_x.width = 60
spec_dims_x.disabled = 1
spec_dims_y.type = textfield
spec_dims_y.default = ".$p['spec_dims'][1]."
spec_dims_y.width = 60
spec_dims_y.x = 80
spec_dims_y.y = 214
spec_dims_y.disabled = 1
postflight.type = popup
postflight.label = When finished
postflight.option = ".$strings[1][0]."
postflight.option = ".$strings[1][1]."
postflight.option = ".$strings[1][2]."
postflight.option = ".$strings[1][3]."
postflight.default = ".$strings[1][$p['postflight']]."
postflight.width = 160
handler.type = openbrowser
handler.filetype = app
handler.label = Handler application
handler.default = ".$p['handler']."
handler.width = 320
stay_open.type = checkbox
stay_open.label = Stay open
stay_open.default = ".$p['stay_open']."
ding.type = checkbox
ding.label = Ding
ding.default = ".$p['ding']."
ding.x = 100
ding.y = 48
cb.type = cancelbutton
db.type = defaultbutton
db.label = Save
";
return $conf;
}
?>

Binary file not shown.

After

Width:  |  Height:  |  Size: 6.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

BIN
icon.iconset/icon_16x16.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.0 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 13 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

BIN
icon.iconset/icon_32x32.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 31 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 43 KiB

BIN
screenshot_1.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 333 KiB

5
script Executable file
View File

@@ -0,0 +1,5 @@
<?php
require(__DIR__."/Minat.php");
?>

View File

@@ -1 +0,0 @@
0.1.7