itch 1.0.2 → 1.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/README.txt +106 -5
- data/lib/itch.rb +49 -43
- data/test/test_itch.rb +9 -1
- metadata +2 -2
data/README.txt
CHANGED
@@ -5,7 +5,93 @@ itch - Control Helper for ITunes - Perform operations on iTunes tracks.
|
|
5
5
|
|
6
6
|
== Usage
|
7
7
|
|
8
|
-
|
8
|
+
Program help:
|
9
|
+
-h, --help Display program help.
|
10
|
+
Playback controls:
|
11
|
+
-p, --play-pause If currently paused, begin playing. If currently playing, pause playback.
|
12
|
+
--pause Pause playback.
|
13
|
+
--play Play the current track.
|
14
|
+
-s, --stop Stop playback.
|
15
|
+
-n, --next-track Go to the next track.
|
16
|
+
-N, --previous-track Go to the previous track.
|
17
|
+
-m, --mute Mute the audio.
|
18
|
+
-M, --unmute Unmute the audio.
|
19
|
+
-v, --volume number Set the volume to X percentage points.
|
20
|
+
--volume-down [number] Decrease the volume by X percentage points (default 10).
|
21
|
+
--volume-up [number] Increase the volume by X percentage points (default 10).
|
22
|
+
--scan-to seconds Scan to an offset X seconds within the current track.
|
23
|
+
--scan-backwards [seconds] Scan backwards X seconds within the current track (default 10).
|
24
|
+
--scan-forwards [seconds] Scan forwards X seconds within the current track (default 10).
|
25
|
+
--play-file name Play the specified file or folder.
|
26
|
+
Info on selected tracks:
|
27
|
+
-i, --print-info format For each track, print information in the given format. If the following strings appear in the given format, they will be replaced with the corresponding track information:
|
28
|
+
"%a": artist
|
29
|
+
"%e": encoding
|
30
|
+
"%A": album
|
31
|
+
"%b": BPM (beats per minute)
|
32
|
+
"%c": composer
|
33
|
+
"%C": comment
|
34
|
+
"%d": disc number
|
35
|
+
"%D": disc count
|
36
|
+
"%E": Enabled status ("enabled" or "disabled")
|
37
|
+
"%l": location (file name/URL)
|
38
|
+
"%p": play count
|
39
|
+
"%q": equalizer
|
40
|
+
"%g": genre
|
41
|
+
"%G": grouping
|
42
|
+
"%n": name (title)
|
43
|
+
"%r": rating
|
44
|
+
"%s": skip count
|
45
|
+
"%t": track number
|
46
|
+
"%T": track count
|
47
|
+
"%v": volume adjustment
|
48
|
+
"%y": year
|
49
|
+
"%%": percent sign
|
50
|
+
General iTunes controls:
|
51
|
+
-a, --add-file name Add the specified file or folder to the library.
|
52
|
+
-q, --quit Exit iTunes.
|
53
|
+
--open-url url Open the given URL.
|
54
|
+
--goto-store-home-page Go to the Store.
|
55
|
+
--update-ipod Update the iPod.
|
56
|
+
Playlist selection:
|
57
|
+
--library Operation will include the entire iTunes library. Used by default unless other libraries are selected.
|
58
|
+
--current-playlist Operation will include the current playlist.
|
59
|
+
--playlist name Operation will include the named playlist. (This option can occur more than once.)
|
60
|
+
--all-playlists Operation will include all playlists.
|
61
|
+
--create-playlist name Create a playlist with the specified name and include it in the operation. (This option can occur more than once.)
|
62
|
+
--delete-playlist name Delete the playlist with the specified name. (This option can occur more than once.)
|
63
|
+
Track selection:
|
64
|
+
-f, --find string Operation will include all tracks in the specified playlist(s) where any field matches the specified string. (This option can occur more than once.)
|
65
|
+
-c, --current-track Operation will inclue the current track.
|
66
|
+
--selected-tracks Operation will include the selected tracks.
|
67
|
+
--all-tracks Operation will include all tracks in the specified playlist(s).
|
68
|
+
--visible-find string Operation will include all tracks in the specified playlist(s) where any visible field matches the specified string. (This option can occur more than once.)
|
69
|
+
--find-artist string Operation will include all tracks in the specified playlist(s) where the artist matches the specified string. (This option can occur more than once.)
|
70
|
+
--find-album string Operation will include all tracks in the specified playlist(s) where the album matches the specified string. (This option can occur more than once.)
|
71
|
+
--find-composer string Operation will include all tracks in the specified playlist(s) where the composer matches the specified string. (This option can occur more than once.)
|
72
|
+
--find-track-name string Operation will include all tracks in the specified playlist(s) where the track name matches the specified string. (This option can occur more than once.)
|
73
|
+
-F, --play-found Play the first of the selected tracks.
|
74
|
+
Set track info:
|
75
|
+
--set-artist name Set the artist for each track.
|
76
|
+
--set-album name Set the album for each track.
|
77
|
+
--set-bpm number Set the beats per minute for each track.
|
78
|
+
--set-comment string Set the comment for each track.
|
79
|
+
--set-composer string Set the composer for each track.
|
80
|
+
--set-disc-number number For each track, set the disc number. (Used with multi-disc albums.)
|
81
|
+
--set-disc-count number For each track, set the number of discs in the album. (Used with multi-disc albums.)
|
82
|
+
--set-enabled Enable the check box for each track.
|
83
|
+
--set-disabled Disable the check box for each track.
|
84
|
+
--set-eq name Set the equalizer to the named preset. Use 'None' to disable.
|
85
|
+
--set-genre name Set the genre for each track.
|
86
|
+
--set-grouping string Set the grouping for each track.
|
87
|
+
--set-name name Set the name (title) for each track.
|
88
|
+
--set-play-count number Set the play count for each track.
|
89
|
+
--set-rating number Set the rating for each track. Valid values are 0 through 5.
|
90
|
+
--set-skip-count number Set the skip count for each track.
|
91
|
+
--set-track-number number For each track, set its album track number.
|
92
|
+
--set-track-count number For each track, set the number of tracks on its album.
|
93
|
+
--set-track-volume percent Set the volume adjustment percentage for each track, from -100 to 100. Negative numbers decrease the volume, positive numbers increase it. 0 means no adjustment.
|
94
|
+
--set-year number Set the year of publication for each track.
|
9
95
|
|
10
96
|
|
11
97
|
== Description
|
@@ -20,21 +106,32 @@ You can also add tracks to the library, sync your iPod, and perform a variety of
|
|
20
106
|
|
21
107
|
Get help:
|
22
108
|
|
23
|
-
itch
|
109
|
+
itch -h
|
24
110
|
|
25
|
-
Start up iTunes
|
111
|
+
Start up iTunes (if necessary) and begin playing:
|
26
112
|
|
27
|
-
itch
|
113
|
+
itch -p
|
28
114
|
|
29
115
|
Find and play a song:
|
30
116
|
|
31
|
-
itch
|
117
|
+
itch -f "mookid" -F
|
32
118
|
|
33
119
|
Find all songs from an artist, show basic info on them, and play the first found:
|
34
120
|
|
121
|
+
itch -f "aphex twin" -i "%a - %A - %t - %n" -F
|
122
|
+
|
123
|
+
You can improve readability in batch files by specifying options in long form:
|
124
|
+
|
35
125
|
itch --find "aphex twin" --print-info "%a - %A - %t - %n" --play-found
|
36
126
|
|
37
127
|
|
128
|
+
== Installation
|
129
|
+
|
130
|
+
* Windows (without Ruby): Visit the project site (see below), download and run the Windows installer.
|
131
|
+
|
132
|
+
* With Ruby: {{{gem install itch}}}
|
133
|
+
|
134
|
+
|
38
135
|
== Building from Source
|
39
136
|
|
40
137
|
The setup should be fairly standard for anyone familiar with Rake. There are a few external dependencies; see below for links.
|
@@ -59,6 +156,10 @@ iTunes: http://www.apple.com/itunes/
|
|
59
156
|
|
60
157
|
Thanks to Eden Li and Gary Wright for various Ruby advice and assistance.
|
61
158
|
|
159
|
+
NullSoft Scriptable Install System is used to make the Windows installer; thanks to its authors.
|
160
|
+
|
161
|
+
RubyScript2Exe is used to make the Windows executable; thanks to Erik Veenstra for pulling off this seemingly impossible feat!
|
162
|
+
|
62
163
|
|
63
164
|
== Author
|
64
165
|
|
data/lib/itch.rb
CHANGED
@@ -33,26 +33,29 @@ class Itch
|
|
33
33
|
|
34
34
|
#Define valid options with descriptions.
|
35
35
|
options = OptionParser.new
|
36
|
-
options.
|
37
|
-
|
36
|
+
options.separator("Program help:")
|
37
|
+
options.on("-h", "--help", TrueClass, "Display program help.") {
|
38
|
+
puts options.help
|
38
39
|
exit
|
39
40
|
}
|
40
|
-
options.
|
41
|
-
options.on("--
|
42
|
-
options.on("--
|
43
|
-
options.on("--
|
44
|
-
options.on("
|
45
|
-
options.on("
|
46
|
-
options.on("--
|
47
|
-
options.on("
|
48
|
-
options.on("
|
49
|
-
options.on("--
|
50
|
-
options.on("--
|
51
|
-
options.on("--
|
52
|
-
options.on("--
|
53
|
-
options.on("--
|
54
|
-
options.on("--
|
55
|
-
options.on("--
|
41
|
+
options.separator("Playback controls:")
|
42
|
+
options.on("-p", "--play-pause", TrueClass, "If currently paused, begin playing. If currently playing, pause playback.") {|value| config['play-pause'] = value}
|
43
|
+
options.on("--pause", TrueClass, "Pause playback.") {|value| config['pause'] = value}
|
44
|
+
options.on("--play", TrueClass, "Play the current track.") {|value| config['play'] = value}
|
45
|
+
options.on("-s", "--stop", TrueClass, "Stop playback.") {|value| config['stop'] = value}
|
46
|
+
options.on("-n", "--next-track", TrueClass, "Go to the next track.") {|value| config['next-track'] = value}
|
47
|
+
options.on("-N", "--previous-track", TrueClass, "Go to the previous track.") {|value| config['previous-track'] = value}
|
48
|
+
options.on("-m", "--mute", TrueClass, "Mute the audio.") {|value| config['mute'] = value}
|
49
|
+
options.on("-M", "--unmute", TrueClass, "Unmute the audio.") {|value| config['unmute'] = value}
|
50
|
+
options.on("-v", "--volume number", Integer, "Set the volume to X percentage points.") {|value| config['volume'] = value}
|
51
|
+
options.on("--volume-down [number]", Integer, "Decrease the volume by X percentage points (default 10).") {|value| config['volume-down'] = value || 10}
|
52
|
+
options.on("--volume-up [number]", Integer, "Increase the volume by X percentage points (default 10).") {|value| config['volume-up'] = value || 10}
|
53
|
+
options.on("--scan-to seconds", Integer, "Scan to an offset X seconds within the current track.") {|value| config['scan-to'] = value}
|
54
|
+
options.on("--scan-backwards [seconds]", Integer, "Scan backwards X seconds within the current track (default 10).") {|value| config['scan-backwards'] = value || 10}
|
55
|
+
options.on("--scan-forwards [seconds]", Integer, "Scan forwards X seconds within the current track (default 10).") {|value| config['scan-forwards'] = value || 10}
|
56
|
+
options.on("--play-file name", Object, "Play the specified file or folder.") {|value| config['play-file'] = value}
|
57
|
+
options.separator("Info on selected tracks:")
|
58
|
+
options.on("-i", "--print-info format", Object, "For each track, print information in the given format. If the following strings appear in the given format, they will be replaced with the corresponding track information:",
|
56
59
|
%q#"%a": artist#,
|
57
60
|
%q#"%e": encoding#,
|
58
61
|
%q#"%A": album#,
|
@@ -76,7 +79,31 @@ class Itch
|
|
76
79
|
%q#"%y": year#,
|
77
80
|
%q#"%%": percent sign#
|
78
81
|
) {|value| config['print-info'] = value}
|
79
|
-
options.
|
82
|
+
options.separator("General iTunes controls:")
|
83
|
+
options.on("-a", "--add-file name", Object, "Add the specified file or folder to the library.") {|value| (config['add-file'] ||= []) << value}
|
84
|
+
options.on("-q", "--quit", TrueClass, "Exit iTunes.") {|value| config['quit'] = value}
|
85
|
+
options.on("--open-url url", Object, "Open the given URL.") {|value| config['open-url'] = value}
|
86
|
+
options.on("--goto-store-home-page", TrueClass, "Go to the Store.") {|value| config['goto-store-home-page'] = value}
|
87
|
+
options.on("--update-ipod", TrueClass, "Update the iPod.") {|value| config['update-ipod'] = value}
|
88
|
+
options.separator("Playlist selection:")
|
89
|
+
options.on("--library", TrueClass, "Operation will include the entire iTunes library. Used by default unless other libraries are selected.") {|value| config['library'] = value}
|
90
|
+
options.on("--current-playlist", TrueClass, "Operation will include the current playlist.") {|value| config['current-playlist'] = value}
|
91
|
+
options.on("--playlist name", Object, "Operation will include the named playlist. (This option can occur more than once.)") {|value| (config['playlist'] ||= []) << value}
|
92
|
+
options.on("--all-playlists", TrueClass, "Operation will include all playlists.") {|value| config['all-playlists'] = value}
|
93
|
+
options.on("--create-playlist name", Object, "Create a playlist with the specified name and include it in the operation. (This option can occur more than once.)") {|value| (config['create-playlist'] ||= []) << value}
|
94
|
+
options.on("--delete-playlist name", Object, "Delete the playlist with the specified name. (This option can occur more than once.)") {|value| (config['delete-playlist'] ||= []) << value}
|
95
|
+
options.separator("Track selection:")
|
96
|
+
options.on("-f", "--find string", Object, "Operation will include all tracks in the specified playlist(s) where any field matches the specified string. (This option can occur more than once.)") {|value| (config['find'] ||= []) << value}
|
97
|
+
options.on("-c", "--current-track", TrueClass, "Operation will inclue the current track.") {|value| config['current-track'] = value}
|
98
|
+
options.on("--selected-tracks", TrueClass, "Operation will include the selected tracks.") {|value| config['selected-tracks'] = value}
|
99
|
+
options.on("--all-tracks", TrueClass, "Operation will include all tracks in the specified playlist(s).") {|value| config['all-tracks'] = value}
|
100
|
+
options.on("--visible-find string", Object, "Operation will include all tracks in the specified playlist(s) where any visible field matches the specified string. (This option can occur more than once.)") {|value| (config['visible-find'] ||= []) << value}
|
101
|
+
options.on("--find-artist string", Object, "Operation will include all tracks in the specified playlist(s) where the artist matches the specified string. (This option can occur more than once.)") {|value| (config['find-artist'] ||= []) << value}
|
102
|
+
options.on("--find-album string", Object, "Operation will include all tracks in the specified playlist(s) where the album matches the specified string. (This option can occur more than once.)") {|value| (config['find-album'] ||= []) << value}
|
103
|
+
options.on("--find-composer string", Object, "Operation will include all tracks in the specified playlist(s) where the composer matches the specified string. (This option can occur more than once.)") {|value| (config['find-composer'] ||= []) << value}
|
104
|
+
options.on("--find-track-name string", Object, "Operation will include all tracks in the specified playlist(s) where the track name matches the specified string. (This option can occur more than once.)") {|value| (config['find-track-name'] ||= []) << value}
|
105
|
+
options.on("-F", "--play-found", TrueClass, "Play the first of the selected tracks.") {|value| config['play-found'] = value}
|
106
|
+
options.separator("Set track info:")
|
80
107
|
options.on("--set-artist name", Object, "Set the artist for each track.") {|value| config['set-artist'] = value}
|
81
108
|
options.on("--set-album name", Object, "Set the album for each track.") {|value| config['set-album'] = value}
|
82
109
|
options.on("--set-bpm number", Integer, "Set the beats per minute for each track.") {|value| config['set-bpm'] = value}
|
@@ -95,28 +122,8 @@ class Itch
|
|
95
122
|
options.on("--set-skip-count number", Integer, "Set the skip count for each track.") {|value| config['set-skip-count'] = value}
|
96
123
|
options.on("--set-track-number number", Integer, "For each track, set its album track number.") {|value| config['set-track-number'] = value}
|
97
124
|
options.on("--set-track-count number", Integer, "For each track, set the number of tracks on its album.") {|value| config['set-track-count'] = value}
|
98
|
-
options.on("--set-volume
|
125
|
+
options.on("--set-track-volume percent", Integer, "Set the volume adjustment percentage for each track, from -100 to 100. Negative numbers decrease the volume, positive numbers increase it. 0 means no adjustment.") {|value| config['set-track-volume'] = value}
|
99
126
|
options.on("--set-year number", Integer, "Set the year of publication for each track.") {|value| config['set-year'] = value}
|
100
|
-
options.on("--volume number", Integer, "Set the volume to X percentage points.") {|value| config['volume'] = value}
|
101
|
-
options.on("--volume-down [number]", Integer, "Decrease the volume by X percentage points (default 10).") {|value| config['volume-down'] = value || 10}
|
102
|
-
options.on("--volume-up [number]", Integer, "Increase the volume by X percentage points (default 10).") {|value| config['volume-up'] = value || 10}
|
103
|
-
options.on("--mute", TrueClass, "Mute the audio.") {|value| config['mute'] = value}
|
104
|
-
options.on("--unmute", TrueClass, "Unmute the audio.") {|value| config['unmute'] = value}
|
105
|
-
options.on("--scan-to seconds", Integer, "Scan to an offset X seconds within the current track.") {|value| config['scan-to'] = value}
|
106
|
-
options.on("--scan-backwards [seconds]", Integer, "Scan backwards X seconds within the current track (default 10).") {|value| config['scan-backwards'] = value || 10}
|
107
|
-
options.on("--scan-forwards [seconds]", Integer, "Scan forwards X seconds within the current track (default 10).") {|value| config['scan-forwards'] = value || 10}
|
108
|
-
options.on("--next-track", TrueClass, "Go to the next track.") {|value| config['next-track'] = value}
|
109
|
-
options.on("--pause", TrueClass, "Pause playback.") {|value| config['pause'] = value}
|
110
|
-
options.on("--play", TrueClass, "Play the current track.") {|value| config['play'] = value}
|
111
|
-
options.on("--play-file name", Object, "Play the specified file or folder.") {|value| config['play-file'] = value}
|
112
|
-
options.on("--play-pause", TrueClass, "If currently paused, begin playing. If currently playing, pause playback.") {|value| config['play-pause'] = value}
|
113
|
-
options.on("--previous-track", TrueClass, "Go to the previous track.") {|value| config['previous-track'] = value}
|
114
|
-
options.on("--stop", TrueClass, "Stop playback.") {|value| config['stop'] = value}
|
115
|
-
options.on("--add-file name", Object, "Add the specified file or folder to the library.") {|value| (config['add-file'] ||= []) << value}
|
116
|
-
options.on("--open-url url", Object, "Open the given URL.") {|value| config['open-url'] = value}
|
117
|
-
options.on("--goto-store-home-page", TrueClass, "Go to the Store.") {|value| config['goto-store-home-page'] = value}
|
118
|
-
options.on("--update-ipod", TrueClass, "Update the iPod.") {|value| config['update-ipod'] = value}
|
119
|
-
options.on("--quit", TrueClass, "Exit iTunes.") {|value| config['quit'] = value}
|
120
127
|
|
121
128
|
#Parse the options, printing usage if parsing fails.
|
122
129
|
options.parse(arguments) rescue puts "#{$!}\nType '#{$0} --help' for valid options."
|
@@ -281,7 +288,7 @@ class Itch
|
|
281
288
|
specified?(config, 'set-skip-count') {|v| track.SkippedCount = v}
|
282
289
|
specified?(config, 'set-track-count') {|v| track.TrackCount = v}
|
283
290
|
specified?(config, 'set-track-number') {|v| track.TrackNumber = v}
|
284
|
-
specified?(config, 'set-volume
|
291
|
+
specified?(config, 'set-track-volume') {|v| track.VolumeAdjustment = v}
|
285
292
|
specified?(config, 'set-year') {|v| track.Year = v}
|
286
293
|
specified?(config, 'print-info') {|v| puts track_info(track, v)}
|
287
294
|
specified?(config, 'set-artist') {|v| track.Artist = v}
|
@@ -364,6 +371,5 @@ class Itch
|
|
364
371
|
def specified? (config, key)
|
365
372
|
yield config[key] if config.has_key?(key)
|
366
373
|
end
|
367
|
-
|
368
|
-
|
374
|
+
|
369
375
|
end
|
data/test/test_itch.rb
CHANGED
@@ -81,6 +81,14 @@ class TestItch < Test::Unit::TestCase
|
|
81
81
|
assert(config['find'].include?('baz'))
|
82
82
|
assert(config['find'].include?('eep'))
|
83
83
|
|
84
|
+
#Test short options.
|
85
|
+
config = @helper.parse_options [
|
86
|
+
'-p',
|
87
|
+
'-v', '100',
|
88
|
+
]
|
89
|
+
assert_not_nil(config['play-pause'])
|
90
|
+
assert_equal(100, config['volume'])
|
91
|
+
|
84
92
|
end
|
85
93
|
|
86
94
|
|
@@ -220,7 +228,7 @@ class TestItch < Test::Unit::TestCase
|
|
220
228
|
test('set-skip-count', track, 'SkippedCount=')
|
221
229
|
test('set-track-count', track, 'TrackCount=')
|
222
230
|
test('set-track-number', track, 'TrackNumber=')
|
223
|
-
test('set-volume
|
231
|
+
test('set-track-volume', track, 'VolumeAdjustment=')
|
224
232
|
test('set-year', track, 'Year=')
|
225
233
|
#Test specialized attribute setting.
|
226
234
|
@helper.perform_track_operations({'set-enabled' => true}, [track])
|
metadata
CHANGED
@@ -3,8 +3,8 @@ rubygems_version: 0.9.2
|
|
3
3
|
specification_version: 1
|
4
4
|
name: itch
|
5
5
|
version: !ruby/object:Gem::Version
|
6
|
-
version: 1.0.
|
7
|
-
date: 2007-
|
6
|
+
version: 1.0.3
|
7
|
+
date: 2007-05-07 00:00:00 -07:00
|
8
8
|
summary: Allows control of iTunes for Windows via a command line.
|
9
9
|
require_paths:
|
10
10
|
- lib
|