mirror of
https://github.com/Poniverse/Pony.fm.git
synced 2024-11-25 06:27:59 +01:00
Further things
This commit is contained in:
parent
8d834f41db
commit
c56568b6f5
45 changed files with 1572 additions and 86 deletions
|
@ -155,7 +155,7 @@ return array(
|
|||
'DB' => 'Illuminate\Support\Facades\DB',
|
||||
'Eloquent' => 'Illuminate\Database\Eloquent\Model',
|
||||
'Event' => 'Illuminate\Support\Facades\Event',
|
||||
'File' => 'Illuminate\Support\Facades\File',
|
||||
// 'File' => 'Illuminate\Support\Facades\File',
|
||||
'Form' => 'Illuminate\Support\Facades\Form',
|
||||
'Hash' => 'Illuminate\Support\Facades\Hash',
|
||||
'HTML' => 'Illuminate\Support\Facades\HTML',
|
||||
|
|
|
@ -5,6 +5,8 @@
|
|||
use Commands\DeleteTrackCommand;
|
||||
use Commands\EditTrackCommand;
|
||||
use Commands\UploadTrackCommand;
|
||||
use Cover;
|
||||
use Entities\Image;
|
||||
use Entities\Track;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Illuminate\Support\Facades\Input;
|
||||
|
@ -51,12 +53,13 @@
|
|||
'is_vocal' => $track->is_vocal,
|
||||
'is_explicit' => $track->is_explicit,
|
||||
'is_downloadable' => $track->is_downloadable,
|
||||
'is_published' => $track->published_at != null,
|
||||
'is_published' => $track->isPublished(),
|
||||
'created_at' => $track->created_at,
|
||||
'published_at' => $track->published_at,
|
||||
'duration' => $track->duration,
|
||||
'genre_id' => $track->genre_id,
|
||||
'track_type_id' => $track->track_type_id,
|
||||
'cover_url' => $track->getCoverUrl(Image::SMALL)
|
||||
];
|
||||
}
|
||||
|
||||
|
@ -78,7 +81,7 @@
|
|||
'slug' => $track->slug,
|
||||
'is_vocal' => (bool)$track->is_vocal,
|
||||
'is_explicit' => (bool)$track->is_explicit,
|
||||
'is_downloadable' => $track->published_at == null ? true : (bool)$track->is_downloadable,
|
||||
'is_downloadable' => !$track->isPublished() ? true : (bool)$track->is_downloadable,
|
||||
'is_published' => $track->published_at != null,
|
||||
'created_at' => $track->created_at,
|
||||
'published_at' => $track->published_at,
|
||||
|
@ -88,7 +91,8 @@
|
|||
'license_id' => $track->license_id != null ? $track->license_id : 3,
|
||||
'description' => $track->description,
|
||||
'lyrics' => $track->lyrics,
|
||||
'released_at' => $track->released_at
|
||||
'released_at' => $track->released_at,
|
||||
'cover_url' => $track->hasCover() ? $track->getCoverUrl(Image::NORMAL) : null
|
||||
], 200);
|
||||
}
|
||||
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<?php
|
||||
|
||||
class FavoritesController extends Controller {
|
||||
class FavouritesController extends Controller {
|
||||
public function getTracks() {
|
||||
return View::make('shared.null');
|
||||
}
|
20
app/controllers/ImagesController.php
Normal file
20
app/controllers/ImagesController.php
Normal file
|
@ -0,0 +1,20 @@
|
|||
<?php
|
||||
|
||||
use Entities\Image;
|
||||
use Entities\Track;
|
||||
use Illuminate\Support\Facades\App;
|
||||
|
||||
class ImagesController extends Controller {
|
||||
public function getImage($id, $type) {
|
||||
$coverType = Image::GetImageTypeFromName($type);
|
||||
|
||||
if ($coverType == null)
|
||||
App::abort(404);
|
||||
|
||||
$image = Image::find($id);
|
||||
if (!$image)
|
||||
App::abort(404);
|
||||
|
||||
return File::inline($image->getFile($coverType['id']), $image->mime, $image->filename);
|
||||
}
|
||||
}
|
|
@ -1,5 +1,8 @@
|
|||
<?php
|
||||
|
||||
use Entities\Track;
|
||||
use Illuminate\Support\Facades\App;
|
||||
|
||||
class TracksController extends Controller {
|
||||
public function getIndex() {
|
||||
return View::make('tracks.index');
|
||||
|
|
19
app/controllers/UsersController.php
Normal file
19
app/controllers/UsersController.php
Normal file
|
@ -0,0 +1,19 @@
|
|||
<?php
|
||||
|
||||
use Entities\Track;
|
||||
use Illuminate\Support\Facades\App;
|
||||
|
||||
class UsersController extends Controller {
|
||||
public function getAvatar($id, $type) {
|
||||
$coverType = Cover::getCoverFromName($type);
|
||||
|
||||
if ($coverType == null)
|
||||
App::abort(404);
|
||||
|
||||
$user = User::find($id);
|
||||
if (!$user)
|
||||
App::abort(404);
|
||||
|
||||
return File::inline($user->getAvatarFile($coverType['id']), 'image/png', 'cover.png');
|
||||
}
|
||||
}
|
|
@ -39,7 +39,6 @@ class CreateTracksTable extends Migration {
|
|||
$table->text('lyrics')->nullable();
|
||||
$table->boolean('is_vocal');
|
||||
$table->boolean('is_explicit');
|
||||
$table->integer('cover_id')->nullable()->unsigned()->default(NULL);
|
||||
$table->boolean('is_downloadable');
|
||||
$table->float('duration')->unsigned();
|
||||
|
||||
|
|
|
@ -0,0 +1,44 @@
|
|||
<?php
|
||||
|
||||
use Illuminate\Database\Migrations\Migration;
|
||||
|
||||
class CreateImagesTable extends Migration {
|
||||
public function up() {
|
||||
Schema::create('images', function($table) {
|
||||
$table->increments('id');
|
||||
$table->string('filename', 256);
|
||||
$table->string('mime', 100);
|
||||
$table->string('extension', 32);
|
||||
$table->integer('size');
|
||||
$table->string('hash', 32);
|
||||
$table->integer('uploaded_by')->unsigned();
|
||||
$table->timestamps();
|
||||
|
||||
$table->foreign('uploaded_by')->references('id')->on('users');
|
||||
});
|
||||
|
||||
Schema::table('users', function($table) {
|
||||
$table->integer('avatar_id')->unsigned()->nullable();
|
||||
$table->foreign('avatar_id')->references('id')->on('images');
|
||||
});
|
||||
|
||||
DB::table('tracks')->update(['cover_id' => null]);
|
||||
|
||||
Schema::table('tracks', function($table) {
|
||||
$table->foreign('cover_id')->references('id')->on('images');
|
||||
});
|
||||
}
|
||||
|
||||
public function down() {
|
||||
Schema::table('tracks', function($table) {
|
||||
$table->dropForeign('tracks_cover_id_foreign');
|
||||
});
|
||||
|
||||
Schema::table('users', function($table) {
|
||||
$table->dropForeign('users_avatar_id_foreign');
|
||||
$table->dropColumn('avatar_id');
|
||||
});
|
||||
|
||||
Schema::drop('images');
|
||||
}
|
||||
}
|
|
@ -45,6 +45,7 @@
|
|||
return new AssetCollection([
|
||||
new FileAsset('scripts/base/jquery-2.0.2.js'),
|
||||
new FileAsset('scripts/base/jquery-ui.js'),
|
||||
new FileAsset('scripts/base/jquery.colorbox.js'),
|
||||
new FileAsset('scripts/base/underscore.js'),
|
||||
new FileAsset('scripts/base/angular.js'),
|
||||
new FileAsset('scripts/base/ui-bootstrap-tpls-0.4.0.js'),
|
||||
|
@ -72,6 +73,7 @@
|
|||
|
||||
$css = new AssetCollection([
|
||||
new FileAsset('styles/base/jquery-ui.css'),
|
||||
new FileAsset('styles/base/colorbox.css'),
|
||||
new FileAsset('styles/app.less'),
|
||||
new CacheBusterAsset($lastModifiedCollection->getLastModified())
|
||||
], [new \Assetic\Filter\LessFilter('node')]);
|
||||
|
|
14
app/library/External.php
Normal file
14
app/library/External.php
Normal file
|
@ -0,0 +1,14 @@
|
|||
<?php
|
||||
|
||||
use Illuminate\Support\Facades\Log;
|
||||
|
||||
class External {
|
||||
public static function execute($command) {
|
||||
$output = [];
|
||||
$error = exec($command, $output);
|
||||
|
||||
if ($error != null) {
|
||||
Log::error('"' . $command . '" failed with "' . $error . '"');
|
||||
}
|
||||
}
|
||||
}
|
32
app/library/File.php
Normal file
32
app/library/File.php
Normal file
|
@ -0,0 +1,32 @@
|
|||
<?php
|
||||
/**
|
||||
* File
|
||||
*
|
||||
* Note: Remember to remove the "File" alias in APP_DIR/config/application.php
|
||||
*
|
||||
* @author Phill Sparks <me@phills.me.uk>
|
||||
*/
|
||||
class File extends \Illuminate\Support\Facades\File
|
||||
{
|
||||
|
||||
public static function inline($path, $mime, $name = null)
|
||||
{
|
||||
if (is_null($name))
|
||||
{
|
||||
$name = basename($path);
|
||||
}
|
||||
|
||||
$response = Response::make(static::get($path));
|
||||
|
||||
$response->header('Content-Type', $mime);
|
||||
$response->header('Content-Disposition', 'inline; filename="'.$name.'"');
|
||||
$response->header('Content-Transfer-Encoding', 'binary');
|
||||
$response->header('Expires', 0);
|
||||
$response->header('Cache-Control', 'must-revalidate, post-check=0, pre-check=0');
|
||||
$response->header('Pragma', 'public');
|
||||
$response->header('Content-Length', filesize($path));
|
||||
|
||||
return $response;
|
||||
}
|
||||
|
||||
}
|
20
app/library/Gravatar.php
Normal file
20
app/library/Gravatar.php
Normal file
|
@ -0,0 +1,20 @@
|
|||
<?php
|
||||
|
||||
class Gravatar {
|
||||
/**
|
||||
* Returns a Gravatar URL
|
||||
*
|
||||
* @param string $email The email address
|
||||
* @param string $s Size in pixels, defaults to 80px [ 1 - 2048 ]
|
||||
* @param string $d Default imageset to use [ 404 | mm | identicon | monsterid | wavatar ]
|
||||
* @param string $r Maximum rating (inclusive) [ g | pg | r | x ]
|
||||
* @return Gravatar URL
|
||||
* @source http://gravatar.com/site/implement/images/php/
|
||||
*/
|
||||
public static function getUrl( $email, $s = 80, $d = 'mm', $r = 'g') {
|
||||
$url = 'http://www.gravatar.com/avatar/';
|
||||
$url .= md5( strtolower( trim( $email ) ) );
|
||||
$url .= "?s=$s&d=$d&r=$r";
|
||||
return $url;
|
||||
}
|
||||
}
|
|
@ -2,7 +2,11 @@
|
|||
|
||||
namespace Commands;
|
||||
|
||||
use Entities\Image;
|
||||
use Entities\Track;
|
||||
use External;
|
||||
use Illuminate\Support\Facades\Auth;
|
||||
use Illuminate\Support\Facades\Log;
|
||||
|
||||
class EditTrackCommand extends CommandBase {
|
||||
private $_trackId;
|
||||
|
@ -60,6 +64,12 @@
|
|||
$track->published_at = new \DateTime();
|
||||
}
|
||||
|
||||
if (isset($this->_input['cover'])) {
|
||||
$cover = $this->_input['cover'];
|
||||
$track->cover_id = Image::Upload($cover, Auth::user())->id;
|
||||
} else
|
||||
$track->cover_id = null;
|
||||
|
||||
$track->save();
|
||||
|
||||
return CommandResponse::succeed();
|
||||
|
|
|
@ -44,14 +44,12 @@
|
|||
$track->save();
|
||||
|
||||
$destination = $track->getDirectory();
|
||||
|
||||
if (!is_dir($destination))
|
||||
mkdir($destination, 755);
|
||||
$track->ensureDirectoryExists();
|
||||
|
||||
$source = $trackFile->getPathname();
|
||||
$index = 0;
|
||||
|
||||
$procs = [];
|
||||
$processes = [];
|
||||
|
||||
foreach (Track::$Formats as $name => $format) {
|
||||
$target = $destination . '/' . $track->getFilenameFor($name);
|
||||
|
@ -65,10 +63,10 @@
|
|||
|
||||
$pipes = [];
|
||||
$proc = proc_open($command, [0 => ['pipe', 'r'], 1 => ['pipe', 'w'], 2 => ['pipe', 'a']], $pipes);
|
||||
$procs[] = $proc;
|
||||
$processes[] = $proc;
|
||||
}
|
||||
|
||||
foreach ($procs as $proc)
|
||||
foreach ($processes as $proc)
|
||||
proc_close($proc);
|
||||
|
||||
} catch (\Exception $e) {
|
||||
|
|
95
app/models/Entities/Image.php
Normal file
95
app/models/Entities/Image.php
Normal file
|
@ -0,0 +1,95 @@
|
|||
<?php
|
||||
|
||||
namespace Entities;
|
||||
|
||||
use External;
|
||||
use Illuminate\Support\Facades\Config;
|
||||
use Illuminate\Support\Facades\URL;
|
||||
|
||||
class Image extends \Eloquent {
|
||||
const NORMAL = 1;
|
||||
const ORIGINAL = 2;
|
||||
const THUMBNAIL = 3;
|
||||
const SMALL = 4;
|
||||
|
||||
public static $ImageTypes = [
|
||||
self::NORMAL => ['id' => self::NORMAL, 'name' => 'normal', 'width' => 350, 'height' => 350],
|
||||
self::ORIGINAL => ['id' => self::ORIGINAL, 'name' => 'original', 'width' => null, 'height' => null],
|
||||
self::SMALL => ['id' => self::SMALL, 'name' => 'small', 'width' => 100, 'height' => 100],
|
||||
self::THUMBNAIL => ['id' => self::THUMBNAIL, 'name' => 'thumbnail', 'width' => 50, 'height' => 50]
|
||||
];
|
||||
|
||||
public static function GetImageTypeFromName($name) {
|
||||
foreach (self::$ImageTypes as $cover) {
|
||||
if ($cover['name'] != $name)
|
||||
continue;
|
||||
|
||||
return $cover;
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
public static function Upload($file, $user) {
|
||||
$hash = md5_file($file->getPathname());
|
||||
$image = Image::whereHash($hash)->whereUploadedBy($user->id)->first();
|
||||
|
||||
if ($image)
|
||||
return $image;
|
||||
|
||||
$image = new Image();
|
||||
try {
|
||||
$image->uploaded_by = $user->id;
|
||||
$image->size = $file->getSize();
|
||||
$image->filename = $file->getClientOriginalName();
|
||||
$image->extension = $file->getClientOriginalExtension();
|
||||
$image->mime = $file->getMimeType();
|
||||
$image->hash = $hash;
|
||||
$image->save();
|
||||
|
||||
$image->ensureDirectoryExists();
|
||||
foreach (self::$ImageTypes as $coverType) {
|
||||
$command = 'convert 2>&1 "' . $file->getPathname() . '" -background transparent -flatten +matte -strip -quality 95 -format png ';
|
||||
if (isset($coverType['width']) && isset($coverType['height']))
|
||||
$command .= '-thumbnail ' . $coverType['width'] . 'x' . $coverType['height'] . '^ -gravity center -extent ' . $coverType['width'] . 'x' . $coverType['height'] . ' ';
|
||||
|
||||
$command .= '"' . $image->getFile($coverType['id']) . '"';
|
||||
External::execute($command);
|
||||
}
|
||||
|
||||
return $image;
|
||||
}
|
||||
catch (\Exception $e) {
|
||||
$image->delete();
|
||||
throw $e;
|
||||
}
|
||||
}
|
||||
|
||||
protected $table = 'images';
|
||||
|
||||
public function getUrl($type = Cover::NORMAL) {
|
||||
$type = self::$ImageTypes[$type];
|
||||
return URL::to('i' . $this->id . '/' . $type['name'] . '.png');
|
||||
}
|
||||
|
||||
public function getFile($type = Cover::NORMAL) {
|
||||
return $this->getDirectory() . '/' . $this->getFilename($type);
|
||||
}
|
||||
|
||||
public function getFilename($type = Cover::NORMAL) {
|
||||
$typeInfo = self::$ImageTypes[$type];
|
||||
return $this->id . '_' . $typeInfo['name'] . '.png';
|
||||
}
|
||||
|
||||
public function getDirectory() {
|
||||
$dir = (string) ( floor( $this->id / 100 ) * 100 );
|
||||
return Config::get('app.files_directory') . '/images/' . $dir;
|
||||
}
|
||||
|
||||
public function ensureDirectoryExists() {
|
||||
$destination = $this->getDirectory();
|
||||
|
||||
if (!is_dir($destination))
|
||||
mkdir($destination, 755, true);
|
||||
}
|
||||
}
|
|
@ -2,6 +2,7 @@
|
|||
|
||||
namespace Entities;
|
||||
|
||||
use Cover;
|
||||
use Whoops\Example\Exception;
|
||||
|
||||
class Track extends \Eloquent {
|
||||
|
@ -16,22 +17,48 @@
|
|||
];
|
||||
|
||||
public static function summary() {
|
||||
return self::select('id', 'title', 'user_id', 'slug', 'is_vocal', 'is_explicit', 'created_at', 'published_at', 'duration', 'is_downloadable', 'genre_id', 'track_type_id');
|
||||
return self::select('id', 'title', 'user_id', 'slug', 'is_vocal', 'is_explicit', 'created_at', 'published_at', 'duration', 'is_downloadable', 'genre_id', 'track_type_id', 'cover_id');
|
||||
}
|
||||
|
||||
protected $table = 'tracks';
|
||||
|
||||
public function ensureDirectoryExists() {
|
||||
$destination = $this->getDirectory();
|
||||
|
||||
if (!is_dir($destination))
|
||||
mkdir($destination, 755);
|
||||
}
|
||||
|
||||
public function hasCover() {
|
||||
return $this->cover_id != null;
|
||||
}
|
||||
|
||||
public function cover() {
|
||||
return $this->belongsTo('Entities\Image');
|
||||
}
|
||||
|
||||
public function isPublished() {
|
||||
return $this->published_at != null && $this->deleted_at == null;
|
||||
}
|
||||
|
||||
public function getCoverUrl($type = Cover::NORMAL) {
|
||||
if (!$this->hasCover())
|
||||
return $this->user->getAvatarUrl($type);
|
||||
|
||||
return $this->cover->getUrl($type);
|
||||
}
|
||||
|
||||
public function getDirectory() {
|
||||
$dir = (string) ( floor( $this->id / 100 ) * 100 );
|
||||
return \Config::get('app.files_directory') . '/tracks/' . $dir;
|
||||
}
|
||||
|
||||
public function getDates() {
|
||||
return ['created_at', 'deleted_at', 'published_at', 'released_at'];
|
||||
}
|
||||
|
||||
public function user() {
|
||||
return $this->belongsTo('User');
|
||||
}
|
||||
|
||||
public function getDirectory() {
|
||||
$dir = (string) ( floor( $this->id / 100 ) * 100 );
|
||||
return \Config::get('app.files_directory') . '/tracks/' . $dir;
|
||||
return $this->belongsTo('Entities\User');
|
||||
}
|
||||
|
||||
public function getFilenameFor($format) {
|
||||
|
|
|
@ -2,6 +2,8 @@
|
|||
|
||||
namespace Entities;
|
||||
|
||||
use Cover;
|
||||
use Gravatar;
|
||||
use Illuminate\Auth\UserInterface;
|
||||
use Illuminate\Auth\Reminders\RemindableInterface;
|
||||
|
||||
|
@ -9,6 +11,14 @@
|
|||
protected $table = 'users';
|
||||
protected $hidden = ['password_hash', 'password_salt', 'bio'];
|
||||
|
||||
public function avatar() {
|
||||
return $this->hasOne('Entities\Image');
|
||||
}
|
||||
|
||||
public function cover() {
|
||||
return $this->belongsTo('Entities\Image');
|
||||
}
|
||||
|
||||
public function getAuthIdentifier() {
|
||||
return $this->getKey();
|
||||
}
|
||||
|
@ -20,4 +30,23 @@
|
|||
public function getReminderEmail() {
|
||||
return $this->email;
|
||||
}
|
||||
|
||||
public function getAvatarUrl($type = Cover::NORMAL) {
|
||||
if (!$this->uses_gravatar)
|
||||
return $this->cover->getUrl();
|
||||
|
||||
$email = $this->gravatar;
|
||||
if (!strlen($email))
|
||||
$email = $this->email;
|
||||
|
||||
return Gravatar::getUrl($email, Image::$ImageTypes[$type]['width']);
|
||||
}
|
||||
|
||||
public function getAvatarFile($type = Cover::NORMAL) {
|
||||
if ($this->uses_gravatar)
|
||||
return $this->user->getAvatar($type);
|
||||
|
||||
$cover = Cover::$Covers[$type];
|
||||
return URL::to('t' . $this->id . '/cover_' . $cover['name'] . '.png?' . $this->cover_id);
|
||||
}
|
||||
}
|
|
@ -25,6 +25,10 @@
|
|||
Route::get('/about', function() { return View::make('pages.about'); });
|
||||
Route::get('/faq', function() { return View::make('pages.faq'); });
|
||||
|
||||
Route::get('i{id}/{type}.png', 'ImagesController@getImage');
|
||||
|
||||
Route::get('u{id}/avatar_{type}.png', 'UsersController@getAvatar');
|
||||
|
||||
Route::group(['prefix' => 'api/web'], function() {
|
||||
Route::get('/taxonomies/all', 'Api\Web\TaxonomiesController@getAll');
|
||||
|
||||
|
@ -47,9 +51,9 @@
|
|||
|
||||
Route::group(['prefix' => 'account'], function() {
|
||||
Route::group(['before' => 'auth'], function(){
|
||||
Route::get('/favorites', 'FavoritesController@getTracks');
|
||||
Route::get('/favorites/albums', 'FavoritesController@getAlbums');
|
||||
Route::get('/favorites/playlists', 'FavoritesController@getPlaylists');
|
||||
Route::get('/favourites', 'FavouritesController@getTracks');
|
||||
Route::get('/favourites/albums', 'FavouritesController@getAlbums');
|
||||
Route::get('/favourites/playlists', 'FavouritesController@getPlaylists');
|
||||
|
||||
Route::get('/content/tracks', 'ContentController@getTracks');
|
||||
Route::get('/content/tracks/{id}', 'ContentController@getTracks');
|
||||
|
|
|
@ -42,7 +42,7 @@
|
|||
<li>
|
||||
<h3>Account</h3>
|
||||
</li>
|
||||
<li ng-class="{selected: $state.includes('account-favorites')}"><a href="/account/favorites">Favorites</a></li>
|
||||
<li ng-class="{selected: $state.includes('account-favourites')}"><a href="/account/favourites">Favourites</a></li>
|
||||
<li ng-class="{selected: $state.includes('account-content')}"><a href="/account/content/tracks">Your Content</a></li>
|
||||
<li ng-class="{selected: isActive('/account')}"><a href="/account">Settings</a></li>
|
||||
@endif
|
||||
|
|
|
@ -30,22 +30,22 @@ angular.module 'ponyfm', ['ui.bootstrap', 'ui.state', 'ui.date'], [
|
|||
url: '/playlists'
|
||||
templateUrl: '/templates/account/content/playlists.html'
|
||||
|
||||
state.state 'account-favorites',
|
||||
url: '/account/favorites'
|
||||
state.state 'account-favourites',
|
||||
url: '/account/favourites'
|
||||
abstract: true
|
||||
templateUrl: '/templates/account/favorites/_layout.html'
|
||||
templateUrl: '/templates/account/favourites/_layout.html'
|
||||
|
||||
state.state 'account-favorites.tracks',
|
||||
state.state 'account-favourites.tracks',
|
||||
url: ''
|
||||
templateUrl: '/templates/account/favorites/tracks.html'
|
||||
templateUrl: '/templates/account/favourites/tracks.html'
|
||||
|
||||
state.state 'account-favorites.playlists',
|
||||
state.state 'account-favourites.playlists',
|
||||
url: '/playlists'
|
||||
templateUrl: '/templates/account/favorites/playlists.html'
|
||||
templateUrl: '/templates/account/favourites/playlists.html'
|
||||
|
||||
state.state 'account-favorites.albums',
|
||||
state.state 'account-favourites.albums',
|
||||
url: '/albums'
|
||||
templateUrl: '/templates/account/favorites/albums.html'
|
||||
templateUrl: '/templates/account/favourites/albums.html'
|
||||
|
||||
# Tracks
|
||||
|
||||
|
|
|
@ -1,6 +1,11 @@
|
|||
angular.module('ponyfm').controller "account-content-tracks", [
|
||||
'$scope', '$state', 'taxonomies', '$dialog'
|
||||
($scope, $state, taxonomies, $dialog) ->
|
||||
'$scope', '$state', 'taxonomies', '$dialog', 'lightbox'
|
||||
($scope, $state, taxonomies, $dialog, lightbox) ->
|
||||
$('#coverPreview').load () ->
|
||||
$scope.$apply -> $scope.isCoverLoaded = true
|
||||
window.alignVertically(this)
|
||||
|
||||
$scope.isCoverLoaded = false
|
||||
$scope.selectedTrack = null
|
||||
$scope.isDirty = false
|
||||
$scope.taxonomies =
|
||||
|
@ -11,6 +16,10 @@ angular.module('ponyfm').controller "account-content-tracks", [
|
|||
$scope.updateIsVocal = () ->
|
||||
delete $scope.errors.lyrics if !$scope.edit.is_vocal
|
||||
|
||||
$scope.previewCover = () ->
|
||||
return if !$scope.edit.cover
|
||||
lightbox.openDataUrl $('#coverPreview').attr 'src'
|
||||
|
||||
$scope.updateTrack = (track) ->
|
||||
xhr = new XMLHttpRequest()
|
||||
xhr.onload = -> $scope.$apply ->
|
||||
|
@ -49,6 +58,8 @@ angular.module('ponyfm').controller "account-content-tracks", [
|
|||
|
||||
if file.type != 'image/png'
|
||||
$scope.errors.cover = 'Cover image must be a png!'
|
||||
$scope.isCoverLoaded = false
|
||||
$scope.edit.cover = null
|
||||
return
|
||||
|
||||
delete $scope.errors.cover
|
||||
|
@ -58,6 +69,10 @@ angular.module('ponyfm').controller "account-content-tracks", [
|
|||
reader.readAsDataURL file
|
||||
$scope.edit.cover = file
|
||||
|
||||
$scope.clearTrackCover = () ->
|
||||
$scope.isCoverLoaded = false
|
||||
delete $scope.edit.cover
|
||||
|
||||
$scope.filters =
|
||||
published: [
|
||||
{title: 'Either', query: ''},
|
||||
|
@ -129,6 +144,7 @@ angular.module('ponyfm').controller "account-content-tracks", [
|
|||
|
||||
selectTrack = (t) ->
|
||||
$scope.selectedTrack = t
|
||||
$scope.isCoverLoaded = false
|
||||
return if !t
|
||||
$.getJSON('/api/web/tracks/edit/' + t.id)
|
||||
.done (track) -> $scope.$apply ->
|
||||
|
|
8
public/scripts/app/services/lightbox.coffee
Normal file
8
public/scripts/app/services/lightbox.coffee
Normal file
|
@ -0,0 +1,8 @@
|
|||
angular.module('ponyfm').factory('lightbox', [
|
||||
() ->
|
||||
openDataUrl: (src) ->
|
||||
$.colorbox
|
||||
html: '<img src="' + src + '" />'
|
||||
transition: 'none'
|
||||
])
|
||||
|
1063
public/scripts/base/jquery.colorbox.js
Normal file
1063
public/scripts/base/jquery.colorbox.js
Normal file
File diff suppressed because it is too large
Load diff
|
@ -7,6 +7,11 @@ window.handleResize = () ->
|
|||
$this = $ this
|
||||
$this.height windowHeight - $this.offset().top
|
||||
|
||||
window.alignVertically = (element) ->
|
||||
$element = $(element)
|
||||
$parent = $element.parent()
|
||||
$element.css 'top', $parent.height() / 2 - $element.height() / 2
|
||||
|
||||
window.handleResize()
|
||||
$(window).resize window.handleResize
|
||||
|
||||
|
|
|
@ -58,8 +58,8 @@
|
|||
.image {
|
||||
width: 32px;
|
||||
height: 32px;
|
||||
background: #444;
|
||||
float: left;
|
||||
display: block;
|
||||
}
|
||||
|
||||
.title {
|
||||
|
@ -119,6 +119,11 @@
|
|||
.cover-upload {
|
||||
overflow: hidden;
|
||||
|
||||
.error {
|
||||
clear: left;
|
||||
margin-top: 14px;
|
||||
}
|
||||
|
||||
input[type=file] {
|
||||
display: none;
|
||||
}
|
||||
|
@ -128,21 +133,37 @@
|
|||
}
|
||||
|
||||
.preview {
|
||||
border: 1px dashed silver;
|
||||
width: 50px;
|
||||
height: 50px;
|
||||
.img-polaroid();
|
||||
overflow: hidden;
|
||||
width: 46px;
|
||||
height: 46px;
|
||||
float: left;
|
||||
|
||||
img {
|
||||
position: relative;
|
||||
display: block;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
&.canOpen {
|
||||
cursor: pointer;
|
||||
|
||||
&:hover {
|
||||
border-color: @blue;
|
||||
border-style: solid;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
p, .btn-group {
|
||||
color: #555;
|
||||
margin-left: 60px;
|
||||
display: block;
|
||||
margin-bottom: 1px;
|
||||
}
|
||||
|
||||
p {
|
||||
font-size: 9pt;
|
||||
color: #555;
|
||||
margin-left: 60px;
|
||||
}
|
||||
}
|
||||
|
||||
|
|
44
public/styles/base/colorbox.css
Normal file
44
public/styles/base/colorbox.css
Normal file
|
@ -0,0 +1,44 @@
|
|||
/*
|
||||
Colorbox Core Style:
|
||||
The following CSS is consistent between example themes and should not be altered.
|
||||
*/
|
||||
#colorbox, #cboxOverlay, #cboxWrapper{position:absolute; top:0; left:0; z-index:9999; overflow:hidden;}
|
||||
#cboxOverlay{position:fixed; width:100%; height:100%;}
|
||||
#cboxMiddleLeft, #cboxBottomLeft{clear:left;}
|
||||
#cboxContent{position:relative;}
|
||||
#cboxLoadedContent{overflow:auto; -webkit-overflow-scrolling: touch;}
|
||||
#cboxTitle{margin:0;}
|
||||
#cboxLoadingOverlay, #cboxLoadingGraphic{position:absolute; top:0; left:0; width:100%; height:100%;}
|
||||
#cboxPrevious, #cboxNext, #cboxClose, #cboxSlideshow{cursor:pointer;}
|
||||
.cboxPhoto{float:left; margin:auto; border:0; display:block; max-width:none; -ms-interpolation-mode:bicubic;}
|
||||
.cboxIframe{width:100%; height:100%; display:block; border:0;}
|
||||
#colorbox, #cboxContent, #cboxLoadedContent{box-sizing:content-box; -moz-box-sizing:content-box; -webkit-box-sizing:content-box;}
|
||||
|
||||
/*
|
||||
User Style:
|
||||
Change the following styles to modify the appearance of Colorbox. They are
|
||||
ordered & tabbed in a way that represents the nesting of the generated HTML.
|
||||
*/
|
||||
#cboxOverlay{background:#000;}
|
||||
#colorbox{outline:0;}
|
||||
#cboxContent{margin-top:20px;background:#000;}
|
||||
.cboxIframe{background:#fff;}
|
||||
#cboxError{padding:50px; border:1px solid #ccc;}
|
||||
#cboxLoadedContent{border:5px solid #000; background:#fff;}
|
||||
#cboxTitle{position:absolute; top:-20px; left:0; color:#ccc;}
|
||||
#cboxCurrent{position:absolute; top:-20px; right:0px; color:#ccc;}
|
||||
#cboxLoadingGraphic{background:url(/styles/base/images/loading.gif) no-repeat center center;}
|
||||
|
||||
/* these elements are buttons, and may need to have additional styles reset to avoid unwanted base styles */
|
||||
#cboxPrevious, #cboxNext, #cboxSlideshow, #cboxClose {border:0; padding:0; margin:0; overflow:visible; width:auto; background:none; }
|
||||
|
||||
/* avoid outlines on :active (mouseclick), but preserve outlines on :focus (tabbed navigating) */
|
||||
#cboxPrevious:active, #cboxNext:active, #cboxSlideshow:active, #cboxClose:active {outline:0;}
|
||||
|
||||
#cboxSlideshow{position:absolute; top:-20px; right:90px; color:#fff;}
|
||||
#cboxPrevious{position:absolute; top:50%; left:5px; margin-top:-32px; background:url(/styles/base/images/controls.png) no-repeat top left; width:28px; height:65px; text-indent:-9999px;}
|
||||
#cboxPrevious:hover{background-position:bottom left;}
|
||||
#cboxNext{position:absolute; top:50%; right:5px; margin-top:-32px; background:url(/styles/base/images/controls.png) no-repeat top right; width:28px; height:65px; text-indent:-9999px;}
|
||||
#cboxNext:hover{background-position:bottom right;}
|
||||
#cboxClose{position:absolute; top:5px; right:5px; display:block; background:url(/styles/base/images/controls.png) no-repeat top center; width:38px; height:19px; text-indent:-9999px;}
|
||||
#cboxClose:hover{background-position:bottom center;}
|
BIN
public/styles/base/images/border.png
Normal file
BIN
public/styles/base/images/border.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 112 B |
BIN
public/styles/base/images/controls.png
Normal file
BIN
public/styles/base/images/controls.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 1.6 KiB |
BIN
public/styles/base/images/loading.gif
Normal file
BIN
public/styles/base/images/loading.gif
Normal file
Binary file not shown.
After Width: | Height: | Size: 9.2 KiB |
BIN
public/styles/base/images/loading_background.png
Normal file
BIN
public/styles/base/images/loading_background.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 157 B |
BIN
public/styles/base/images/overlay.png
Normal file
BIN
public/styles/base/images/overlay.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 182 B |
34
public/styles/base/jquery-ui.css
vendored
34
public/styles/base/jquery-ui.css
vendored
|
@ -535,7 +535,7 @@ button.ui-button::-moz-focus-inner {
|
|||
height: 100%;
|
||||
}
|
||||
.ui-progressbar .ui-progressbar-overlay {
|
||||
background: url("images/animated-overlay.gif");
|
||||
background: url("/styles/base/images/animated-overlay.gif");
|
||||
height: 100%;
|
||||
filter: alpha(opacity=25);
|
||||
opacity: 0.25;
|
||||
|
@ -812,7 +812,7 @@ body .ui-tooltip {
|
|||
}
|
||||
.ui-widget-content {
|
||||
border: 1px solid #aaaaaa/*{borderColorContent}*/;
|
||||
background: #ffffff/*{bgColorContent}*/ url(images/ui-bg_flat_75_ffffff_40x100.png)/*{bgImgUrlContent}*/ 50%/*{bgContentXPos}*/ 50%/*{bgContentYPos}*/ repeat-x/*{bgContentRepeat}*/;
|
||||
background: #ffffff/*{bgColorContent}*/ url(/styles/base/images/ui-bg_flat_75_ffffff_40x100.png)/*{bgImgUrlContent}*/ 50%/*{bgContentXPos}*/ 50%/*{bgContentYPos}*/ repeat-x/*{bgContentRepeat}*/;
|
||||
color: #222222/*{fcContent}*/;
|
||||
}
|
||||
.ui-widget-content a {
|
||||
|
@ -820,7 +820,7 @@ body .ui-tooltip {
|
|||
}
|
||||
.ui-widget-header {
|
||||
border: 1px solid #aaaaaa/*{borderColorHeader}*/;
|
||||
background: #cccccc/*{bgColorHeader}*/ url(images/ui-bg_highlight-soft_75_cccccc_1x100.png)/*{bgImgUrlHeader}*/ 50%/*{bgHeaderXPos}*/ 50%/*{bgHeaderYPos}*/ repeat-x/*{bgHeaderRepeat}*/;
|
||||
background: #cccccc/*{bgColorHeader}*/ url(/styles/base/images/ui-bg_highlight-soft_75_cccccc_1x100.png)/*{bgImgUrlHeader}*/ 50%/*{bgHeaderXPos}*/ 50%/*{bgHeaderYPos}*/ repeat-x/*{bgHeaderRepeat}*/;
|
||||
color: #222222/*{fcHeader}*/;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
@ -834,7 +834,7 @@ body .ui-tooltip {
|
|||
.ui-widget-content .ui-state-default,
|
||||
.ui-widget-header .ui-state-default {
|
||||
border: 1px solid #d3d3d3/*{borderColorDefault}*/;
|
||||
background: #e6e6e6/*{bgColorDefault}*/ url(images/ui-bg_glass_75_e6e6e6_1x400.png)/*{bgImgUrlDefault}*/ 50%/*{bgDefaultXPos}*/ 50%/*{bgDefaultYPos}*/ repeat-x/*{bgDefaultRepeat}*/;
|
||||
background: #e6e6e6/*{bgColorDefault}*/ url(/styles/base/images/ui-bg_glass_75_e6e6e6_1x400.png)/*{bgImgUrlDefault}*/ 50%/*{bgDefaultXPos}*/ 50%/*{bgDefaultYPos}*/ repeat-x/*{bgDefaultRepeat}*/;
|
||||
font-weight: normal/*{fwDefault}*/;
|
||||
color: #555555/*{fcDefault}*/;
|
||||
}
|
||||
|
@ -851,7 +851,7 @@ body .ui-tooltip {
|
|||
.ui-widget-content .ui-state-focus,
|
||||
.ui-widget-header .ui-state-focus {
|
||||
border: 1px solid #999999/*{borderColorHover}*/;
|
||||
background: #dadada/*{bgColorHover}*/ url(images/ui-bg_glass_75_dadada_1x400.png)/*{bgImgUrlHover}*/ 50%/*{bgHoverXPos}*/ 50%/*{bgHoverYPos}*/ repeat-x/*{bgHoverRepeat}*/;
|
||||
background: #dadada/*{bgColorHover}*/ url(/styles/base/images/ui-bg_glass_75_dadada_1x400.png)/*{bgImgUrlHover}*/ 50%/*{bgHoverXPos}*/ 50%/*{bgHoverYPos}*/ repeat-x/*{bgHoverRepeat}*/;
|
||||
font-weight: normal/*{fwDefault}*/;
|
||||
color: #212121/*{fcHover}*/;
|
||||
}
|
||||
|
@ -866,7 +866,7 @@ body .ui-tooltip {
|
|||
.ui-widget-content .ui-state-active,
|
||||
.ui-widget-header .ui-state-active {
|
||||
border: 1px solid #aaaaaa/*{borderColorActive}*/;
|
||||
background: #ffffff/*{bgColorActive}*/ url(images/ui-bg_glass_65_ffffff_1x400.png)/*{bgImgUrlActive}*/ 50%/*{bgActiveXPos}*/ 50%/*{bgActiveYPos}*/ repeat-x/*{bgActiveRepeat}*/;
|
||||
background: #ffffff/*{bgColorActive}*/ url(/styles/base/images/ui-bg_glass_65_ffffff_1x400.png)/*{bgImgUrlActive}*/ 50%/*{bgActiveXPos}*/ 50%/*{bgActiveYPos}*/ repeat-x/*{bgActiveRepeat}*/;
|
||||
font-weight: normal/*{fwDefault}*/;
|
||||
color: #212121/*{fcActive}*/;
|
||||
}
|
||||
|
@ -883,7 +883,7 @@ body .ui-tooltip {
|
|||
.ui-widget-content .ui-state-highlight,
|
||||
.ui-widget-header .ui-state-highlight {
|
||||
border: 1px solid #fcefa1/*{borderColorHighlight}*/;
|
||||
background: #fbf9ee/*{bgColorHighlight}*/ url(images/ui-bg_glass_55_fbf9ee_1x400.png)/*{bgImgUrlHighlight}*/ 50%/*{bgHighlightXPos}*/ 50%/*{bgHighlightYPos}*/ repeat-x/*{bgHighlightRepeat}*/;
|
||||
background: #fbf9ee/*{bgColorHighlight}*/ url(/styles/base/images/ui-bg_glass_55_fbf9ee_1x400.png)/*{bgImgUrlHighlight}*/ 50%/*{bgHighlightXPos}*/ 50%/*{bgHighlightYPos}*/ repeat-x/*{bgHighlightRepeat}*/;
|
||||
color: #363636/*{fcHighlight}*/;
|
||||
}
|
||||
.ui-state-highlight a,
|
||||
|
@ -895,7 +895,7 @@ body .ui-tooltip {
|
|||
.ui-widget-content .ui-state-error,
|
||||
.ui-widget-header .ui-state-error {
|
||||
border: 1px solid #cd0a0a/*{borderColorError}*/;
|
||||
background: #fef1ec/*{bgColorError}*/ url(images/ui-bg_glass_95_fef1ec_1x400.png)/*{bgImgUrlError}*/ 50%/*{bgErrorXPos}*/ 50%/*{bgErrorYPos}*/ repeat-x/*{bgErrorRepeat}*/;
|
||||
background: #fef1ec/*{bgColorError}*/ url(/styles/base/images/ui-bg_glass_95_fef1ec_1x400.png)/*{bgImgUrlError}*/ 50%/*{bgErrorXPos}*/ 50%/*{bgErrorYPos}*/ repeat-x/*{bgErrorRepeat}*/;
|
||||
color: #cd0a0a/*{fcError}*/;
|
||||
}
|
||||
.ui-state-error a,
|
||||
|
@ -941,27 +941,27 @@ body .ui-tooltip {
|
|||
}
|
||||
.ui-icon,
|
||||
.ui-widget-content .ui-icon {
|
||||
background-image: url(images/ui-icons_222222_256x240.png)/*{iconsContent}*/;
|
||||
background-image: url(/styles/base/images/ui-icons_222222_256x240.png)/*{iconsContent}*/;
|
||||
}
|
||||
.ui-widget-header .ui-icon {
|
||||
background-image: url(images/ui-icons_222222_256x240.png)/*{iconsHeader}*/;
|
||||
background-image: url(/styles/base/images/ui-icons_222222_256x240.png)/*{iconsHeader}*/;
|
||||
}
|
||||
.ui-state-default .ui-icon {
|
||||
background-image: url(images/ui-icons_888888_256x240.png)/*{iconsDefault}*/;
|
||||
background-image: url(/styles/base/images/ui-icons_888888_256x240.png)/*{iconsDefault}*/;
|
||||
}
|
||||
.ui-state-hover .ui-icon,
|
||||
.ui-state-focus .ui-icon {
|
||||
background-image: url(images/ui-icons_454545_256x240.png)/*{iconsHover}*/;
|
||||
background-image: url(/styles/base/images/ui-icons_454545_256x240.png)/*{iconsHover}*/;
|
||||
}
|
||||
.ui-state-active .ui-icon {
|
||||
background-image: url(images/ui-icons_454545_256x240.png)/*{iconsActive}*/;
|
||||
background-image: url(/styles/base/images/ui-icons_454545_256x240.png)/*{iconsActive}*/;
|
||||
}
|
||||
.ui-state-highlight .ui-icon {
|
||||
background-image: url(images/ui-icons_2e83ff_256x240.png)/*{iconsHighlight}*/;
|
||||
background-image: url(/styles/base/images/ui-icons_2e83ff_256x240.png)/*{iconsHighlight}*/;
|
||||
}
|
||||
.ui-state-error .ui-icon,
|
||||
.ui-state-error-text .ui-icon {
|
||||
background-image: url(images/ui-icons_cd0a0a_256x240.png)/*{iconsError}*/;
|
||||
background-image: url(/styles/base/images/ui-icons_cd0a0a_256x240.png)/*{iconsError}*/;
|
||||
}
|
||||
|
||||
/* positioning */
|
||||
|
@ -1174,14 +1174,14 @@ body .ui-tooltip {
|
|||
|
||||
/* Overlays */
|
||||
.ui-widget-overlay {
|
||||
background: #aaaaaa/*{bgColorOverlay}*/ url(images/ui-bg_flat_0_aaaaaa_40x100.png)/*{bgImgUrlOverlay}*/ 50%/*{bgOverlayXPos}*/ 50%/*{bgOverlayYPos}*/ repeat-x/*{bgOverlayRepeat}*/;
|
||||
background: #aaaaaa/*{bgColorOverlay}*/ url(/styles/base/images/ui-bg_flat_0_aaaaaa_40x100.png)/*{bgImgUrlOverlay}*/ 50%/*{bgOverlayXPos}*/ 50%/*{bgOverlayYPos}*/ repeat-x/*{bgOverlayRepeat}*/;
|
||||
opacity: .3/*{opacityOverlay}*/;
|
||||
filter: Alpha(Opacity=30)/*{opacityFilterOverlay}*/;
|
||||
}
|
||||
.ui-widget-shadow {
|
||||
margin: -8px/*{offsetTopShadow}*/ 0 0 -8px/*{offsetLeftShadow}*/;
|
||||
padding: 8px/*{thicknessShadow}*/;
|
||||
background: #aaaaaa/*{bgColorShadow}*/ url(images/ui-bg_flat_0_aaaaaa_40x100.png)/*{bgImgUrlShadow}*/ 50%/*{bgShadowXPos}*/ 50%/*{bgShadowYPos}*/ repeat-x/*{bgShadowRepeat}*/;
|
||||
background: #aaaaaa/*{bgColorShadow}*/ url(/styles/base/images/ui-bg_flat_0_aaaaaa_40x100.png)/*{bgImgUrlShadow}*/ 50%/*{bgShadowXPos}*/ 50%/*{bgShadowYPos}*/ repeat-x/*{bgShadowRepeat}*/;
|
||||
opacity: .3/*{opacityShadow}*/;
|
||||
filter: Alpha(Opacity=30)/*{opacityFilterShadow}*/;
|
||||
border-radius: 8px/*{cornerRadiusShadow}*/;
|
||||
|
|
|
@ -9,9 +9,6 @@ html body {
|
|||
background: #2D2D2D;
|
||||
height: 100%;
|
||||
font-family: "Helvetica Neue",Helvetica,Arial,sans-serif;
|
||||
|
||||
background-image: url('http://mlpforums.com/public/style_images/mlp/bg1-night-lightsout.png'), url('http://mlpforums.com/public/style_images/mlp/bg3-night.jpg');
|
||||
background-position: bottom center, 50% 350px;
|
||||
}
|
||||
|
||||
.site-content {
|
||||
|
|
|
@ -46,7 +46,7 @@
|
|||
<ul class="account-tracks-listing strech-to-bottom">
|
||||
<li ng-repeat="track in tracks" ng-class="{selected: track.id == selectedTrack.id, 'is-published': track.is_published}">
|
||||
<a href="/account/content/tracks/{{track.id}}">
|
||||
<div class="image"></div>
|
||||
<img class="image" src="{{track.cover_url}}" />
|
||||
<span class="title">{{track.title}}</span>
|
||||
<span class="published">{{track.created_at | pfmdate:'MM/dd/yyyy'}}</span>
|
||||
</a>
|
||||
|
@ -103,12 +103,15 @@
|
|||
<div class="form-row span6" ng-class="{'has-error': errors.cover != null}">
|
||||
<label class="strong">Track Cover: </label>
|
||||
<div class="cover-upload">
|
||||
<div class="preview"><img id="coverPreview" /></div>
|
||||
<div class="preview" ng-class="{canOpen: isCoverLoaded}" ng-click="previewCover()"><img id="coverPreview" ng-show="isCoverLoaded" /></div>
|
||||
<p>
|
||||
Track cover must be a PNG that is at least 350x350. <br />
|
||||
<a href="#" pfm-eat-click ng-click="uploadTrackCover()" class="btn btn-info btn-small"><i class="icon-upload"></i> Upload Track Cover</a>
|
||||
<input type="file" id="coverImage" onchange="angular.element(this).scope().setCoverImage(this)" />
|
||||
</p>
|
||||
<div class="btn-group">
|
||||
<a href="#" pfm-eat-click ng-click="uploadTrackCover()" class="btn btn-info btn-small"><i class="icon-upload"></i> Upload</a>
|
||||
<a href="#" pfm-eat-click ng-click="clearTrackCover()" class="btn btn-danger btn-small" ng-show="edit.cover"><i class="icon-remove"></i></a>
|
||||
</div>
|
||||
<div class="error">{{errors.cover}}</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
@ -1,14 +0,0 @@
|
|||
<div>
|
||||
<ul class="tabs">
|
||||
<li ng-class="{active: $state.includes('account-favorites.tracks')}"><a href="/account/favorites">Tracks</a></li>
|
||||
<li ng-class="{active: $state.includes('account-favorites.albums')}"><a href="/account/favorites/albums">Albums</a></li>
|
||||
<li ng-class="{active: $state.includes('account-favorites.playlists')}"><a href="/account/favorites/playlists">Playlists</a></li>
|
||||
</ul>
|
||||
|
||||
<ui-view></ui-view>
|
||||
|
||||
<pre>
|
||||
$state = {{$state.current.name}}
|
||||
$stateParams = {{$stateParams}}
|
||||
</pre>
|
||||
</div>
|
|
@ -1 +0,0 @@
|
|||
<h2>Favorite Albums</h2>
|
|
@ -1 +0,0 @@
|
|||
<h2>Favorite Playlists</h2>
|
|
@ -1 +0,0 @@
|
|||
<h2>Favorite tracks</h2>
|
14
public/templates/account/favourites/_layout.html
Normal file
14
public/templates/account/favourites/_layout.html
Normal file
|
@ -0,0 +1,14 @@
|
|||
<div>
|
||||
<ul class="tabs">
|
||||
<li ng-class="{active: $state.includes('account-favourites.tracks')}"><a href="/account/favourites">Tracks</a></li>
|
||||
<li ng-class="{active: $state.includes('account-favourites.albums')}"><a href="/account/favourites/albums">Albums</a></li>
|
||||
<li ng-class="{active: $state.includes('account-favourites.playlists')}"><a href="/account/favourites/playlists">Playlists</a></li>
|
||||
</ul>
|
||||
|
||||
<ui-view></ui-view>
|
||||
|
||||
<pre>
|
||||
$state = {{$state.current.name}}
|
||||
$stateParams = {{$stateParams}}
|
||||
</pre>
|
||||
</div>
|
1
public/templates/account/favourites/albums.html
Normal file
1
public/templates/account/favourites/albums.html
Normal file
|
@ -0,0 +1 @@
|
|||
<h2>Favourite Albums</h2>
|
1
public/templates/account/favourites/playlists.html
Normal file
1
public/templates/account/favourites/playlists.html
Normal file
|
@ -0,0 +1 @@
|
|||
<h2>Favourite Playlists</h2>
|
1
public/templates/account/favourites/tracks.html
Normal file
1
public/templates/account/favourites/tracks.html
Normal file
|
@ -0,0 +1 @@
|
|||
<h2>Favourite tracks</h2>
|
2
vendor/autoload.php
vendored
2
vendor/autoload.php
vendored
|
@ -4,4 +4,4 @@
|
|||
|
||||
require_once __DIR__ . '/composer' . '/autoload_real.php';
|
||||
|
||||
return ComposerAutoloaderInit228de5cdbd28cc56fb0110585167d4be::getLoader();
|
||||
return ComposerAutoloaderInit3b14f774048abcb51cb73f0018822c49::getLoader();
|
||||
|
|
13
vendor/composer/autoload_classmap.php
vendored
13
vendor/composer/autoload_classmap.php
vendored
|
@ -9,7 +9,9 @@ return array(
|
|||
'AbstractOutputProvider' => $vendorDir . '/codescale/ffmpeg-php/provider/AbstractOutputProvider.php',
|
||||
'AccountController' => $baseDir . '/app/controllers/AccountController.php',
|
||||
'AlbumsController' => $baseDir . '/app/controllers/AlbumsController.php',
|
||||
'ApiControllerBase' => $baseDir . '/app/controllers/ApiControllerBase.php',
|
||||
'Api\\Web\\AuthController' => $baseDir . '/app/controllers/Api/Web/AuthController.php',
|
||||
'Api\\Web\\TaxonomiesController' => $baseDir . '/app/controllers/Api/Web/TaxonomiesController.php',
|
||||
'Api\\Web\\TracksController' => $baseDir . '/app/controllers/Api/Web/TracksController.php',
|
||||
'ArtistsController' => $baseDir . '/app/controllers/ArtistsController.php',
|
||||
'Assetic\\AssetManager' => $vendorDir . '/kriswallsmith/assetic/src/Assetic/AssetManager.php',
|
||||
|
@ -123,9 +125,12 @@ return array(
|
|||
'ClassPreloader\\Parser\\NodeTraverser' => $vendorDir . '/classpreloader/classpreloader/src/ClassPreloader/Parser/NodeTraverser.php',
|
||||
'Commands\\CommandBase' => $baseDir . '/app/models/Commands/CommandBase.php',
|
||||
'Commands\\CommandResponse' => $baseDir . '/app/models/Commands/CommandResponse.php',
|
||||
'Commands\\RegisterUserCommand' => $baseDir . '/app/models/Commands/RegisterUserCommand.php',
|
||||
'Commands\\DeleteTrackCommand' => $baseDir . '/app/models/Commands/DeleteTrackCommand.php',
|
||||
'Commands\\EditTrackCommand' => $baseDir . '/app/models/Commands/EditTrackCommand.php',
|
||||
'Commands\\UploadTrackCommand' => $baseDir . '/app/models/Commands/UploadTrackCommand.php',
|
||||
'ContentController' => $baseDir . '/app/controllers/ContentController.php',
|
||||
'Cover' => $baseDir . '/app/models/Cover.php',
|
||||
'CreateImagesTable' => $baseDir . '/app/database/migrations/2013_07_26_230827_create_images_table.php',
|
||||
'CreateTracksTable' => $baseDir . '/app/database/migrations/2013_06_27_015259_create_tracks_table.php',
|
||||
'CreateUsersTable' => $baseDir . '/app/database/migrations/2013_06_07_003952_create_users_table.php',
|
||||
'DatabaseSeeder' => $baseDir . '/app/database/seeds/DatabaseSeeder.php',
|
||||
|
@ -394,7 +399,10 @@ return array(
|
|||
'Doctrine\\DBAL\\Types\\Type' => $vendorDir . '/doctrine/dbal/lib/Doctrine/DBAL/Types/Type.php',
|
||||
'Doctrine\\DBAL\\Types\\VarDateTimeType' => $vendorDir . '/doctrine/dbal/lib/Doctrine/DBAL/Types/VarDateTimeType.php',
|
||||
'Doctrine\\DBAL\\Version' => $vendorDir . '/doctrine/dbal/lib/Doctrine/DBAL/Version.php',
|
||||
'Entities\\Genre' => $baseDir . '/app/models/Entities/Genre.php',
|
||||
'Entities\\License' => $baseDir . '/app/models/Entities/License.php',
|
||||
'Entities\\Track' => $baseDir . '/app/models/Entities/Track.php',
|
||||
'Entities\\TrackType' => $baseDir . '/app/models/Entities/TrackType.php',
|
||||
'Entities\\User' => $baseDir . '/app/models/Entities/User.php',
|
||||
'Evenement\\EventEmitter' => $vendorDir . '/evenement/evenement/src/Evenement/EventEmitter.php',
|
||||
'Evenement\\EventEmitter2' => $vendorDir . '/evenement/evenement/src/Evenement/EventEmitter2.php',
|
||||
|
@ -411,7 +419,7 @@ return array(
|
|||
'FFmpegOutputProviderTest' => $vendorDir . '/codescale/ffmpeg-php/test/provider/FFmpegOutputProviderTest.php',
|
||||
'FFprobeOutputProvider' => $vendorDir . '/codescale/ffmpeg-php/provider/FFprobeOutputProvider.php',
|
||||
'FFprobeOutputProviderTest' => $vendorDir . '/codescale/ffmpeg-php/test/provider/FFprobeOutputProviderTest.php',
|
||||
'FavoritesController' => $baseDir . '/app/controllers/FavoritesController.php',
|
||||
'FavouritesController' => $baseDir . '/app/controllers/FavouritesController.php',
|
||||
'Guzzle\\Common\\AbstractHasDispatcher' => $vendorDir . '/guzzle/common/Guzzle/Common/AbstractHasDispatcher.php',
|
||||
'Guzzle\\Common\\Collection' => $vendorDir . '/guzzle/common/Guzzle/Common/Collection.php',
|
||||
'Guzzle\\Common\\Event' => $vendorDir . '/guzzle/common/Guzzle/Common/Event.php',
|
||||
|
@ -1814,6 +1822,7 @@ return array(
|
|||
'Symfony\\Component\\Translation\\Writer\\TranslationWriter' => $vendorDir . '/symfony/translation/Symfony/Component/Translation/Writer/TranslationWriter.php',
|
||||
'TestCase' => $baseDir . '/app/tests/TestCase.php',
|
||||
'TracksController' => $baseDir . '/app/controllers/TracksController.php',
|
||||
'UsersController' => $baseDir . '/app/controllers/UsersController.php',
|
||||
'Whoops\\Exception\\ErrorException' => $vendorDir . '/filp/whoops/src/Whoops/Exception/ErrorException.php',
|
||||
'Whoops\\Exception\\Frame' => $vendorDir . '/filp/whoops/src/Whoops/Exception/Frame.php',
|
||||
'Whoops\\Exception\\FrameCollection' => $vendorDir . '/filp/whoops/src/Whoops/Exception/FrameCollection.php',
|
||||
|
|
6
vendor/composer/autoload_real.php
vendored
6
vendor/composer/autoload_real.php
vendored
|
@ -2,7 +2,7 @@
|
|||
|
||||
// autoload_real.php generated by Composer
|
||||
|
||||
class ComposerAutoloaderInit228de5cdbd28cc56fb0110585167d4be
|
||||
class ComposerAutoloaderInit3b14f774048abcb51cb73f0018822c49
|
||||
{
|
||||
private static $loader;
|
||||
|
||||
|
@ -19,9 +19,9 @@ class ComposerAutoloaderInit228de5cdbd28cc56fb0110585167d4be
|
|||
return self::$loader;
|
||||
}
|
||||
|
||||
spl_autoload_register(array('ComposerAutoloaderInit228de5cdbd28cc56fb0110585167d4be', 'loadClassLoader'), true, true);
|
||||
spl_autoload_register(array('ComposerAutoloaderInit3b14f774048abcb51cb73f0018822c49', 'loadClassLoader'), true, true);
|
||||
self::$loader = $loader = new \Composer\Autoload\ClassLoader();
|
||||
spl_autoload_unregister(array('ComposerAutoloaderInit228de5cdbd28cc56fb0110585167d4be', 'loadClassLoader'));
|
||||
spl_autoload_unregister(array('ComposerAutoloaderInit3b14f774048abcb51cb73f0018822c49', 'loadClassLoader'));
|
||||
|
||||
$vendorDir = dirname(__DIR__);
|
||||
$baseDir = dirname($vendorDir);
|
||||
|
|
Loading…
Reference in a new issue