You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
89 lines
1.8 KiB
C
89 lines
1.8 KiB
C
#include "media.h"
|
|
|
|
// Submodules
|
|
#include "json/layout.h"
|
|
#include "util/format.h"
|
|
|
|
// Model
|
|
#include "model/server.h"
|
|
|
|
// Standard Library
|
|
#include <stdlib.h>
|
|
#include <assert.h>
|
|
#include <string.h>
|
|
|
|
#define OBJ_TYPE struct media
|
|
struct json_object_field media_layout[] = {
|
|
JSON_FIELD_STRING( content_type, false ),
|
|
JSON_FIELD_STRING( preview_url, false ),
|
|
JSON_FIELD_STRING( remote_url, false ),
|
|
JSON_FIELD_END,
|
|
};
|
|
#undef OBJ_TYPE
|
|
|
|
struct media* media_new()
|
|
{
|
|
struct media* res;
|
|
res = malloc(sizeof(*res));
|
|
memset(res,0,sizeof(*res));
|
|
return res;
|
|
}
|
|
|
|
struct media* media_from_id( int id )
|
|
{
|
|
if( id == 0 ) { return NULL; }
|
|
char filename[512];
|
|
FILE* f = fopen( format( filename, sizeof(filename), "data/media/%d.json", id ), "r" );
|
|
if( !f ) { return NULL; }
|
|
|
|
struct media* m;
|
|
m = malloc(sizeof(*m));
|
|
memset(m,0,sizeof(*m));
|
|
m->id = id;
|
|
|
|
if( !json_read_object_layout_from_FILE( f, media_layout, m ) ) {
|
|
media_free(m);
|
|
return NULL;
|
|
}
|
|
|
|
return m;
|
|
}
|
|
struct media* media_from_local_uri( const char* uri )
|
|
{
|
|
if( 0 != strncmp( "https://", uri, 8 ) ) { return NULL; }
|
|
uri += 8;
|
|
|
|
int server_name_length = strlen(g_server->domain);
|
|
if( 0 != strncmp( g_server->domain, uri, server_name_length ) ) { return NULL; }
|
|
uri += server_name_length;
|
|
|
|
if( 0 != strncmp( "/media/", uri, 7 ) ) { return NULL; }
|
|
uri += 7;
|
|
|
|
// Note: zero is never a valid status id
|
|
int id = atoi(uri);
|
|
if( id == 0 ) { return NULL; }
|
|
|
|
struct media* result = media_from_id(id);
|
|
result->remote_url = strdup(uri);
|
|
return result;
|
|
}
|
|
void media_free( struct media* m )
|
|
{
|
|
if( !m ) { return; }
|
|
|
|
free(m->content_type);
|
|
free(m);
|
|
}
|
|
void media_save( struct media* m )
|
|
{
|
|
assert( m );
|
|
assert( m->id );
|
|
|
|
char filename[512];
|
|
json_write_object_layout_to_file( format(filename,sizeof(filename),"data/media/%d.json", m->id ), "\t", media_layout, m );
|
|
}
|
|
|
|
JSON_FIELD_TYPE_OBJECT_LAYOUT_WITH_DEFAULTS( media );
|
|
|