Don't want to lose these files

This commit is contained in:
nelsonlaquet 2013-09-01 19:11:33 -05:00
parent 1617b605f6
commit 84f6064a1b
12 changed files with 442 additions and 125 deletions

View file

@ -7,6 +7,7 @@
use Commands\UploadTrackCommand;
use Cover;
use Entities\Image;
use Entities\News;
use Entities\Track;
use Illuminate\Support\Facades\Auth;
use Illuminate\Support\Facades\Input;
@ -30,6 +31,7 @@
return Response::json([
'recent_tracks' => $recentTracks,
'popular_tracks' => Track::popular(30, Auth::check() && Auth::user()->can_see_explicit_content)], 200);
'popular_tracks' => Track::popular(30, Auth::check() && Auth::user()->can_see_explicit_content),
'news' => News::getNews(0, 10)], 200);
}
}

View file

@ -0,0 +1,21 @@
<?php
use Illuminate\Database\Migrations\Migration;
class CreateNewsTable extends Migration {
public function up() {
Schema::create('news', function($table){
$table->increments('id');
$table->integer('user_id')->unsigned()->index();
$table->string('post_hash', 32)->index();
$table->timestamps();
$table->foreign('user_id')->references('id')->on('users')->onDelete('cascade');
});
}
public function down() {
Schema::drop('news');
}
}

View file

@ -40,7 +40,7 @@
});
App::error(function($exception) {
return Response::view('errors.500', array(), 404);
// return Response::view('errors.500', array(), 404);
});
}

View file

@ -0,0 +1,59 @@
<?php
namespace Entities;
use Illuminate\Support\Facades\Auth;
use SimplePie;
class News extends \Eloquent {
public static function getNews($start = 0, $end = 4) {
$feed = new SimplePie();
$feed->cache = false;
$feed->set_feed_url('http://mlpforums.com/blog/rss/404-ponyfm-development-blog/');
$feed->init();
$feed->handle_content_type();
$posts = $feed->get_items($start, $end);
$postHashes = [];
foreach ($posts as $post) {
$postHashes[] = self::calculateHash($post->get_permalink());
}
$seenRecords = self::where('user_id', '=', Auth::user()->id)->whereIn('post_hash', $postHashes)->get();
$seenHashes = [];
foreach ($seenRecords as $record) {
$seenHashes[$record->post_hash] = 1;
}
$postsReturn = [];
// This date is around when the last blog post was posted as of now.
// I put in a cutoff so that blog posts made before this update is pushed are always marked as 'read'
$readCutoffDate = mktime(null, null, null, 4, 28, 2013);
foreach ($posts as $post) {
$autoRead = $post->get_date('U') < $readCutoffDate;
$postsReturn[] = [
'post' => [
'title' => $post->get_title(),
'date' => $post->get_date('j F Y g:i a'),
'url' => $post->get_permalink()
],
'read' => $autoRead || isset($seenHashes[self::calculateHash($post->get_permalink())])];
}
return $postsReturn;
}
public static function markPostAsRead($postUrl) {
$postHash = self::calculateHash($postUrl);
$news = News::create(['user_id' => Auth::user()->id, 'post_hash' => $postHash]);
$news->save();
}
private static function calculateHash($postPermalink) {
return md5($postPermalink);
}
}

View file

@ -183,7 +183,7 @@ class Container implements ArrayAccess
if (is_null($dependency)) {
$dependencies[] = $this->resolveNonClass($parameter);
} else {
$dependencies[] = $this->make($dependency->name);
$dependencies[] = $this->resolveClass($parameter);
}
}
return (array) $dependencies;
@ -197,6 +197,18 @@ class Container implements ArrayAccess
throw new BindingResolutionException($message);
}
}
protected function resolveClass(ReflectionParameter $parameter)
{
try {
return $this->make($parameter->getClass()->name);
} catch (BindingResolutionException $e) {
if ($parameter->isOptional()) {
return $parameter->getDefaultValue();
} else {
throw $e;
}
}
}
public function resolving(Closure $callback)
{
$this->resolvingCallbacks[] = $callback;
@ -290,7 +302,7 @@ use Symfony\Component\HttpKernel\Exception\NotFoundHttpException;
use Symfony\Component\HttpFoundation\RedirectResponse as SymfonyRedirect;
class Application extends Container implements HttpKernelInterface, ResponsePreparerInterface
{
const VERSION = '4.0.2';
const VERSION = '4.0.6';
protected $booted = false;
protected $bootingCallbacks = array();
protected $bootedCallbacks = array();
@ -298,6 +310,7 @@ class Application extends Container implements HttpKernelInterface, ResponsePrep
protected $serviceProviders = array();
protected $loadedProviders = array();
protected $deferredServices = array();
protected static $requestClass = 'Illuminate\\Http\\Request';
public function __construct(Request $request = null)
{
$this['request'] = $this->createRequest($request);
@ -307,12 +320,13 @@ class Application extends Container implements HttpKernelInterface, ResponsePrep
}
protected function createRequest(Request $request = null)
{
return $request ?: Request::createFromGlobals();
return $request ?: static::onRequest('createFromGlobals');
}
public function setRequestForConsoleEnvironment()
{
$url = $this['config']->get('app.url', 'http://localhost');
$this->instance('request', Request::create($url, 'GET', array(), array(), array(), $_SERVER));
$parameters = array($url, 'GET', array(), array(), array(), $_SERVER);
$this->instance('request', static::onRequest('create', $parameters));
}
public function redirectIfTrailingSlash()
{
@ -476,10 +490,11 @@ class Application extends Container implements HttpKernelInterface, ResponsePrep
{
if ($this->isDownForMaintenance()) {
$response = $this['events']->until('illuminate.app.down');
return $this->prepareResponse($response, $request);
} else {
return $this['router']->dispatch($this->prepareRequest($request));
if (!is_null($response)) {
return $this->prepareResponse($response, $request);
}
}
return $this['router']->dispatch($this->prepareRequest($request));
}
public function handle(SymfonyRequest $request, $type = HttpKernelInterface::MASTER_REQUEST, $catch = true)
{
@ -553,7 +568,7 @@ class Application extends Container implements HttpKernelInterface, ResponsePrep
{
$this['exception']->error($callback);
}
public function pushError(Closure $closure)
public function pushError(Closure $callback)
{
$this['exception']->pushError($callback);
}
@ -586,6 +601,17 @@ class Application extends Container implements HttpKernelInterface, ResponsePrep
{
$this->deferredServices = $services;
}
public static function requestClass($class = null)
{
if (!is_null($class)) {
static::$requestClass = $class;
}
return static::$requestClass;
}
public static function onRequest($method, $parameters = array())
{
return forward_static_call_array(array(static::requestClass(), $method), $parameters);
}
public function __get($key)
{
return $this[$key];
@ -665,7 +691,7 @@ class Request extends \Symfony\Component\HttpFoundation\Request
}
return true;
}
if (is_array($this->input($key))) {
if (is_bool($this->input($key)) or is_array($this->input($key))) {
return true;
}
return trim((string) $this->input($key)) !== '';
@ -782,6 +808,15 @@ class Request extends \Symfony\Component\HttpFoundation\Request
$acceptable = $this->getAcceptableContentTypes();
return isset($acceptable[0]) and $acceptable[0] == 'application/json';
}
public function format($default = 'html')
{
foreach ($this->getAcceptableContentTypes() as $type) {
if ($format = $this->getFormat($type)) {
return $format;
}
}
return $default;
}
public function getSessionStore()
{
if (!isset($this->sessionStore)) {
@ -808,6 +843,8 @@ class Request
const HEADER_CLIENT_PROTO = 'client_proto';
const HEADER_CLIENT_PORT = 'client_port';
protected static $trustedProxies = array();
protected static $trustedHostPatterns = array();
protected static $trustedHosts = array();
protected static $trustedHeaders = array(self::HEADER_CLIENT_IP => 'X_FORWARDED_FOR', self::HEADER_CLIENT_HOST => 'X_FORWARDED_HOST', self::HEADER_CLIENT_PROTO => 'X_FORWARDED_PROTO', self::HEADER_CLIENT_PORT => 'X_FORWARDED_PORT');
protected static $httpMethodParameterOverride = false;
public $attributes;
@ -952,6 +989,9 @@ class Request
$dup->basePath = null;
$dup->method = null;
$dup->format = null;
if (!$dup->get('_format')) {
$dup->setRequestFormat($this->getRequestFormat());
}
return $dup;
}
public function __clone()
@ -1000,6 +1040,17 @@ class Request
{
return self::$trustedProxies;
}
public static function setTrustedHosts(array $hostPatterns)
{
self::$trustedHostPatterns = array_map(function ($hostPattern) {
return sprintf('{%s}i', str_replace('}', '\\}', $hostPattern));
}, $hostPatterns);
self::$trustedHosts = array();
}
public static function getTrustedHosts()
{
return self::$trustedHostPatterns;
}
public static function setTrustedHeaderName($key, $value)
{
if (!array_key_exists($key, self::$trustedHeaders)) {
@ -1199,7 +1250,19 @@ class Request
}
$host = strtolower(preg_replace('/:\\d+$/', '', trim($host)));
if ($host && !preg_match('/^\\[?(?:[a-zA-Z0-9-:\\]_]+\\.?)+$/', $host)) {
throw new \UnexpectedValueException('Invalid Host');
throw new \UnexpectedValueException('Invalid Host "' . $host . '"');
}
if (count(self::$trustedHostPatterns) > 0) {
if (in_array($host, self::$trustedHosts)) {
return $host;
}
foreach (self::$trustedHostPatterns as $pattern) {
if (preg_match($pattern, $host)) {
self::$trustedHosts[] = $host;
return $host;
}
}
throw new \UnexpectedValueException('Untrusted Host "' . $host . '"');
}
return $host;
}
@ -2152,7 +2215,18 @@ class NativeSessionStorage implements SessionStorageInterface
if ($destroy) {
$this->metadataBag->stampNew();
}
return session_regenerate_id($destroy);
$ret = session_regenerate_id($destroy);
if ('files' === $this->getSaveHandler()->getSaveHandlerName()) {
session_write_close();
if (isset($_SESSION)) {
$backup = $_SESSION;
session_start();
$_SESSION = $backup;
} else {
session_start();
}
}
return $ret;
}
public function save()
{
@ -3067,7 +3141,7 @@ abstract class ServiceProvider
}
protected function getClassChain(ReflectionClass $reflect)
{
$lastName = null;
$classes = array();
while ($reflect !== false) {
$classes[] = $reflect;
$reflect = $reflect->getParentClass();
@ -3081,9 +3155,9 @@ abstract class ServiceProvider
}
return $namespace;
}
public function commands()
public function commands($commands)
{
$commands = func_get_args();
$commands = is_array($commands) ? $commands : func_get_args();
$events = $this->app['events'];
$events->listen('artisan.start', function ($artisan) use($commands) {
$artisan->resolveCommands($commands);
@ -3398,6 +3472,10 @@ class Str
}
return rtrim($matches[0]) . $end;
}
public static function parseCallback($callback, $default)
{
return static::contains($callback, '@') ? explode('@', $callback, 2) : array($callback, $default);
}
public static function plural($value, $count = 2)
{
return Pluralizer::plural($value, $count);
@ -3522,6 +3600,9 @@ class ErrorHandler
return true;
}
if ($this->displayErrors && error_reporting() & $level && $this->level & $level) {
if (!class_exists('Symfony\\Component\\Debug\\Exception\\ContextErrorException')) {
require 'F:\\Nelson\\My Documents - Personal\\Visual Studio 2010\\Projects\\Poniverse\\spa.pony.fm\\vendor\\symfony\\debug\\Symfony\\Component\\Debug' . '/Exception/ContextErrorException.php';
}
throw new ContextErrorException(sprintf('%s: %s in %s line %d', isset($this->levels[$level]) ? $this->levels[$level] : $level, $message, $file, $line), 0, $level, $file, $line, $context);
}
return false;
@ -3582,7 +3663,7 @@ class Repository extends NamespacedItemResolver implements ArrayAccess
public function has($key)
{
$default = microtime(true);
return $this->get($key, $default) != $default;
return $this->get($key, $default) !== $default;
}
public function hasGroup($key)
{
@ -3923,7 +4004,7 @@ class Filesystem
}
public function lastModified($path)
{
return filemtime(realpath($path));
return filemtime($path);
}
public function isDirectory($directory)
{
@ -3959,7 +4040,7 @@ class Filesystem
{
$directories = array();
foreach (Finder::create()->in($directory)->directories()->depth(0) as $dir) {
$directories[] = $dir->getRealPath();
$directories[] = $dir->getPathname();
}
return $directories;
}
@ -3980,12 +4061,12 @@ class Filesystem
foreach ($items as $item) {
$target = $destination . '/' . $item->getBasename();
if ($item->isDir()) {
$path = $item->getRealPath();
$path = $item->getPathname();
if (!$this->copyDirectory($path, $target, $options)) {
return false;
}
} else {
if (!$this->copy($item->getRealPath(), $target)) {
if (!$this->copy($item->getPathname(), $target)) {
return false;
}
}
@ -4000,9 +4081,9 @@ class Filesystem
$items = new FilesystemIterator($directory);
foreach ($items as $item) {
if ($item->isDir()) {
$this->deleteDirectory($item->getRealPath());
$this->deleteDirectory($item->getPathname());
} else {
$this->delete($item->getRealPath());
$this->delete($item->getPathname());
}
}
if (!$preserve) {
@ -4248,8 +4329,7 @@ class SessionServiceProvider extends ServiceProvider
}
protected function registerSessionEvents()
{
$app = $this->app;
$config = $app['config']['session'];
$config = $this->app['config']['session'];
if (!is_null($config['driver'])) {
$this->registerBootingEvent();
$this->registerCloseEvent();
@ -4257,8 +4337,7 @@ class SessionServiceProvider extends ServiceProvider
}
protected function registerBootingEvent()
{
$app = $this->app;
$this->app->booting(function ($app) use($app) {
$this->app->booting(function ($app) {
$app['session']->start();
});
}
@ -4286,7 +4365,7 @@ class SessionServiceProvider extends ServiceProvider
{
$config = $this->app['config']['session'];
$expire = $this->getExpireTime($config);
setcookie($config['cookie'], session_id(), $expire, $config['path'], $config['domain']);
setcookie($config['cookie'], session_id(), $expire, $config['path'], $config['domain'], false, true);
}
protected function getExpireTime($config)
{
@ -4829,21 +4908,21 @@ class Router
$this->patternFilters[$pattern][] = compact('name', 'methods');
}
}
public function findPatternFilters(Request $request)
public function findPatternFilters($method, $path)
{
$results = array();
foreach ($this->patternFilters as $pattern => $filters) {
if (str_is('/' . $pattern, $request->getPathInfo())) {
$merge = $this->filterPatternsByMethod($request, $filters);
if (str_is('/' . $pattern, $path)) {
$merge = $this->filterPatternsByMethod($method, $filters);
$results = array_merge($results, $merge);
}
}
return $results;
}
protected function filterPatternsByMethod(Request $request, $filters)
protected function filterPatternsByMethod($method, $filters)
{
$results = array();
$method = strtolower($request->getMethod());
$method = strtolower($method);
foreach ($filters as $filter) {
if (is_null($filter['methods']) or in_array($method, $filter['methods'])) {
$results[] = $filter['name'];
@ -5154,7 +5233,7 @@ class Dispatcher
protected $sorted = array();
public function __construct(Container $container = null)
{
$this->container = $container;
$this->container = $container ?: new Container();
}
public function listen($event, $listener, $priority = 0)
{
@ -5166,7 +5245,7 @@ class Dispatcher
}
protected function setupWildcardListen($event, $listener, $priority)
{
$this->wildcards[$event][] = $listener;
$this->wildcards[$event][] = $this->makeListener($listener);
}
public function hasListeners($eventName)
{
@ -5300,6 +5379,7 @@ abstract class Model implements ArrayAccess, ArrayableInterface, JsonableInterfa
protected $relations = array();
protected $hidden = array();
protected $visible = array();
protected $appends = array();
protected $fillable = array();
protected $guarded = array('*');
protected $touches = array();
@ -5376,6 +5456,10 @@ abstract class Model implements ArrayAccess, ArrayableInterface, JsonableInterfa
$model->save();
return $model;
}
public static function query()
{
return with(new static())->newQuery();
}
public static function on($connection = null)
{
$instance = new static();
@ -5526,7 +5610,8 @@ abstract class Model implements ArrayAccess, ArrayableInterface, JsonableInterfa
{
$query = $this->newQuery()->where($this->getKeyName(), $this->getKey());
if ($this->softDelete) {
$query->update(array(static::DELETED_AT => new DateTime()));
$this->{static::DELETED_AT} = $time = $this->freshTimestamp();
$query->update(array(static::DELETED_AT => $this->fromDateTime($time)));
} else {
$query->delete();
}
@ -5534,8 +5619,13 @@ abstract class Model implements ArrayAccess, ArrayableInterface, JsonableInterfa
public function restore()
{
if ($this->softDelete) {
if ($this->fireModelEvent('restoring') === false) {
return false;
}
$this->{static::DELETED_AT} = null;
return $this->save();
$result = $this->save();
$this->fireModelEvent('restored', false);
return $result;
}
}
public static function saving($callback)
@ -5570,6 +5660,14 @@ abstract class Model implements ArrayAccess, ArrayableInterface, JsonableInterfa
{
static::registerModelEvent('deleted', $callback);
}
public static function restoring($callback)
{
static::registerModelEvent('restoring', $callback);
}
public static function restored($callback)
{
static::registerModelEvent('restored', $callback);
}
public static function flushEventListeners()
{
if (!isset(static::$dispatcher)) {
@ -5589,7 +5687,7 @@ abstract class Model implements ArrayAccess, ArrayableInterface, JsonableInterfa
}
public function getObservableEvents()
{
return array('creating', 'created', 'updating', 'updated', 'deleting', 'deleted', 'saving', 'saved');
return array('creating', 'created', 'updating', 'updated', 'deleting', 'deleted', 'saving', 'saved', 'restoring', 'restored');
}
protected function increment($column, $amount = 1)
{
@ -5758,6 +5856,10 @@ abstract class Model implements ArrayAccess, ArrayableInterface, JsonableInterfa
{
return new DateTime();
}
public function freshTimestampString()
{
return $this->fromDateTime($this->freshTimestamp());
}
public function newQuery($excludeDeleted = true)
{
$builder = new Builder($this->newBaseQueryBuilder());
@ -5800,7 +5902,7 @@ abstract class Model implements ArrayAccess, ArrayableInterface, JsonableInterfa
if (isset($this->table)) {
return $this->table;
}
return str_replace('\\', '', snake_case(str_plural(get_class($this))));
return str_replace('\\', '', snake_case(str_plural(class_basename($this))));
}
public function setTable($table)
{
@ -5860,6 +5962,10 @@ abstract class Model implements ArrayAccess, ArrayableInterface, JsonableInterfa
{
$this->visible = $visible;
}
public function setAppends(array $appends)
{
$this->appends = $appends;
}
public function getFillable()
{
return $this->fillable;
@ -5941,26 +6047,26 @@ abstract class Model implements ArrayAccess, ArrayableInterface, JsonableInterfa
}
public function attributesToArray()
{
$attributes = $this->getAccessibleAttributes();
$attributes = $this->getArrayableAttributes();
foreach ($this->getMutatedAttributes() as $key) {
if (!array_key_exists($key, $attributes)) {
continue;
}
$attributes[$key] = $this->mutateAttribute($key, $attributes[$key]);
}
foreach ($this->appends as $key) {
$attributes[$key] = $this->mutateAttribute($key, null);
}
return $attributes;
}
protected function getAccessibleAttributes()
protected function getArrayableAttributes()
{
if (count($this->visible) > 0) {
return array_intersect_key($this->attributes, array_flip($this->visible));
}
return array_diff_key($this->attributes, array_flip($this->hidden));
return $this->getArrayableItems($this->attributes);
}
public function relationsToArray()
{
$attributes = array();
foreach ($this->relations as $key => $value) {
foreach ($this->getArrayableRelations() as $key => $value) {
if (in_array($key, $this->hidden)) {
continue;
}
@ -5972,12 +6078,23 @@ abstract class Model implements ArrayAccess, ArrayableInterface, JsonableInterfa
if (static::$snakeAttributes) {
$key = snake_case($key);
}
if (isset($relation)) {
if (isset($relation) or is_null($value)) {
$attributes[$key] = $relation;
}
}
return $attributes;
}
protected function getArrayableRelations()
{
return $this->getArrayableItems($this->relations);
}
protected function getArrayableItems(array $values)
{
if (count($this->visible) > 0) {
return array_intersect_key($values, array_flip($this->visible));
}
return array_diff_key($values, array_flip($this->hidden));
}
public function getAttribute($key)
{
$inAttributes = array_key_exists($key, $this->attributes);
@ -6039,7 +6156,7 @@ abstract class Model implements ArrayAccess, ArrayableInterface, JsonableInterfa
{
return array(static::CREATED_AT, static::UPDATED_AT, static::DELETED_AT);
}
protected function fromDateTime($value)
public function fromDateTime($value)
{
$format = $this->getDateFormat();
if ($value instanceof DateTime) {
@ -6109,6 +6226,10 @@ abstract class Model implements ArrayAccess, ArrayableInterface, JsonableInterfa
}
return $dirty;
}
public function getRelations()
{
return $this->relations;
}
public function getRelation($relation)
{
return $this->relations[$relation];
@ -6134,6 +6255,7 @@ abstract class Model implements ArrayAccess, ArrayableInterface, JsonableInterfa
public function setConnection($name)
{
$this->connection = $name;
return $this;
}
public static function resolveConnection($connection = null)
{
@ -6256,6 +6378,7 @@ class DatabaseManager implements ConnectionResolverInterface
}
public function reconnect($name = null)
{
$name = $name ?: $this->getDefaultConnection();
unset($this->connections[$name]);
return $this->connection($name);
}
@ -6265,6 +6388,10 @@ class DatabaseManager implements ConnectionResolverInterface
if (isset($this->extensions[$name])) {
return call_user_func($this->extensions[$name], $config);
}
$driver = $config['driver'];
if (isset($this->extensions[$driver])) {
return call_user_func($this->extensions[$driver], $config);
}
return $this->factory->make($config, $name);
}
protected function prepare(Connection $connection)
@ -6409,7 +6536,7 @@ class Store extends SymfonySession
{
return array_get($this->all(), $name, $default);
}
public function hasOldInput($key)
public function hasOldInput($key = null)
{
return !is_null($this->getOldInput($key));
}
@ -6543,13 +6670,18 @@ class SessionManager extends Manager
}
protected function createRedisDriver()
{
return $this->createCacheBased('redis');
$handler = $this->createCacheHandler('redis');
$handler->getCache()->getStore()->setConnection($this->app['config']['session.connection']);
return $this->buildSession($handler);
}
protected function createCacheBased($driver)
{
return $this->buildSession($this->createCacheHandler($driver));
}
protected function createCacheHandler($driver)
{
$minutes = $this->app['config']['session.lifetime'];
$handler = new CacheBasedSessionHandler($this->app['cache']->driver($driver), $minutes);
return $this->buildSession($handler);
return new CacheBasedSessionHandler($this->app['cache']->driver($driver), $minutes);
}
protected function buildSession($handler)
{
@ -6728,11 +6860,15 @@ class Encrypter
if (!$payload or $this->invalidPayload($payload)) {
throw new DecryptException('Invalid data.');
}
if ($payload['mac'] !== $this->hash($payload['iv'], $payload['value'])) {
if (!$this->validMac($payload)) {
throw new DecryptException('MAC is invalid.');
}
return $payload;
}
protected function validMac(array $payload)
{
return $payload['mac'] == $this->hash($payload['iv'], $payload['value']);
}
protected function hash($iv, $value)
{
return hash_hmac('sha256', $iv . $value, $this->key);
@ -6915,6 +7051,7 @@ class Logger implements LoggerInterface
const CRITICAL = 500;
const ALERT = 550;
const EMERGENCY = 600;
const API = 1;
protected static $levels = array(100 => 'DEBUG', 200 => 'INFO', 250 => 'NOTICE', 300 => 'WARNING', 400 => 'ERROR', 500 => 'CRITICAL', 550 => 'ALERT', 600 => 'EMERGENCY');
protected static $timezone;
protected $name;
@ -7141,6 +7278,7 @@ abstract class AbstractHandler implements HandlerInterface
throw new \InvalidArgumentException('Processors must be valid callables (callback or object with an __invoke method), ' . var_export($callback, true) . ' given');
}
array_unshift($this->processors, $callback);
return $this;
}
public function popProcessor()
{
@ -7152,6 +7290,7 @@ abstract class AbstractHandler implements HandlerInterface
public function setFormatter(FormatterInterface $formatter)
{
$this->formatter = $formatter;
return $this;
}
public function getFormatter()
{
@ -7163,6 +7302,7 @@ abstract class AbstractHandler implements HandlerInterface
public function setLevel($level)
{
$this->level = $level;
return $this;
}
public function getLevel()
{
@ -7171,6 +7311,7 @@ abstract class AbstractHandler implements HandlerInterface
public function setBubble($bubble)
{
$this->bubble = $bubble;
return $this;
}
public function getBubble()
{
@ -7303,18 +7444,16 @@ class RotatingFileHandler extends StreamHandler
if (!empty($fileInfo['extension'])) {
$glob .= '.' . $fileInfo['extension'];
}
$iterator = new \GlobIterator($glob);
$count = $iterator->count();
if ($this->maxFiles >= $count) {
$logFiles = glob($glob);
if ($this->maxFiles >= count($logFiles)) {
return;
}
$array = iterator_to_array($iterator);
usort($array, function ($a, $b) {
return strcmp($b->getFilename(), $a->getFilename());
usort($logFiles, function ($a, $b) {
return strcmp($b, $a);
});
foreach (array_slice($array, $this->maxFiles) as $file) {
if ($file->isWritable()) {
unlink($file->getRealPath());
foreach (array_slice($logFiles, $this->maxFiles) as $file) {
if (is_writable($file)) {
unlink($file);
}
}
}
@ -7819,7 +7958,8 @@ class Route extends BaseRoute
protected function getAllBeforeFilters(Request $request)
{
$before = $this->getBeforeFilters();
return array_merge($before, $this->router->findPatternFilters($request));
$patterns = $this->router->findPatternFilters($request->getMethod(), $request->getPathInfo());
return array_merge($before, $patterns);
}
protected function callAfterFilters(Request $request, $response)
{
@ -7935,7 +8075,7 @@ class Route extends BaseRoute
}
public function setBeforeFilters($value)
{
$filters = is_string($value) ? explode('|', $value) : (array) $value;
$filters = $this->parseFilterValue($value);
$this->setOption('_before', array_merge($this->getBeforeFilters(), $filters));
}
public function getAfterFilters()
@ -7944,9 +8084,17 @@ class Route extends BaseRoute
}
public function setAfterFilters($value)
{
$filters = is_string($value) ? explode('|', $value) : (array) $value;
$filters = $this->parseFilterValue($value);
$this->setOption('_after', array_merge($this->getAfterFilters(), $filters));
}
protected function parseFilterValue($value)
{
$results = array();
foreach ((array) $value as $filters) {
$results = array_merge($results, explode('|', $filters));
}
return $results;
}
public function setParameters($parameters)
{
$this->parameters = $parameters;
@ -8109,7 +8257,8 @@ class Environment
{
$path = $this->finder->find($view);
$data = array_merge($mergeData, $this->parseData($data));
return new View($this, $this->getEngineFromPath($path), $view, $path, $data);
$this->callCreator($view = new View($this, $this->getEngineFromPath($path), $view, $path, $data));
return $view;
}
protected function parseData($data)
{
@ -8170,47 +8319,64 @@ class Environment
$this->share($innerKey, $innerValue);
}
}
public function creator($views, $callback)
{
$creators = array();
foreach ((array) $views as $view) {
$creators[] = $this->addViewEvent($view, $callback, 'creating: ');
}
return $creators;
}
public function composer($views, $callback)
{
$composers = array();
foreach ((array) $views as $view) {
$composers[] = $this->addComposer($view, $callback);
$composers[] = $this->addViewEvent($view, $callback);
}
return $composers;
}
protected function addComposer($view, $callback)
protected function addViewEvent($view, $callback, $prefix = 'composing: ')
{
if ($callback instanceof Closure) {
$this->events->listen('composing: ' . $view, $callback);
$this->events->listen($prefix . $view, $callback);
return $callback;
} elseif (is_string($callback)) {
return $this->addClassComposer($view, $callback);
return $this->addClassEvent($view, $callback, $prefix);
}
}
protected function addClassComposer($view, $class)
protected function addClassEvent($view, $class, $prefix)
{
$name = 'composing: ' . $view;
$callback = $this->buildClassComposerCallback($class);
$name = $prefix . $view;
$callback = $this->buildClassEventCallback($class, $prefix);
$this->events->listen($name, $callback);
return $callback;
}
protected function buildClassComposerCallback($class)
protected function buildClassEventCallback($class, $prefix)
{
$container = $this->container;
list($class, $method) = $this->parseClassComposer($class);
list($class, $method) = $this->parseClassEvent($class, $prefix);
return function () use($class, $method, $container) {
$callable = array($container->make($class), $method);
return call_user_func_array($callable, func_get_args());
};
}
protected function parseClassComposer($class)
protected function parseClassEvent($class, $prefix)
{
return str_contains($class, '@') ? explode('@', $class) : array($class, 'compose');
if (str_contains($class, '@')) {
return explode('@', $class);
} else {
$method = str_contains($prefix, 'composing') ? 'compose' : 'create';
return array($class, $method);
}
}
public function callComposer(View $view)
{
$this->events->fire('composing: ' . $view->getName(), array($view));
}
public function callCreator(View $view)
{
$this->events->fire('creating: ' . $view->getName(), array($view));
}
public function startSection($section, $content = '')
{
if ($content === '') {
@ -8246,9 +8412,9 @@ class Environment
$this->sections[$section] = $content;
}
}
public function yieldContent($section)
public function yieldContent($section, $default = '')
{
return isset($this->sections[$section]) ? $this->sections[$section] : '';
return isset($this->sections[$section]) ? $this->sections[$section] : $default;
}
public function flushSections()
{
@ -8300,6 +8466,10 @@ class Environment
{
return $this->events;
}
public function setDispatcher(Dispatcher $events)
{
$this->events = $events;
}
public function getContainer()
{
return $this->container;
@ -8414,6 +8584,11 @@ class MessageBag implements ArrayableInterface, Countable, JsonableInterface, Me
public function setFormat($format = ':message')
{
$this->format = $format;
return $this;
}
public function isEmpty()
{
return !$this->any();
}
public function any()
{
@ -9119,8 +9294,16 @@ class Response
$obStatus = ob_get_status(1);
while (($level = ob_get_level()) > 0 && $level !== $previous) {
$previous = $level;
if ($obStatus[$level - 1] && isset($obStatus[$level - 1]['del']) && $obStatus[$level - 1]['del']) {
ob_end_flush();
if ($obStatus[$level - 1]) {
if (version_compare(PHP_VERSION, '5.4', '>=')) {
if (isset($obStatus[$level - 1]['flags']) && $obStatus[$level - 1]['flags'] & PHP_OUTPUT_HANDLER_REMOVABLE) {
ob_end_flush();
}
} else {
if (isset($obStatus[$level - 1]['del']) && $obStatus[$level - 1]['del']) {
ob_end_flush();
}
}
}
}
flush();
@ -9837,15 +10020,18 @@ class Run
}
}
$output = ob_get_clean();
if ($this->allowQuit()) {
echo $output;
die;
} else {
if ($this->writeToOutput()) {
echo $output;
if ($this->writeToOutput()) {
if ($handlerResponse == Handler::QUIT && $this->allowQuit()) {
while (ob_get_level() > 0) {
ob_end_clean();
}
}
return $output;
echo $output;
}
if ($handlerResponse == Handler::QUIT && $this->allowQuit()) {
die;
}
return $output;
}
public function handleError($level, $message, $file = null, $line = null)
{

View file

@ -2,7 +2,8 @@
"require": {
"laravel/framework": "4.0.*",
"kriswallsmith/assetic": "1.2.*@dev",
"codescale/ffmpeg-php": "2.7.0"
"codescale/ffmpeg-php": "2.7.0",
"simplepie/simplepie": "1.3.1"
},
"autoload": {
"classmap": [

View file

@ -33,7 +33,7 @@
$bundle->setTargetPath($filePath);
}
$bundle = new AssetCache($bundle, new FilesystemCache("$cacheDirectory/scripts"));
// $bundle = new AssetCache($bundle, new FilesystemCache("$cacheDirectory/scripts"));
} else if ($_GET['type'] == 'less') {
header('Content-Type: text/css');

View file

@ -8,8 +8,10 @@ angular.module('ponyfm').controller "dashboard", [
($scope, dashboard) ->
$scope.recentTracks = null
$scope.popularTracks = null
$scope.news = null
dashboard.refresh().done (res) ->
$scope.recentTracks = res.recent_tracks
$scope.popularTracks = res.popular_tracks
$scope.news = res.news
]

View file

@ -342,7 +342,7 @@ html {
line-height: normal;
padding: 0px;
margin: 5px 0px;
padding: 5px 0px;
padding-right: 10px;
position: relative;
@ -384,6 +384,10 @@ html {
margin-top: 5px;
}
.artist {
.ellipsis();
}
.artist, .stats, .genre, .stats-expanded {
color: #777;
font-size: 80%;

View file

@ -1,13 +1,49 @@
@import-once "base/bootstrap/bootstrap";
.dashboard {
h1 {
background: @pfm-purple;
color: #fff;
font-size: 10pt;
padding: 5px;
margin: 0px;
margin-bottom: 5px;
}
}
@media (max-width: 1300px) and (min-width: 720px) {
html .dashboard {
.recent-tracks {
width: 50%;
.tracks-listing > li:nth-child(1n+15) {
display: none;
}
}
.popular-tracks {
width: 50%;
float: right;
}
.news {
width: 50%;
clear: left;
}
}
}
.recent-tracks {
h1 {
a {
color: #fff;
display: block;
float: right;
font-size: 10pt;
margin-top: 8px;
background: darken(@pfm-purple, 20%);
margin: -5px;
margin-left: 0px;
padding: 5px;
}
}
}
@ -16,8 +52,19 @@
section {
.box-sizing(border-box);
float: left;
width: 50%;
padding: 5px;
float: left;
}
}
.recent-tracks {
width: 37.5%;
}
.popular-tracks {
width: 37.5%;
}
.news {
width: 25%;
}
}

View file

@ -1,20 +1,28 @@
<div class="dashboard stretch-to-bottom">
<section class="recent-tracks">
<div>
<h1>
<a href="/tracks"><i class="icon-music"></i> see more</a>
The Newest Tunes
</h1>
<pfm-tracks-list tracks="recentTracks" class="two-columns"></pfm-tracks-list>
</div>
<h1>
<a href="/tracks"><i class="icon-music"></i> see more</a>
The Newest Tunes
</h1>
<pfm-tracks-list tracks="recentTracks" class="two-columns"></pfm-tracks-list>
</section>
<section class="popular-tracks">
<div>
<h1>
What's Popular Today
</h1>
<pfm-tracks-list tracks="popularTracks" class="two-columns"></pfm-tracks-list>
</div>
<h1>
What's Popular Today
</h1>
<pfm-tracks-list tracks="popularTracks" class="two-columns"></pfm-tracks-list>
</section>
<section class="news">
<h1>Pony.fm News</h1>
<ul>
<li ng-repeat="post in news">
<a href="{{post.url}}">
{{post.title}}
<em>{{post.date}}</em>
</a>
</li>
</ul>
</section>
</div>

View file

@ -33,6 +33,7 @@
<excludeFolder url="file://$MODULE_DIR$/vendor/react/event-loop" />
<excludeFolder url="file://$MODULE_DIR$/vendor/react/socket" />
<excludeFolder url="file://$MODULE_DIR$/vendor/react/stream" />
<excludeFolder url="file://$MODULE_DIR$/vendor/simplepie/simplepie" />
<excludeFolder url="file://$MODULE_DIR$/vendor/swiftmailer/swiftmailer" />
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/browser-kit" />
<excludeFolder url="file://$MODULE_DIR$/vendor/symfony/console" />
@ -66,14 +67,7 @@
<root url="file://$MODULE_DIR$/vendor/psr/log" />
<root url="file://$MODULE_DIR$/vendor/filp/whoops" />
<root url="file://$MODULE_DIR$/vendor/nikic/php-parser" />
<root url="file://$MODULE_DIR$/vendor/react/socket" />
<root url="file://$MODULE_DIR$/vendor/react/stream" />
<root url="file://$MODULE_DIR$/vendor/react/event-loop" />
<root url="file://$MODULE_DIR$/vendor/cboden/ratchet" />
<root url="file://$MODULE_DIR$/vendor/guzzle/http" />
<root url="file://$MODULE_DIR$/vendor/guzzle/common" />
<root url="file://$MODULE_DIR$/vendor/guzzle/parser" />
<root url="file://$MODULE_DIR$/vendor/guzzle/stream" />
<root url="file://$MODULE_DIR$/vendor/nesbot/carbon" />
<root url="file://$MODULE_DIR$/vendor/predis/predis" />
<root url="file://$MODULE_DIR$/vendor/laravel/framework" />
@ -100,9 +94,9 @@
<root url="file://$MODULE_DIR$/vendor/doctrine/annotations" />
<root url="file://$MODULE_DIR$/vendor/doctrine/collections" />
<root url="file://$MODULE_DIR$/vendor/codescale/ffmpeg-php" />
<root url="file://$MODULE_DIR$/vendor/evenement/evenement" />
<root url="file://$MODULE_DIR$/vendor/ircmaxell/password-compat" />
<root url="file://$MODULE_DIR$/vendor/patchwork/utf8" />
<root url="file://$MODULE_DIR$/vendor/simplepie/simplepie" />
<root url="file://$MODULE_DIR$/vendor/swiftmailer/swiftmailer" />
<root url="file://$MODULE_DIR$/vendor/kriswallsmith/assetic" />
<root url="file://$MODULE_DIR$/vendor/classpreloader/classpreloader" />
@ -112,14 +106,7 @@
<root url="file://$MODULE_DIR$/vendor/psr/log" />
<root url="file://$MODULE_DIR$/vendor/filp/whoops" />
<root url="file://$MODULE_DIR$/vendor/nikic/php-parser" />
<root url="file://$MODULE_DIR$/vendor/react/socket" />
<root url="file://$MODULE_DIR$/vendor/react/stream" />
<root url="file://$MODULE_DIR$/vendor/react/event-loop" />
<root url="file://$MODULE_DIR$/vendor/cboden/ratchet" />
<root url="file://$MODULE_DIR$/vendor/guzzle/http" />
<root url="file://$MODULE_DIR$/vendor/guzzle/common" />
<root url="file://$MODULE_DIR$/vendor/guzzle/parser" />
<root url="file://$MODULE_DIR$/vendor/guzzle/stream" />
<root url="file://$MODULE_DIR$/vendor/nesbot/carbon" />
<root url="file://$MODULE_DIR$/vendor/predis/predis" />
<root url="file://$MODULE_DIR$/vendor/laravel/framework" />
@ -146,9 +133,9 @@
<root url="file://$MODULE_DIR$/vendor/doctrine/annotations" />
<root url="file://$MODULE_DIR$/vendor/doctrine/collections" />
<root url="file://$MODULE_DIR$/vendor/codescale/ffmpeg-php" />
<root url="file://$MODULE_DIR$/vendor/evenement/evenement" />
<root url="file://$MODULE_DIR$/vendor/ircmaxell/password-compat" />
<root url="file://$MODULE_DIR$/vendor/patchwork/utf8" />
<root url="file://$MODULE_DIR$/vendor/simplepie/simplepie" />
<root url="file://$MODULE_DIR$/vendor/swiftmailer/swiftmailer" />
<root url="file://$MODULE_DIR$/vendor/kriswallsmith/assetic" />
<root url="file://$MODULE_DIR$/vendor/classpreloader/classpreloader" />