Skip to content

Commit

Permalink
feat: add tracks in order
Browse files Browse the repository at this point in the history
  • Loading branch information
vicholp committed Dec 11, 2023
1 parent c345403 commit 1079915
Show file tree
Hide file tree
Showing 7 changed files with 102 additions and 26 deletions.
2 changes: 1 addition & 1 deletion app/Http/Resources/ReleaseResource.php
Original file line number Diff line number Diff line change
Expand Up @@ -18,7 +18,7 @@ public function toArray($request): array
return [
'id' => $this->id,
'title' => $this->title,
'tracks' => new TrackCollection($this->tracks->load('release')),
'tracks' => new TrackCollection($this->tracks->load('release')->sortBy('track_position')),
'art' => $this->artUrl(),
];
}
Expand Down
2 changes: 2 additions & 0 deletions app/Models/Track.php
Original file line number Diff line number Diff line change
Expand Up @@ -83,6 +83,8 @@ class Track extends Model
'mb_recording_id',
'title',
'mb_data',
'track_position',
'mb_track_id',
];

/**
Expand Down
29 changes: 29 additions & 0 deletions app/Services/Api/MusicBrainzService.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,35 @@ private function getHttp(): PendingRequest
return Http::withHeaders(['User-Agent' => 'Spotifynt/dev ([email protected])']);
}

public function getTrack(string $releaseId, string $trackId): array|false
{
// $cache = Cache::get('mb_track_' . $trackId);

// if ($cache) {
// return $cache;
// }

$release = $this->getRelease($releaseId);

$medias = $release['media'];

foreach ($medias as $media) {
$tracks = $media['tracks'];

foreach ($tracks as $track) {
if ($track['id'] == $trackId) {
// Cache::put('mb_track_' . $trackId, $track);

return $track;
}
}
}



return false;
}

public function getRecording(string $id): array
{
$cache = Cache::get('mb_recording_' . $id);
Expand Down
41 changes: 23 additions & 18 deletions app/Services/SynchronizationService.php
Original file line number Diff line number Diff line change
Expand Up @@ -24,19 +24,6 @@ public function __construct(
//
}

private function searchRecordingInRelease(Release $release, string $id): array|false
{
$data = json_decode($release->mb_data, true)['media'][0]['tracks'];

foreach ($data as $track) {
if ($track['recording']['id'] == $id) {
return $track;
}
}

return false;
}

public function syncServer(Server $server): void
{
$beets = new BeetsService($server);
Expand Down Expand Up @@ -80,24 +67,42 @@ public function syncAlbumFromBeets(BeetsService $beets, Server $server, string $
SyncArtJob::dispatch($release, $server)->onQueue('low');

foreach ($beets_tracks as $beets_track) {
$track = $this->syncTrack($release, $beets_track['mb_trackid']);
$track = $this->syncTrack($release, $beets_track['mb_releasetrackid']);
$server->tracks()->attach($track, [
'path' => $beets_track['path'],
'beets_id' => $beets_track['id'],
]);
}
}

public function syncTrack(Release $release, string $id): Track
public function syncTrack(Release $release, string $trackId): Track
{
$recording = $this->musicBrainzService->getRecording($id);
$mbTrack = $this->musicBrainzService->getTrack($release->mb_release_id, $trackId);
$recordingId = $mbTrack['recording']['id'];

$recording = $this->musicBrainzService->getRecording($recordingId);

$track = Track::whereMbRecordingId($recordingId)
->whereMbTrackId(null)->first();

if ($track) {
$track->update([
'mb_track_id' => $mbTrack['id'],
'mb_data' => json_encode($mbTrack),
]);


return $track;
}

$track = Track::updateOrCreate([
'mb_recording_id' => $recording['id'],
'mb_track_id' => $mbTrack['id'],
], [
'title' => $recording['title'],
'track_position' => $mbTrack['position'],
'release_id' => $release->id,
'mb_data' => json_encode($recording),
'mb_recording_id' => $recordingId,
'mb_data' => json_encode($mbTrack),
]);

return $track;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
<?php

use Illuminate\Database\Migrations\Migration;
use Illuminate\Database\Schema\Blueprint;
use Illuminate\Support\Facades\Schema;

return new class () extends Migration {
/**
* Run the migrations.
*/
public function up(): void
{
Schema::table('tracks', function (Blueprint $table) {
$table->string('mb_track_id', 500)->nullable();
});
}

/**
* Reverse the migrations.
*/
public function down(): void
{
Schema::table('tracks', function (Blueprint $table) {
$table->dropColumn('mb_track_id');
});
}
};
2 changes: 1 addition & 1 deletion resources/js/components/album.vue
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ export default {
},
methods: {
addAlbum(albumId) {
this.playerStore.playlistAddAlbum(albumId);
this.playerStore.playlistAddRelease(albumId);
},
},
};
Expand Down
25 changes: 19 additions & 6 deletions resources/js/store/player/actions.js
Original file line number Diff line number Diff line change
Expand Up @@ -21,15 +21,28 @@ export default {
this.playlistAddTrack(track);
},

async playlistAddAlbum(albumId) {
const album = (await ReleaseApi.show(albumId)).data.data;
async playlistAddRelease(releaseId) {
const release = (await ReleaseApi.show(releaseId)).data.data;
const serverStore = ServerStore();
const serverId = serverStore.activeServer.id;

album.tracks.forEach(track => {
this.playlistAddTrackById(track.id);
});
// first add the first track to the playlist,
// for performance reasons
let firstTrackId = release.tracks[0].id;
this.playlistAddTrack(
(await ServerTrackApi.show(serverId, firstTrackId)).data.data,
);

// then add the rest of the tracks in a async loop
for (let i = 1; i < release.tracks.length; i++) {
let track = release.tracks[i];
this.playlistAddTrack(
(await ServerTrackApi.show(serverId, track.id)).data.data,
);
}

const messagesStore = MessagesStore();
messagesStore.addedTracks(album.tracks.length);
messagesStore.addedTracks(release.tracks.length);
},

async playlistSetIndex(int, relative) {
Expand Down

0 comments on commit 1079915

Please sign in to comment.