Skip to content

Commit 10ca851

Browse files
committed
Added album artist ✨
1 parent 8f6d73e commit 10ca851

File tree

21 files changed

+1418
-1320
lines changed

21 files changed

+1418
-1320
lines changed

Mp3ID3Tagger/Base.lproj/Main.storyboard

Lines changed: 37 additions & 12 deletions
Large diffs are not rendered by default.

Mp3ID3Tagger/View/Mp3ID3TaggerViewController.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ class Mp3ID3TaggerViewController: NSViewController, BindableView {
2121
@IBOutlet weak var titleTextField: NSTextField!
2222
@IBOutlet weak var artistTextField: NSTextField!
2323
@IBOutlet weak var albumTextField: NSTextField!
24+
@IBOutlet weak var albumArtistField: NSTextField!
2425
@IBOutlet weak var yearTextField: NSTextField!
2526
@IBOutlet weak var trackPositionTextField: NSTextField!
2627
@IBOutlet weak var totalTracksTextField: NSTextField!
@@ -38,6 +39,7 @@ class Mp3ID3TaggerViewController: NSViewController, BindableView {
3839
(titleTextField.rx.text <-> viewModel.form.basicSongFields.title).disposed(by: disposeBag)
3940
(artistTextField.rx.text <-> viewModel.form.basicSongFields.artist).disposed(by: disposeBag)
4041
(albumTextField.rx.text <-> viewModel.form.basicSongFields.album).disposed(by: disposeBag)
42+
(albumArtistField.rx.text <-> viewModel.form.basicSongFields.albumArtist).disposed(by: disposeBag)
4143
(yearTextField.rx.text <-> viewModel.form.basicSongFields.year).disposed(by: disposeBag)
4244
(versionPopUpbutton.rx.selectedItemTag <-> viewModel.form.versionField.version).disposed(by: disposeBag)
4345
(trackPositionTextField.rx.text <-> viewModel.form.trackPositionInSetFields.trackPosition).disposed(by: disposeBag)

Mp3ID3Tagger/ViewModel/Form/Fields/BasicSongFields.swift

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,16 +8,36 @@
88
import Foundation
99
import RxSwift
1010

11+
typealias BasicSongFieldsValues = (title: String?, artist: String?, album: String?, albumArtist: String?, year: String?)
12+
1113
class BasicSongFields {
1214
let title: Variable<String?>
1315
let artist: Variable<String?>
1416
let album: Variable<String?>
17+
let albumArtist: Variable<String?>
1518
let year: Variable<String?>
1619

1720
init() {
1821
self.title = Variable<String?>(nil)
1922
self.artist = Variable<String?>(nil)
2023
self.album = Variable<String?>(nil)
24+
self.albumArtist = Variable<String?>(nil)
2125
self.year = Variable<String?>(nil)
2226
}
27+
28+
func observe() -> Observable<BasicSongFieldsValues> {
29+
return Observable.combineLatest(
30+
title.asObservable(),
31+
artist.asObservable(),
32+
album.asObservable(),
33+
albumArtist.asObservable(),
34+
year.asObservable()
35+
) { title, artist, album, albumArtist, year in
36+
return BasicSongFieldsValues(title: title,
37+
artist: artist,
38+
album: album,
39+
albumArtist: albumArtist,
40+
year: year)
41+
}
42+
}
2343
}

Mp3ID3Tagger/ViewModel/Form/Form.swift

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -26,21 +26,19 @@ class Form {
2626

2727
func readFields() -> Observable<ID3Tag> {
2828
return Observable.combineLatest(
29-
basicSongFields.title.asObservable(),
30-
basicSongFields.artist.asObservable(),
31-
basicSongFields.album.asObservable(),
32-
basicSongFields.year.asObservable(),
3329
versionField.validVersion,
30+
basicSongFields.observe(),
3431
trackPositionInSetFields.trackPositionInSet,
3532
genreFields.genre,
3633
attachedPictureField.observeAttachPictureCreation()
37-
) { (title, artist, album, year, version, trackPositionInSet, genre, image) -> ID3Tag in
34+
) { (version, basicFields, trackPositionInSet, genre, image) -> ID3Tag in
3835
return ID3Tag(
3936
version: version,
40-
artist: artist,
41-
album: album,
42-
title: title,
43-
year: year,
37+
artist: basicFields.artist,
38+
albumArtist: basicFields.albumArtist,
39+
album: basicFields.album,
40+
title: basicFields.title,
41+
year: basicFields.year,
4442
genre: genre,
4543
attachedPictures: image,
4644
trackPosition: trackPositionInSet
@@ -60,6 +58,7 @@ class Form {
6058
basicSongFields.title.value = id3Tag?.title
6159
basicSongFields.artist.value = id3Tag?.artist
6260
basicSongFields.album.value = id3Tag?.album
61+
basicSongFields.albumArtist.value = id3Tag?.albumArtist
6362
basicSongFields.year.value = id3Tag?.year
6463
}
6564

Mp3ID3TaggerTests/ViewModel/Form/Fields/AttachedPictureFieldTest.swift

Lines changed: 2 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -42,11 +42,7 @@ class AttachedPictureFieldTest: XCTestCase {
4242
]
4343

4444
XCTAssertNil(results[0])
45-
XCTAssertEqual(results[1]?[0].art, expectedAttachedPictures[0].art)
46-
XCTAssertEqual(results[1]?[0].format, expectedAttachedPictures[0].format)
47-
XCTAssertEqual(results[1]?[0].type, expectedAttachedPictures[0].type)
48-
XCTAssertEqual(results[2]?[0].art, expectedAttachedPictures[1].art)
49-
XCTAssertEqual(results[2]?[0].format, expectedAttachedPictures[1].format)
50-
XCTAssertEqual(results[2]?[0].type, expectedAttachedPictures[1].type)
45+
XCTAssertEqual(results[1]?[0], expectedAttachedPictures[0])
46+
XCTAssertEqual(results[2]?[0], expectedAttachedPictures[1])
5147
}
5248
}

Mp3ID3TaggerTests/ViewModel/Form/Fields/GenreFieldsTest.swift

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -39,9 +39,7 @@ class GenreFieldsTest: XCTestCase {
3939
]
4040

4141
XCTAssertNil(result[0])
42-
XCTAssertEqual(result[1]?.identifier, expectedTrackPosition[1]?.identifier)
43-
XCTAssertEqual(result[1]?.description, expectedTrackPosition[1]?.description)
44-
XCTAssertEqual(result[2]?.identifier, expectedTrackPosition[2]?.identifier)
45-
XCTAssertEqual(result[2]?.description, expectedTrackPosition[2]?.description)
42+
XCTAssertEqual(result[1], expectedTrackPosition[1])
43+
XCTAssertEqual(result[2], expectedTrackPosition[2])
4644
}
4745
}

Mp3ID3TaggerTests/ViewModel/Form/Fields/TrackPositionInSetFieldsTest.swift

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -40,11 +40,8 @@ class TrackPositionInSetFieldsTests: XCTestCase {
4040
]
4141

4242
XCTAssertNil(result[0])
43-
XCTAssertEqual(result[1]?.position, expectedTrackPosition[1]?.position)
44-
XCTAssertEqual(result[1]?.totalTracks, expectedTrackPosition[1]?.totalTracks)
45-
XCTAssertEqual(result[2]?.position, expectedTrackPosition[2]?.position)
46-
XCTAssertEqual(result[2]?.totalTracks, expectedTrackPosition[2]?.totalTracks)
47-
XCTAssertEqual(result[3]?.position, expectedTrackPosition[3]?.position)
48-
XCTAssertEqual(result[3]?.totalTracks, expectedTrackPosition[3]?.totalTracks)
43+
XCTAssertEqual(result[1], expectedTrackPosition[1])
44+
XCTAssertEqual(result[2], expectedTrackPosition[2])
45+
XCTAssertEqual(result[3], expectedTrackPosition[3])
4946
}
5047
}

Mp3ID3TaggerTests/ViewModel/Form/FormTest.swift

Lines changed: 22 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,7 @@ class FormTest: XCTestCase {
2222
let mockTitleObservable = testScheduler.createHotObservable([Recorded.next(4, "::a title::")])
2323
let mockArtistObservable = testScheduler.createHotObservable([Recorded.next(5, "::an artist::")])
2424
let mockAlbumObservable = testScheduler.createHotObservable([Recorded.next(10, "::an album::")])
25+
let mockAlbumArtistObservable = testScheduler.createHotObservable([Recorded.next(12, "::an album artist::")])
2526
let mockYearObservable = testScheduler.createHotObservable([Recorded.next(15, "::an year::")])
2627
let mockTrackPositionObservable = testScheduler.createHotObservable([Recorded.next(20, "1")])
2728
let mockTotalTracksObservable = testScheduler.createHotObservable([Recorded.next(20, "10")])
@@ -38,6 +39,7 @@ class FormTest: XCTestCase {
3839
mockTitleObservable.bind(to: form.basicSongFields.title).disposed(by: disposeBag)
3940
mockArtistObservable.bind(to: form.basicSongFields.artist).disposed(by: disposeBag)
4041
mockAlbumObservable.bind(to: form.basicSongFields.album).disposed(by: disposeBag)
42+
mockAlbumArtistObservable.bind(to: form.basicSongFields.albumArtist).disposed(by: disposeBag)
4143
mockYearObservable.bind(to: form.basicSongFields.year).disposed(by: disposeBag)
4244
mockVersionObservable.bind(to: form.versionField.version).disposed(by: disposeBag)
4345
mockTrackPositionObservable.bind(to: form.trackPositionInSetFields.trackPosition).disposed(by: disposeBag)
@@ -54,6 +56,7 @@ class FormTest: XCTestCase {
5456
let expectedResult: [ID3Tag] = [
5557
ID3Tag(version: .version3,
5658
artist: "::an artist::",
59+
albumArtist: "::an album artist::",
5760
album: "::an album::",
5861
title: "::a title::",
5962
year: "::an year::",
@@ -62,18 +65,19 @@ class FormTest: XCTestCase {
6265
trackPosition: TrackPositionInSet(position: 1, totalTracks: 10))
6366
]
6467

65-
XCTAssertEqual(result[10].title, expectedResult[0].title)
66-
XCTAssertEqual(result[10].artist, expectedResult[0].artist)
67-
XCTAssertEqual(result[10].album, expectedResult[0].album)
68-
XCTAssertEqual(result[10].year, expectedResult[0].year)
69-
XCTAssertEqual(result[10].properties.version, expectedResult[0].properties.version)
70-
XCTAssertEqual(result[10].trackPosition?.position, expectedResult[0].trackPosition?.position)
71-
XCTAssertEqual(result[10].trackPosition?.totalTracks, expectedResult[0].trackPosition?.totalTracks)
72-
XCTAssertEqual(result[10].genre?.identifier, expectedResult[0].genre?.identifier)
73-
XCTAssertEqual(result[10].genre?.description, expectedResult[0].genre?.description)
74-
XCTAssertEqual(result[10].attachedPictures?[0].type, expectedResult[0].attachedPictures?[0].type)
75-
XCTAssertEqual(result[10].attachedPictures?[0].format, expectedResult[0].attachedPictures?[0].format)
76-
XCTAssertEqual(result[10].attachedPictures?[0].art, expectedResult[0].attachedPictures?[0].art)
68+
XCTAssertEqual(result[11].title, expectedResult[0].title)
69+
XCTAssertEqual(result[11].artist, expectedResult[0].artist)
70+
XCTAssertEqual(result[11].album, expectedResult[0].album)
71+
XCTAssertEqual(result[11].albumArtist, expectedResult[0].albumArtist)
72+
XCTAssertEqual(result[11].year, expectedResult[0].year)
73+
XCTAssertEqual(result[11].properties.version, expectedResult[0].properties.version)
74+
XCTAssertEqual(result[11].trackPosition?.position, expectedResult[0].trackPosition?.position)
75+
XCTAssertEqual(result[11].trackPosition?.totalTracks, expectedResult[0].trackPosition?.totalTracks)
76+
XCTAssertEqual(result[11].genre?.identifier, expectedResult[0].genre?.identifier)
77+
XCTAssertEqual(result[11].genre?.description, expectedResult[0].genre?.description)
78+
XCTAssertEqual(result[11].attachedPictures?[0].type, expectedResult[0].attachedPictures?[0].type)
79+
XCTAssertEqual(result[11].attachedPictures?[0].format, expectedResult[0].attachedPictures?[0].format)
80+
XCTAssertEqual(result[11].attachedPictures?[0].art, expectedResult[0].attachedPictures?[0].art)
7781
}
7882

7983
func testFillFields() {
@@ -82,6 +86,7 @@ class FormTest: XCTestCase {
8286
let observerVersion = testScheduler.createObserver(Int?.self)
8387
let observerArtist = testScheduler.createObserver(String?.self)
8488
let observerAlbum = testScheduler.createObserver(String?.self)
89+
let observerAlbumArtist = testScheduler.createObserver(String?.self)
8590
let observerTitle = testScheduler.createObserver(String?.self)
8691
let observerYear = testScheduler.createObserver(String?.self)
8792
let observerGenreIdentifier = testScheduler.createObserver(Int?.self)
@@ -96,6 +101,7 @@ class FormTest: XCTestCase {
96101
form.versionField.version.asObservable().subscribe(observerVersion).disposed(by: disposeBag)
97102
form.basicSongFields.artist.asObservable().subscribe(observerArtist).disposed(by: disposeBag)
98103
form.basicSongFields.album.asObservable().subscribe(observerAlbum).disposed(by: disposeBag)
104+
form.basicSongFields.albumArtist.asObservable().subscribe(observerAlbumArtist).disposed(by: disposeBag)
99105
form.basicSongFields.title.asObservable().subscribe(observerTitle).disposed(by: disposeBag)
100106
form.basicSongFields.year.asObservable().subscribe(observerYear).disposed(by: disposeBag)
101107
form.genreFields.genreIdentifier.asObservable().subscribe(observerGenreIdentifier).disposed(by: disposeBag)
@@ -106,6 +112,7 @@ class FormTest: XCTestCase {
106112
form.fillFields(using: ID3Tag(
107113
version: .version3,
108114
artist: "::an artist::",
115+
albumArtist: "::an album artist::",
109116
album: "::an album::",
110117
title: "::a title::",
111118
year: "::an year::",
@@ -120,6 +127,7 @@ class FormTest: XCTestCase {
120127
let version = observerVersion.events.map { $0.value.element! }
121128
let artist = observerArtist.events.map { $0.value.element! }
122129
let album = observerAlbum.events.map { $0.value.element! }
130+
let albumArtist = observerAlbumArtist.events.map { $0.value.element! }
123131
let title = observerTitle.events.map { $0.value.element! }
124132
let year = observerYear.events.map { $0.value.element! }
125133
let genreIdentifier = observerGenreIdentifier.events.map { $0.value.element! }
@@ -134,6 +142,8 @@ class FormTest: XCTestCase {
134142
XCTAssertEqual(artist[1], "::an artist::")
135143
XCTAssertNil(album[0])
136144
XCTAssertEqual(album[1], "::an album::")
145+
XCTAssertNil(albumArtist[0])
146+
XCTAssertEqual(albumArtist[1], "::an album artist::")
137147
XCTAssertNil(title[0])
138148
XCTAssertEqual(title[1], "::a title::")
139149
XCTAssertNil(year[0])

Mp3ID3TaggerTests/ViewModel/ID3TagEditor/ID3TagWriterTest.swift

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ class ID3TagWriterTest: XCTestCase {
2020
let id3Tag = ID3Tag(
2121
version: .version3,
2222
artist: "::an artist::",
23+
albumArtist: "::an album artist::",
2324
album: "::an album::",
2425
title: "::a title::",
2526
year: nil,
@@ -47,6 +48,7 @@ class ID3TagWriterTest: XCTestCase {
4748
let id3Tag = ID3Tag(
4849
version: .version3,
4950
artist: nil,
51+
albumArtist: nil,
5052
album: nil,
5153
title: nil,
5254
year: nil,
@@ -73,6 +75,7 @@ class ID3TagWriterTest: XCTestCase {
7375
let id3Tag = ID3Tag(
7476
version: .version3,
7577
artist: "::an artist::",
78+
albumArtist: "::an album artist::",
7679
album: "::an album::",
7780
title: "::a title::",
7881
year: nil,

Podfile

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,10 @@
11
use_frameworks!
2+
platform :osx, '10.13'
23

34
def commonPods
45
pod 'RxSwift', '~> 4.0'
56
pod 'RxCocoa', '~> 4.0'
6-
pod 'ID3TagEditor', '~> 1.1.1'
7+
pod 'ID3TagEditor', '~> 1.2.0'
78
end
89

910
target 'Mp3ID3Tagger' do

0 commit comments

Comments
 (0)