Here's a piece of an EDL that I'm editing -
012 A005C004_22031_RPNV
*FROM CLIP NAME: A005C004_22031_RPNV
M2 AX 048.0
013 A003C002_220228_RPNV
*FROM CLIP NAME: A003C002_220228_RPNV
M2 AX 048.0
014 A005C004_220301_RPNV
*FROM CLIP NAME: A005C004_220301_RPNV
M2 AX 048.0
015 A005C007_220301_RPNV
*FROM CLIP NAME: A005C007_220301_RPNV
M2 AX 048.0
016 A005C001_220301_RPNV
*FROM CLIP NAME: A005C001_220301_RPNV
M2 AX 048.0
Using Applescript + regex, how would I go about creating a script to replace the 'AX' field after the M2 instance for the entire edl in BB edit? The M2 is a recurring comment and I would need to replace every 'AX' with the text field that appears after 'from clip name.'
Thanks!
Well, this might not be the most elegant regex ever written, but the following code should show you how to use BBEdit's grep-replace feature. YOU can tweak the result as you see fit:
tell application "BBEdit"
-- this assumes the text you're working on is the frontmost document
-- in the frontmost window of BBEDit
tell window 1
tell document 1
-- the double-backslashes (\\) are because regex backslashes
-- need to be escaped inside AppleScript strings
set searchString to "FROM CLIP NAME: ([A-Z0-9_]+)\\nM2 AX"
set replaceString to "FROM CLIP NAME: \\1\\nM2 \\1"
replace searchString using replaceString options {search mode:grep, starting at top:true}
end tell
end tell
end tell
Related
I have dozens of mp3 files where the filename contains Greek letters. I would like to rename them to "latin only characters" so that the title etc. is displayed correctly on all common playback devices.
It takes a long time to do this manually, so I need your help.
Is there a simple bash script that can do this job?
as example:
I want the script to rename the file from σαγαπώ.mp3 to sagapo.mp3
edit://
I was now able to rename the file name with a python script.
Of:
Βασίλης Μπατής - Ζημιά _ Vasilis Mpatis - Zimia _ Official Video Clip HQ 2017.mp3
would:
Basilis Mpatis - Zimia _ Vasilis Mpatis - Zimia _ Official Video Clip HQ 2017.mp3
So far so good, now the question is how do I get rid of all "unnecessary" information from the file name, so that in the end only the artist and title remain as file names.
This is what the file name should look like at the end.
Basilis Mpatis - Zimia.mp3
Anyone an idea?
Here is my Python script:
import os
# Pfad zum Ordner mit den MP3-Dateien
path = '/home/sakis/mp3'
# Alle MP3-Dateien im Ordner durchlaufen
for file in os.listdir(path):
if file.endswith('.mp3'):
# Aktuellen Dateinamen speichern und in Unicode umwandeln
old_name = file.encode('utf-8').decode('utf-8')
# Dateinamen in zwei Teile trennen
name, extension = old_name.rsplit('.', 1)
# Griechische Buchstaben im Dateinamen ersetzen
new_name = old_name.replace('Ά', 'A').replace('Έ', 'E').replace('Ή', 'H').replace('Ί', 'I').replace('Ό', 'O').replace('Ύ', 'Y').replace('Ώ', 'W').replace('ΐ', 'I').replace('Α', 'A').replace('Β', 'B').replace('Γ', 'G').replace('Δ', 'D').replace('Ε', 'E').replace('Ζ', 'Z').replace('Η', 'H').replace('Θ', 'TH').replace('Ι', 'I').replace('Κ', 'K').replace('Λ', 'L').replace('Μ', 'M').replace('Ν', 'N').replace('Ξ', 'X').replace('Ο', 'O').replace('Π', 'P').replace('Ρ', 'R').replace('Σ', 'S').replace('Τ', 'T').replace('Υ', 'Y').replace('Φ', 'F').replace('Χ', 'X').replace('Ψ', 'PS').replace('Ω', 'O').replace('ά', 'a').replace('έ', 'e').replace('ή', 'i').replace('ί', 'i').replace('ό', 'o').replace('ύ', 'y').replace('ώ', 'w').replace('ϊ', 'i').replace('ϋ', 'u').replace('ό', 'o').replace('α', 'a').replace('β', 'b').replace('γ', 'g').replace('δ', 'd').replace('ε', 'e').replace('ζ', 'z').replace('η', 'i').replace('θ', 'th').replace('ι', 'i').replace('κ', 'k').replace('λ', 'l').replace('μ', 'm').replace('ν', 'n').replace('ξ', 'x').replace('ο', 'o').replace('π', 'p').replace('ρ', 'r').replace('ς', 's').replace('σ', 's').replace('τ', 't').replace('υ', 'y').replace('φ', 'f').replace('χ', 'x').replace('ψ', 'ps').replace('ω', 'o')
# Alle weiteren Zeichen im Dateinamen entfernen
name = ''.join(c for c in name if c.isalnum() or c in [' ', '-', '_'])
# Neuen Dateinamen setzen
os.rename(os.path.join(path, old_name), os.path.join(path, new_name))
print('Done!')
You need to define your own tranlsation table, because nobody can guess how you want to translate the names. Assume that the greek name is stored in variable greek_name, something like this could do:
english_name=$(tr αβΓγΔδεΖζ... avGgDdeZz... $greek_name)
Of course you have to make compromises: Since for instance the letter υ can be pronounced as "i", "f" or as "w" depending on the context, you have to settle for one.
Another problem is that several greek letters are pronounced the same; for instance, Ο and Ω. If you don't manage to map them uniquely, it might happen that two greek file names map to the same english file name. Therefore, when you do the renaming, make sure that you get at least an error message in this case:
if ! mv -n "$greek_name" "$english_name"
then
echo Can not rename "$greek_name", because "$english_name" already exists
fi
UPDATE:
It's not clear how you would translate i.e. ψ, as the most natural mapping would be to use two charcaters, "ps". You could either use an english letter which has no equivalent in Greek anyway ('c' comes to my mind), or you translate these special cases in a separate step, for instance:
# english_name could still contain a ψ because this
# was not handled by `tr`
english_name=${english_name//ψ/ps}
You have of course make up your mind whether you want the upper case Ψ being translated into PS or Ps.
You have not specified how you want to use in translation the English letter b. In Greek, this sound is written as νπ, i.e. two Greek letters map to a single English one. If you want to implement this mapping, you have to do it before the one-to-one translation done by tr, for instance:
# Already preprocess νπ before translating the other
# Greek letters:
greek_name=${greek_name//νπ/b}
greek_name=${greek_name//Ν[πΠ]/B}
This reflects the idea that a Greek word starting with Νπ is meant to be a word starting with an upper case letter, and ΝΠ is meant to start an all-upper-case word, both corresponding to an upper-case B in English.
I've created a script that appends whatever's on my clipboard to an Apple note. However, the formatting of the appended text is not preserved, not even the line formatting. How to I append the clipboard to the note while preserving the LINE formatting of the clipboard? I don't care as much about the other formatting, although it would be nice to preserve it if possible.
Also, I would like the text to be appended as a new line with a line break in between the pre-existing and appended text, and the text size of the entire note—including the pre-existing and appended text—to be 18 points.
set AppendText to (the clipboard)
tell application "Notes"
tell account "iCloud"
tell folder "Clipboard"
set OriginalText to the body of note 1 -- the contents of the notes are encoded in HTML
end tell
end tell
end tell
tell application "Notes"
tell account "iCloud"
tell folder "Clipboard"
set body of note 1 to {"<div style=\"font-size: 18px\">" & OriginalText & "<br>" & AppendText & "</div>"}
end tell
end tell
end tell
Suppose that the pre-existing text of the note is
Original text line 1
Original text line 2
Original text line 3
and that the text that needs to be appended is
Append text line 1
Append text line 2
Append text line 3
When I run the script the text of the note is set to
Original text line 1
Original text line 2
Original text line 3
Append text line 1 Append text line 2 Append text line 3
Whereas I want it to be
Original text line 1
Original text line 2
Original text line 3
Append text line 1
Append text line 2
Append text line 3
Since the body of the note is HTML, one solution would be to use the textutil utility to convert the append text before adding (the Notes application handles merging the HTML), for example:
set appendText to (the clipboard)
set convertedText to (do shell script "echo " & quoted form of appendText & " | textutil -convert html -excludedelements '(p)' -stdin -stdout")
tell application "Notes"
tell folder "Whatever" -- example
set originalText to body of note 1
set body of note 1 to originalText & convertedText
end tell
end tell
Thanks to red_menace and user3439894, I've completed the script. Here it is.
set appendText to (the clipboard)
set convertedText to (do shell script "echo " & quoted form of appendText & ¬
" | textutil -convert html -fontsize 18 -excludedelements '(p)' -stdin -stdout")
tell application "Notes"
tell account "iCloud"
tell folder "Clipboard"
set originalText to the body of note 1
if originalText as string is "" then
set body of note 1 to {"<div style=\"font-size: 18px\">" & convertedText & "</div>"}
else
set body of note 1 to {"<div style=\"font-size: 18px\">" & originalText & ¬
"</div><div><span style=\"font-size: 18px\"><br></span></div> <div style=\"font-size: 18px\">" & ¬
convertedText & "</div>"}
end if
end tell
end tell
end tell
I am trying to remove all the formating from the data in the clipboard.
The input is like this:
Name: William R Wells
Date of Birth: 8 Dec 1942
Birth Place: Fayette, Kentucky, USA
Mother's name: Suda Hatton
Volume Number: 179
Certificate Number: 89145
Volume Year: 1942
I want it to look like this:
Name: William R Wells, Date of Birth: 8 Dec 1942, Birth Place: Fayette, Kentucky, USA, Mother's name: Suda Hatton, Volume Number: 179, Certificate, Number: 89145, Volume Year: 1942
This script works but does not delete the extra spaces and place a comma after the data.
try
do shell script "export LC_CTYPE=UTF-8; pbpaste | fmt -w 99999 | pbcopy"
end try
end
Any suggestions?
Thanks
Roger
Here's an AppleScript that will do the job. Not sure it's the most efficient way, but it works.
use framework "Foundation"
use scripting additions
--------------------------------------------------------------------------------
get the clipboard as text
re_match from the result against "\t+" given replacement:" "
re_match from the result against "[\r\n]" given replacement:", "
re_match from the result against " +" given replacement:" "
set the clipboard to the result
--------------------------------------------------------------------------------
###HANDLERS
on re_match against pattern from str given replacement:fmt
set regex to current application's NSRegularExpression's ¬
regularExpressionWithPattern:pattern ¬
options:(current application's ¬
NSRegularExpressionCaseInsensitive) ¬
|error|:(missing value)
(regex's stringByReplacingMatchesInString:str ¬
options:0 range:{0, length of str} ¬
withTemplate:fmt) ¬
as text
end re_match
This next AppleScript is much simpler and shorter but less versatile. However, if your clipboard contents is largely the same in format, it should be as effective as the above script.
set str to the clipboard as text
set text item delimiters to {null, tab}
set str to text items of str as text
set the text item delimiters to {", ", linefeed, return}
set str to text items of str as text
set the text item delimiters to {": ", ":"}
set str to text items of str as text
set the clipboard to str
My script searches a website for songs, but when there are spaces it doesn't search, you have to add underscores. I was wondering if there was a way to replace my spaces with underscores.
Could you please use my current code below to show me how to do it?
set search to text returned of (display dialog "Enter song you wish to find" default answer "" buttons {"Search", "Cancel"} default button 1)
open location "http://www.mp3juices.com/search/" & search
end
Note: The solution no longer works as of Big Sur (macOS 11) - it sounds like a bug; do tell us if you have more information.
Try the following:
set search to text returned of (display dialog "Enter song you wish to find" default answer "" buttons {"Search", "Cancel"} default button 1)
do shell script "open 'http://www.mp3juices.com/search/'" & quoted form of search
end
What you need is URL encoding (i.e., encoding of a string for safe inclusion in a URL), which involves more than just replacing spaces.
The open command-line utility, thankfully, performs this encoding for you, so you can just pass it the string directly; you need do shell script to invoke open, and quoted form of ensures that the string is passed through unmodified (to be URI-encoded by open later).
As you'll see, the kind of URL encoding open performs replaces spaces with %20, not underscores, but that should still work.
mklement0's answer is correct about url encoding but mp3juices uses RESTful URLs (clean URLs). RESTful URLs want's to keep the URL human readable and you won't see/use typical hex values in your url presenting an ASCII number. A snake_case, as you have mentioned (is false), but it is pretty common to use an substitution for whitespaces (%20) (and other characters) in RESTful URLs. However the slug of an RESTful must be converted to RESTful's own RESTful encoding before it can be handled by standard URL encoding.
set search to text returned of (display dialog "Enter song you wish to find" default answer "" buttons {"Search", "Cancel"} default button 1)
set search to stringReplace(search, space, "-")
do shell script "open 'http://www.mp3juices.com/search/'" & quoted form of search
on stringReplace(theText, searchString, replaceString)
set {oldTID, AppleScript's text item delimiters} to {AppleScript's text item delimiters, searchString}
set textItems to every text item of theText
set AppleScript's text item delimiters to replaceString
set newText to textItems as string
set AppleScript's text item delimiters to oldTID
return newText
end stringReplace
EDIT: updated the code, unlike the question mentioned that spaces are converted to underscores, mp3juice uses hyphens as substitution for whitespaces.
An update on this, despite the fact that the answer is 3 years old, as I faced the same problem: on recent versions of macOS/OS X/Mac OS X (I think, 10.10 or later), you can use ASOC, the AppleScript/Objective-C bridge:
use framework "Foundation"
urlEncode("my search string with [{?#äöü or whatever characters")
on urlEncode(input)
tell current application's NSString to set rawUrl to stringWithString_(input)
set theEncodedURL to rawUrl's stringByAddingPercentEscapesUsingEncoding:4 -- 4 is NSUTF8StringEncoding
return theEncodedURL as Unicode text
end urlEncode
It should be noted that stringByAddingPercentEscapesUsingEncoding is deprecated, but it will take some time until it’s removed from macOS.
URL encoding in AppleScript
For a general use case (for me at the moment to pass any ASCII url containing chars like #, &, ß, ö to the bit.ly API), I stumbled upon a nice code snippet that instantly added full support to my ShortURL clipboard pasting shortcut. Here's a quote from source:
i was looking for a quick and dirty way to encode some data to pass to a url via POST or GET with applescript and Internet Explorer, there were a few OSAXen which have that ability, but i didn't feel like installing anything, so i wrote this thing (works with standard ascii characters, characters above ascii 127 may run into character set issues see: applescript for converting macroman to windows-1252 encoding)
Notes
Double encoding should be duly noted.
Not tested on non-ASCII URLs.
Tested on OS X 10.8.5.
Code
on urlencode(theText)
set theTextEnc to ""
repeat with eachChar in characters of theText
set useChar to eachChar
set eachCharNum to ASCII number of eachChar
if eachCharNum = 32 then
set useChar to "+"
else if (eachCharNum ≠ 42) and (eachCharNum ≠ 95) and (eachCharNum < 45 or eachCharNum > 46) and (eachCharNum < 48 or eachCharNum > 57) and (eachCharNum < 65 or eachCharNum > 90) and (eachCharNum < 97 or eachCharNum > 122) then
set firstDig to round (eachCharNum / 16) rounding down
set secondDig to eachCharNum mod 16
if firstDig > 9 then
set aNum to firstDig + 55
set firstDig to ASCII character aNum
end if
if secondDig > 9 then
set aNum to secondDig + 55
set secondDig to ASCII character aNum
end if
set numHex to ("%" & (firstDig as string) & (secondDig as string)) as string
set useChar to numHex
end if
set theTextEnc to theTextEnc & useChar as string
end repeat
return theTextEnc
end urlencode
If you need to get the URL as a string (not just feed it into open which does a nifty job of encoding for you) and you're not above using a little Automator, you can throw some JavaScript into your AppleScript:
encodeURIComponent is a built in JavaScript function - it is a complete solution for encoding components of URIs.
For copy/pasters, here are all three scripts in the above Automator chain:
on run {input, parameters}
return text returned of (display dialog "Enter song you wish to find" default answer "" buttons {"Search", "Cancel"} default button 1)
end run
function run(input, parameters) {
return encodeURIComponent(input);
}
on run {input, parameters}
display dialog "http://www.mp3juices.com/search/" & input buttons {"okay!"} default button 1
end run
I was hunting around for URL encoding and decoding and came across this helpful link.
Which you can use like so:
set theurl to "https://twitter.com/zackshapiro?format=json"
do shell script "php -r 'echo urlencode(\"" & theurl & "\");'"
# gives me "https%3A%2F%2Ftwitter.com%2Fzackshapiro%3Fformat%3Djson"
set theurl to "https%3A%2F%2Ftwitter.com%2Fzackshapiro%3Fformat%3Djson"
return do shell script "php -r 'echo urldecode(\"" & theurl & "\");'"
# gives me "https://twitter.com/zackshapiro?format=json"
Or as functions:
on encode(str)
do shell script "php -r 'echo urlencode(\"" & str & "\");'"
end encode
on decode(str)
do shell script "php -r 'echo urldecode(\"" & str & "\");'"
end decode
Just so it's said, AppleScriptObjC allows us to use NSString to do the encoding. The script is complicated by the fact that different parts of the URL allow different characters (all of which I've added options for) but in most cases the 'query' option will be used.
See NSCharacterSet's dev page (the section called "Getting Character Sets for URL Encoding") for descriptions of the various URL parts.
use AppleScript version "2.4" -- Yosemite 10.10 or later
use framework "Foundation"
property NSString : class "NSString"
property NSCharacterSet : class "NSCharacterSet"
-- example usage
my percentEncode:"some text" ofType:"query"
on percentEncode:someText ofType:encodeType
set unencodedString to NSString's stringWithString:someText
set allowedCharSet to my charSetForEncodeType:encodeType
set encodedString to unencodedString's stringByAddingPercentEncodingWithAllowedCharacters:allowedCharSet
return encodedString as text
end percentEncode:ofType:
on charSetForEncodeType:encodeType
if encodeType is "path" then
return NSCharacterSet's URLPathAllowedCharacterSet()
else if encodeType is "query" then
return NSCharacterSet's URLQueryAllowedCharacterSet()
else if encodeType is "fragment" then
return NSCharacterSet's URLFragmentAllowedCharacterSet()
else if encodeType is "host" then
return NSCharacterSet's URLHostAllowedCharacterSet()
else if encodeType is "user" then
return NSCharacterSet's URLUserAllowedCharacterSet()
else if encodeType is "password" then
return NSCharacterSet's URLPasswordAllowedCharacterSet()
else
return missing value
end if
end charSetForEncodeType:
The Python Approach:
Find your python3 path (which python3) or if you don't have it, install using brew or miniconda
Now try this:
python_path = /path/to/python3
set search_query to "testy test"
tell application "Google Chrome"
set win to make new window
open location "https://www.google.com/search?q=" & url_encode(q)
end tell
on url_encode(input)
return (do shell script "echo " & input & " | " & python_path & " -c \"import urllib.parse, sys; print(urllib.parse.quote(sys.stdin.read()))\"
")
end url_encode
credits to #Murphy https://stackoverflow.com/a/56321886
I am looking to create a script and was wanting to know if this is something that is possible. I have a little knowledge of applescript. But this one is confusing me.
I have a list of loose files inside of one folder that reads as such.
1111111111 010
1111111111 011
1111111222 012
1111111222 013
1111111222 014
1111111243 020
1111111243 021
Its very random every time. But there is always a 10 digit number that is constant, but I would like to add a sequential number starting with one that resets every time the number changes. So that the file name would look like this.
1111111111_1
1111111111_2
1111111222_1
1111111222_2
1111111222_3
1111111243_1
1111111243_2
Any help is much appreciated. Thanks.
tell application "Finder"
set prev to missing value
repeat with f in (get files of (POSIX file "/Users/username/folder" as alias))
set w1 to word 1 of (get name of f)
if w1 is prev then
set n to n + 1
else
set n to 1
end if
set name of f to w1 & "_" & n
set prev to w1
end repeat
end tell
You could also run a command like this in Terminal:
cd ~/folder;for f in *;do w1=${f% *};[ $prev = $w1 ]&&let n++||n=1;mv "$f" $w1\_$n;prev=$w1;done