#include "media.h" // Submodules #include "json/layout.h" #include "util/format.h" // Model #include "model/server.h" // Standard Library #include #include #include #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 );