-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathArtist.php
144 lines (124 loc) · 3.21 KB
/
Artist.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
<?php
namespace App\Models;
use App\Facades\Util;
use App\Traits\SupportsDeleteWhereIDsNotIn;
use Illuminate\Database\Eloquent\Collection;
use Illuminate\Database\Eloquent\Model;
use Illuminate\Database\Eloquent\Relations\HasMany;
use Illuminate\Database\Eloquent\Relations\HasManyThrough;
/**
* @property int id The model ID
* @property string name The artist name
* @property string image
* @property bool is_unknown
* @property bool is_various
* @property Collection songs
* @property bool has_image
*/
class Artist extends Model
{
use SupportsDeleteWhereIDsNotIn;
const UNKNOWN_ID = 1;
const UNKNOWN_NAME = 'Unknown Artist';
const VARIOUS_ID = 2;
const VARIOUS_NAME = 'Various Artists';
protected $guarded = ['id'];
protected $hidden = ['created_at', 'updated_at'];
/**
* An artist can have many albums.
*
* @return HasMany
*/
public function albums()
{
return $this->hasMany(Album::class);
}
/**
* An artist can have many songs.
* Unless he is Rick Astley.
*
* @return HasManyThrough
*/
public function songs()
{
return $this->hasManyThrough(Song::class, Album::class);
}
/**
* Indicate if the artist is unknown.
*
* @return bool
*/
public function getIsUnknownAttribute()
{
return $this->id === self::UNKNOWN_ID;
}
/**
* Indicate if the artist is the special "Various Artists".
*
* @return bool
*/
public function getIsVariousAttribute()
{
return $this->id === self::VARIOUS_ID;
}
/**
* Get the "Various Artists" object.
*
* @return Artist
*/
public static function getVariousArtist()
{
return self::find(self::VARIOUS_ID);
}
/**
* Sometimes the tags extracted from getID3 are HTML entity encoded.
* This makes sure they are always sane.
*
* @param $value
*
* @return string
*/
public function getNameAttribute($value)
{
return html_entity_decode($value ?: self::UNKNOWN_NAME);
}
/**
* Get an Artist object from their name.
* If such is not found, a new artist will be created.
*
* @param string $name
*
* @return Artist
*/
public static function get($name)
{
// Remove the BOM from UTF-8/16/32, as it will mess up the database constraints.
if ($encoding = Util::detectUTFEncoding($name)) {
$name = mb_convert_encoding($name, 'UTF-8', $encoding);
}
$name = trim($name) ?: self::UNKNOWN_NAME;
return self::firstOrCreate(compact('name'), compact('name'));
}
/**
* Turn the image name into its absolute URL.
*
* @param mixed $value
*
* @return string|null
*/
public function getImageAttribute($value)
{
return $value ? app()->staticUrl("public/img/artists/$value") : null;
}
public function getHasImageAttribute()
{
$image = array_get($this->attributes, 'image');
if (!$image) {
return false;
}
if (!file_exists(public_path("public/img/artists/$image"))) {
return false;
}
return true;
}
}