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

#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 );