diff --git a/css/swad18.64.css b/css/swad18.64.css index 0c21425b0..1513195df 100644 --- a/css/swad18.64.css +++ b/css/swad18.64.css @@ -2707,12 +2707,7 @@ a:hover img.CENTRE_PHOTO_SHOW { position:relative; } -/* -.MED_PLAY:hover .MED_PLAY_ICO - { - opacity:0; - } -*/ + /* The icon inside the overlay is positioned in the middle vertically and horizontally */ .MED_PLAY_ICO { @@ -2720,7 +2715,7 @@ a:hover img.CENTRE_PHOTO_SHOW left:50%; top:50%; transform:translate(-50%,-50%); - font-size:24pt; + font-size:20pt; font-weight:bold; color:white; text-shadow: 0 0 8px black; diff --git a/sql/cambios.sql b/sql/cambios.sql index ba9f8f6b6..e0c3810f9 100644 --- a/sql/cambios.sql +++ b/sql/cambios.sql @@ -12616,3 +12616,27 @@ SELECT CAST(~0 AS UNSIGNED); SELECT last_logs.LogCod,last_logs.ActCod,last_logs.Dif,last_logs.Role,last_logs.CtyCod,last_logs.InsCod,last_logs.CtrCod,last_logs.DegCod,actions.Txt FROM (SELECT LogCod,ActCod,UNIX_TIMESTAMP()-UNIX_TIMESTAMP(ClickTime) AS Dif,Role,CtyCod,InsCod,CtrCod,DegCod FROM log_recent ORDER BY LogCod DESC LIMIT 20) AS last_logs LEFT JOIN actions ON last_logs.ActCod=actions.ActCod WHERE actions.Language='es'; +ALTER TABLE forum_post CHANGE COLUMN MediaType MediaType ENUM('none','jpg','gif') NOT NULL DEFAULT 'none'; +ALTER TABLE msg_content CHANGE COLUMN MediaType MediaType ENUM('none','jpg','gif') NOT NULL DEFAULT 'none'; +ALTER TABLE msg_content_deleted CHANGE COLUMN MediaType MediaType ENUM('none','jpg','gif') NOT NULL DEFAULT 'none'; +ALTER TABLE social_comments CHANGE COLUMN MediaType MediaType ENUM('none','jpg','gif') NOT NULL DEFAULT 'none'; +ALTER TABLE social_posts CHANGE COLUMN MediaType MediaType ENUM('none','jpg','gif') NOT NULL DEFAULT 'none'; +ALTER TABLE tst_answers CHANGE COLUMN MediaType MediaType ENUM('none','jpg','gif') NOT NULL DEFAULT 'none'; +ALTER TABLE tst_questions CHANGE COLUMN MediaType MediaType ENUM('none','jpg','gif') NOT NULL DEFAULT 'none'; + +UPDATE forum_post SET MediaType='none' WHERE MediaName=''; +UPDATE msg_content SET MediaType='none' WHERE MediaName=''; +UPDATE msg_content_deleted SET MediaType='none' WHERE MediaName=''; +UPDATE social_comments SET MediaType='none' WHERE MediaName=''; +UPDATE social_posts SET MediaType='none' WHERE MediaName=''; +UPDATE tst_answers SET MediaType='none' WHERE MediaName=''; +UPDATE tst_questions SET MediaType='none' WHERE MediaName=''; + +UPDATE forum_post SET MediaType='jpg' WHERE MediaType<>'gif' AND MediaName<>''; +UPDATE msg_content SET MediaType='jpg' WHERE MediaType<>'gif' AND MediaName<>''; +UPDATE msg_content_deleted SET MediaType='jpg' WHERE MediaType<>'gif' AND MediaName<>''; +UPDATE social_comments SET MediaType='jpg' WHERE MediaType<>'gif' AND MediaName<>''; +UPDATE social_posts SET MediaType='jpg' WHERE MediaType<>'gif' AND MediaName<>''; +UPDATE tst_answers SET MediaType='jpg' WHERE MediaType<>'gif' AND MediaName<>''; +UPDATE tst_questions SET MediaType='jpg' WHERE MediaType<>'gif' AND MediaName<>''; + diff --git a/swad_changelog.h b/swad_changelog.h index 932fd30fb..030ec5c56 100644 --- a/swad_changelog.h +++ b/swad_changelog.h @@ -411,8 +411,6 @@ Antonio // TODO: Chequear "Imagen no encontrada" en timeline. Mensaje de Víctor González Argudo -// TODO: Comprobar "Error when getting publishing code from session." tras horas de inactividad. - /*****************************************************************************/ /****************************** Public constants *****************************/ /*****************************************************************************/ @@ -432,10 +430,12 @@ En OpenSWAD: ps2pdf source.ps destination.pdf */ -#define Log_PLATFORM_VERSION "SWAD 18.64.1 (2019-03-04)" +#define Log_PLATFORM_VERSION "SWAD 18.64.3 (2019-03-04)" #define CSS_FILE "swad18.64.css" #define JS_FILE "swad18.64.js" /* + Version 18.64.3: Mar 04, 2019 Fixed bugs in media. (238467 lines) + Version 18.64.2: Mar 04, 2019 Detect if a GIF image is animated. (238451 lines) Version 18.64.1: Mar 04, 2019 Code refactoring in media. (238408 lines) Version 18.64: Mar 04, 2019 Allowing animated GIFs. Not finished. (238378 lines) Version 18.63.1: Mar 02, 2019 Allowing animated GIFs. Not finished. (238162 lines) @@ -443,7 +443,7 @@ ps2pdf source.ps destination.pdf Rename the following directory: sudo mv /var/www/swad/img /var/www/swad/med - 28 changes necessary in database: + 42 changes necessary in database: ALTER TABLE forum_post CHANGE COLUMN ImageName MediaName VARCHAR(43) NOT NULL DEFAULT ''; ALTER TABLE games CHANGE COLUMN ImageName MediaName VARCHAR(43) NOT NULL DEFAULT ''; ALTER TABLE msg_content CHANGE COLUMN ImageName MediaName VARCHAR(43) NOT NULL DEFAULT ''; @@ -453,13 +453,13 @@ ALTER TABLE social_posts CHANGE COLUMN ImageName MediaName VARCHAR(43) NOT NULL ALTER TABLE tst_answers CHANGE COLUMN ImageName MediaName VARCHAR(43) NOT NULL DEFAULT ''; ALTER TABLE tst_questions CHANGE COLUMN ImageName MediaName VARCHAR(43) NOT NULL DEFAULT ''; -ALTER TABLE forum_post ADD COLUMN MediaType ENUM('jpg','gif') NOT NULL DEFAULT 'jpg' AFTER MediaName; -ALTER TABLE msg_content ADD COLUMN MediaType ENUM('jpg','gif') NOT NULL DEFAULT 'jpg' AFTER MediaName; -ALTER TABLE msg_content_deleted ADD COLUMN MediaType ENUM('jpg','gif') NOT NULL DEFAULT 'jpg' AFTER MediaName; -ALTER TABLE social_comments ADD COLUMN MediaType ENUM('jpg','gif') NOT NULL DEFAULT 'jpg' AFTER MediaName; -ALTER TABLE social_posts ADD COLUMN MediaType ENUM('jpg','gif') NOT NULL DEFAULT 'jpg' AFTER MediaName; -ALTER TABLE tst_answers ADD COLUMN MediaType ENUM('jpg','gif') NOT NULL DEFAULT 'jpg' AFTER MediaName; -ALTER TABLE tst_questions ADD COLUMN MediaType ENUM('jpg','gif') NOT NULL DEFAULT 'jpg' AFTER MediaName; +ALTER TABLE forum_post ADD COLUMN MediaType ENUM('none','jpg','gif') NOT NULL DEFAULT 'none' AFTER MediaName; +ALTER TABLE msg_content ADD COLUMN MediaType ENUM('none','jpg','gif') NOT NULL DEFAULT 'none' AFTER MediaName; +ALTER TABLE msg_content_deleted ADD COLUMN MediaType ENUM('none','jpg','gif') NOT NULL DEFAULT 'none' AFTER MediaName; +ALTER TABLE social_comments ADD COLUMN MediaType ENUM('none','jpg','gif') NOT NULL DEFAULT 'none' AFTER MediaName; +ALTER TABLE social_posts ADD COLUMN MediaType ENUM('none','jpg','gif') NOT NULL DEFAULT 'none' AFTER MediaName; +ALTER TABLE tst_answers ADD COLUMN MediaType ENUM('none','jpg','gif') NOT NULL DEFAULT 'none' AFTER MediaName; +ALTER TABLE tst_questions ADD COLUMN MediaType ENUM('none','jpg','gif') NOT NULL DEFAULT 'none' AFTER MediaName; ALTER TABLE forum_post CHANGE COLUMN ImageTitle MediaTitle VARCHAR(2047) NOT NULL DEFAULT ''; ALTER TABLE msg_content CHANGE COLUMN ImageTitle MediaTitle VARCHAR(2047) NOT NULL DEFAULT ''; @@ -477,6 +477,22 @@ ALTER TABLE social_posts CHANGE COLUMN ImageURL MediaURL VARCHAR(255) NOT NULL D ALTER TABLE tst_answers CHANGE COLUMN ImageURL MediaURL VARCHAR(255) NOT NULL DEFAULT ''; ALTER TABLE tst_questions CHANGE COLUMN ImageURL MediaURL VARCHAR(255) NOT NULL DEFAULT ''; +UPDATE forum_post SET MediaType='none' WHERE MediaName=''; +UPDATE msg_content SET MediaType='none' WHERE MediaName=''; +UPDATE msg_content_deleted SET MediaType='none' WHERE MediaName=''; +UPDATE social_comments SET MediaType='none' WHERE MediaName=''; +UPDATE social_posts SET MediaType='none' WHERE MediaName=''; +UPDATE tst_answers SET MediaType='none' WHERE MediaName=''; +UPDATE tst_questions SET MediaType='none' WHERE MediaName=''; + +UPDATE forum_post SET MediaType='jpg' WHERE MediaType<>'gif' AND MediaName<>''; +UPDATE msg_content SET MediaType='jpg' WHERE MediaType<>'gif' AND MediaName<>''; +UPDATE msg_content_deleted SET MediaType='jpg' WHERE MediaType<>'gif' AND MediaName<>''; +UPDATE social_comments SET MediaType='jpg' WHERE MediaType<>'gif' AND MediaName<>''; +UPDATE social_posts SET MediaType='jpg' WHERE MediaType<>'gif' AND MediaName<>''; +UPDATE tst_answers SET MediaType='jpg' WHERE MediaType<>'gif' AND MediaName<>''; +UPDATE tst_questions SET MediaType='jpg' WHERE MediaType<>'gif' AND MediaName<>''; + Version 18.62: Feb 27, 2019 By default show only the last comments in a social publishing. (237901 lines) Version 18.61: Feb 27, 2019 Hide/show comments in a social publishing. (237855 lines) Version 18.60.5: Feb 26, 2019 Changes in CSS for responsive design in timeline. (237788 lines) diff --git a/swad_database.c b/swad_database.c index 521c402a1..d6c159aa7 100644 --- a/swad_database.c +++ b/swad_database.c @@ -1207,23 +1207,23 @@ mysql> DESCRIBE forum_disabled_post; /***** Table forum_post *****/ /* mysql> DESCRIBE forum_post; -+------------+-------------------+------+-----+---------+----------------+ -| Field | Type | Null | Key | Default | Extra | -+------------+-------------------+------+-----+---------+----------------+ -| PstCod | int(11) | NO | PRI | NULL | auto_increment | -| ThrCod | int(11) | NO | MUL | NULL | | -| UsrCod | int(11) | NO | MUL | NULL | | -| CreatTime | datetime | NO | MUL | NULL | | -| ModifTime | datetime | NO | MUL | NULL | | -| NumNotif | int(11) | NO | | 0 | | -| Subject | text | NO | | NULL | | -| Content | longtext | NO | | NULL | | -| MediaName | varchar(43) | NO | | | | -| MediaType | enum('jpg','gif') | NO | | jpg | | -| MediaTitle | varchar(2047) | NO | | | | -| MediaURL | varchar(255) | NO | | | | -+------------+-------------------+------+-----+---------+----------------+ -12 rows in set (0.00 sec) ++------------+--------------------------+------+-----+---------+----------------+ +| Field | Type | Null | Key | Default | Extra | ++------------+--------------------------+------+-----+---------+----------------+ +| PstCod | int(11) | NO | PRI | NULL | auto_increment | +| ThrCod | int(11) | NO | MUL | NULL | | +| UsrCod | int(11) | NO | MUL | NULL | | +| CreatTime | datetime | NO | MUL | NULL | | +| ModifTime | datetime | NO | MUL | NULL | | +| NumNotif | int(11) | NO | | 0 | | +| Subject | text | NO | | NULL | | +| Content | longtext | NO | | NULL | | +| MediaName | varchar(43) | NO | | | | +| MediaType | enum('none','jpg','gif') | NO | | none | | +| MediaTitle | varchar(2047) | NO | | | | +| MediaURL | varchar(255) | NO | | | | ++------------+--------------------------+------+-----+---------+----------------+ +12 rows in set (0.01 sec) */ DB_CreateTable ("CREATE TABLE IF NOT EXISTS forum_post (" "PstCod INT NOT NULL AUTO_INCREMENT," @@ -1235,7 +1235,7 @@ mysql> DESCRIBE forum_post; "Subject TEXT NOT NULL," // Cns_MAX_BYTES_SUBJECT "Content LONGTEXT NOT NULL," // Cns_MAX_BYTES_LONG_TEXT "MediaName VARCHAR(43) NOT NULL DEFAULT ''," // Med_BYTES_NAME - "MediaType ENUM('jpg','gif') NOT NULL DEFAULT 'jpg'," + "MediaType ENUM('none','jpg','gif') NOT NULL DEFAULT 'none'," "MediaTitle VARCHAR(2047) NOT NULL DEFAULT ''," // Med_MAX_BYTES_TITLE "MediaURL VARCHAR(255) NOT NULL DEFAULT ''," // Cns_MAX_BYTES_WWW "UNIQUE INDEX(PstCod)," @@ -1733,17 +1733,17 @@ mysql> DESCRIBE msg_banned; /***** Table msg_content *****/ /* mysql> DESCRIBE msg_content; -+------------+-------------------+------+-----+---------+----------------+ -| Field | Type | Null | Key | Default | Extra | -+------------+-------------------+------+-----+---------+----------------+ -| MsgCod | int(11) | NO | PRI | NULL | auto_increment | -| Subject | text | NO | MUL | NULL | | -| Content | longtext | NO | | NULL | | -| MediaName | varchar(43) | NO | | | | -| MediaType | enum('jpg','gif') | NO | | jpg | | -| MediaTitle | varchar(2047) | NO | | | | -| MediaURL | varchar(255) | NO | | | | -+------------+-------------------+------+-----+---------+----------------+ ++------------+--------------------------+------+-----+---------+----------------+ +| Field | Type | Null | Key | Default | Extra | ++------------+--------------------------+------+-----+---------+----------------+ +| MsgCod | int(11) | NO | PRI | NULL | auto_increment | +| Subject | text | NO | MUL | NULL | | +| Content | longtext | NO | | NULL | | +| MediaName | varchar(43) | NO | | | | +| MediaType | enum('none','jpg','gif') | NO | | none | | +| MediaTitle | varchar(2047) | NO | | | | +| MediaURL | varchar(255) | NO | | | | ++------------+--------------------------+------+-----+---------+----------------+ 7 rows in set (0.00 sec) */ DB_CreateTable ("CREATE TABLE IF NOT EXISTS msg_content (" @@ -1751,7 +1751,7 @@ mysql> DESCRIBE msg_content; "Subject TEXT NOT NULL," "Content LONGTEXT NOT NULL," "MediaName VARCHAR(43) NOT NULL DEFAULT ''," // Med_BYTES_NAME - "MediaType ENUM('jpg','gif') NOT NULL DEFAULT 'jpg'," + "MediaType ENUM('none','jpg','gif') NOT NULL DEFAULT 'none'," "MediaTitle VARCHAR(2047) NOT NULL DEFAULT ''," // Med_MAX_BYTES_TITLE "MediaURL VARCHAR(255) NOT NULL DEFAULT ''," // Cns_MAX_BYTES_WWW "UNIQUE INDEX(MsgCod)," @@ -1760,17 +1760,17 @@ mysql> DESCRIBE msg_content; /***** Table msg_content_deleted *****/ /* mysql> DESCRIBE msg_content_deleted; -+------------+-------------------+------+-----+---------+-------+ -| Field | Type | Null | Key | Default | Extra | -+------------+-------------------+------+-----+---------+-------+ -| MsgCod | int(11) | NO | PRI | NULL | | -| Subject | text | NO | MUL | NULL | | -| Content | longtext | NO | | NULL | | -| MediaName | varchar(43) | NO | | | | -| MediaType | enum('jpg','gif') | NO | | jpg | | -| MediaTitle | varchar(2047) | NO | | | | -| MediaURL | varchar(255) | NO | | | | -+------------+-------------------+------+-----+---------+-------+ ++------------+--------------------------+------+-----+---------+-------+ +| Field | Type | Null | Key | Default | Extra | ++------------+--------------------------+------+-----+---------+-------+ +| MsgCod | int(11) | NO | PRI | NULL | | +| Subject | text | NO | MUL | NULL | | +| Content | longtext | NO | | NULL | | +| MediaName | varchar(43) | NO | | | | +| MediaType | enum('none','jpg','gif') | NO | | none | | +| MediaTitle | varchar(2047) | NO | | | | +| MediaURL | varchar(255) | NO | | | | ++------------+--------------------------+------+-----+---------+-------+ 7 rows in set (0.00 sec) */ DB_CreateTable ("CREATE TABLE IF NOT EXISTS msg_content_deleted (" @@ -1778,7 +1778,7 @@ mysql> DESCRIBE msg_content_deleted; "Subject TEXT NOT NULL," "Content LONGTEXT NOT NULL," "MediaName VARCHAR(43) NOT NULL DEFAULT ''," // Med_BYTES_NAME - "MediaType ENUM('jpg','gif') NOT NULL DEFAULT 'jpg'," + "MediaType ENUM('none','jpg','gif') NOT NULL DEFAULT 'none'," "MediaTitle VARCHAR(2047) NOT NULL DEFAULT ''," // Med_MAX_BYTES_TITLE "MediaURL VARCHAR(255) NOT NULL DEFAULT ''," // Cns_MAX_BYTES_WWW "UNIQUE INDEX(MsgCod)," @@ -2176,23 +2176,23 @@ mysql> DESCRIBE sessions; /***** Table social_comments *****/ /* mysql> DESCRIBE social_comments; -+------------+-------------------+------+-----+---------+-------+ -| Field | Type | Null | Key | Default | Extra | -+------------+-------------------+------+-----+---------+-------+ -| PubCod | bigint(20) | NO | PRI | NULL | | -| Content | longtext | NO | MUL | NULL | | -| MediaName | varchar(43) | NO | | | | -| MediaType | enum('jpg','gif') | NO | | jpg | | -| MediaTitle | varchar(2047) | NO | | | | -| MediaURL | varchar(255) | NO | | | | -+------------+-------------------+------+-----+---------+-------+ ++------------+--------------------------+------+-----+---------+-------+ +| Field | Type | Null | Key | Default | Extra | ++------------+--------------------------+------+-----+---------+-------+ +| PubCod | bigint(20) | NO | PRI | NULL | | +| Content | longtext | NO | MUL | NULL | | +| MediaName | varchar(43) | NO | | | | +| MediaType | enum('none','jpg','gif') | NO | | none | | +| MediaTitle | varchar(2047) | NO | | | | +| MediaURL | varchar(255) | NO | | | | ++------------+--------------------------+------+-----+---------+-------+ 6 rows in set (0.00 sec) */ DB_CreateTable ("CREATE TABLE IF NOT EXISTS social_comments (" "PubCod BIGINT NOT NULL," "Content LONGTEXT NOT NULL," "MediaName VARCHAR(43) NOT NULL DEFAULT ''," // Med_BYTES_NAME - "MediaType ENUM('jpg','gif') NOT NULL DEFAULT 'jpg'," + "MediaType ENUM('none','jpg','gif') NOT NULL DEFAULT 'none'," "MediaTitle VARCHAR(2047) NOT NULL DEFAULT ''," // Med_MAX_BYTES_TITLE "MediaURL VARCHAR(255) NOT NULL DEFAULT ''," // Cns_MAX_BYTES_WWW "UNIQUE INDEX(PubCod)," @@ -2274,23 +2274,23 @@ mysql> DESCRIBE social_notes_fav; /***** Table social_posts *****/ /* mysql> DESCRIBE social_posts; -+------------+-------------------+------+-----+---------+----------------+ -| Field | Type | Null | Key | Default | Extra | -+------------+-------------------+------+-----+---------+----------------+ -| PstCod | int(11) | NO | PRI | NULL | auto_increment | -| Content | longtext | NO | MUL | NULL | | -| MediaName | varchar(43) | NO | | | | -| MediaType | enum('jpg','gif') | NO | | jpg | | -| MediaTitle | varchar(2047) | NO | | | | -| MediaURL | varchar(255) | NO | | | | -+------------+-------------------+------+-----+---------+----------------+ -6 rows in set (0.00 sec) ++------------+--------------------------+------+-----+---------+----------------+ +| Field | Type | Null | Key | Default | Extra | ++------------+--------------------------+------+-----+---------+----------------+ +| PstCod | int(11) | NO | PRI | NULL | auto_increment | +| Content | longtext | NO | MUL | NULL | | +| MediaName | varchar(43) | NO | | | | +| MediaType | enum('none','jpg','gif') | NO | | none | | +| MediaTitle | varchar(2047) | NO | | | | +| MediaURL | varchar(255) | NO | | | | ++------------+--------------------------+------+-----+---------+----------------+ +6 rows in set (0.01 sec) */ DB_CreateTable ("CREATE TABLE IF NOT EXISTS social_posts (" "PubCod INT NOT NULL AUTO_INCREMENT," "Content LONGTEXT NOT NULL," "MediaName VARCHAR(43) NOT NULL DEFAULT ''," // Med_BYTES_NAME - "MediaType ENUM('jpg','gif') NOT NULL DEFAULT 'jpg'," + "MediaType ENUM('none','jpg','gif') NOT NULL DEFAULT 'none'," "MediaTitle VARCHAR(2047) NOT NULL DEFAULT ''," // Med_MAX_BYTES_TITLE "MediaURL VARCHAR(255) NOT NULL DEFAULT ''," // Cns_MAX_BYTES_WWW "UNIQUE INDEX(PubCod)," @@ -2547,19 +2547,19 @@ mysql> DESCRIBE timetable_tut; /***** Table tst_answers *****/ /* mysql> DESCRIBE tst_answers; -+------------+-------------------+------+-----+---------+-------+ -| Field | Type | Null | Key | Default | Extra | -+------------+-------------------+------+-----+---------+-------+ -| QstCod | int(11) | NO | MUL | NULL | | -| AnsInd | tinyint(4) | NO | | NULL | | -| Answer | text | NO | | NULL | | -| Feedback | text | NO | | NULL | | -| MediaName | varchar(43) | NO | | | | -| MediaType | enum('jpg','gif') | NO | | jpg | | -| MediaTitle | varchar(2047) | NO | | | | -| MediaURL | varchar(255) | NO | | | | -| Correct | enum('N','Y') | NO | | NULL | | -+------------+-------------------+------+-----+---------+-------+ ++------------+--------------------------+------+-----+---------+-------+ +| Field | Type | Null | Key | Default | Extra | ++------------+--------------------------+------+-----+---------+-------+ +| QstCod | int(11) | NO | MUL | NULL | | +| AnsInd | tinyint(4) | NO | | NULL | | +| Answer | text | NO | | NULL | | +| Feedback | text | NO | | NULL | | +| MediaName | varchar(43) | NO | | | | +| MediaType | enum('none','jpg','gif') | NO | | none | | +| MediaTitle | varchar(2047) | NO | | | | +| MediaURL | varchar(255) | NO | | | | +| Correct | enum('N','Y') | NO | | NULL | | ++------------+--------------------------+------+-----+---------+-------+ 9 rows in set (0.00 sec) */ DB_CreateTable ("CREATE TABLE IF NOT EXISTS tst_answers (" @@ -2568,7 +2568,7 @@ mysql> DESCRIBE tst_answers; "Answer TEXT NOT NULL," // Tst_MAX_BYTES_ANSWER_OR_FEEDBACK "Feedback TEXT NOT NULL," // Tst_MAX_BYTES_ANSWER_OR_FEEDBACK "MediaName VARCHAR(43) NOT NULL DEFAULT ''," // Med_BYTES_NAME - "MediaType ENUM('jpg','gif') NOT NULL DEFAULT 'jpg'," + "MediaType ENUM('none','jpg','gif') NOT NULL DEFAULT 'none'," "MediaTitle VARCHAR(2047) NOT NULL DEFAULT ''," // Med_MAX_BYTES_TITLE "MediaURL VARCHAR(255) NOT NULL DEFAULT ''," // Cns_MAX_BYTES_WWW "Correct ENUM('N','Y') NOT NULL," @@ -2685,7 +2685,7 @@ mysql> DESCRIBE tst_questions; | Stem | text | NO | | NULL | | | Feedback | text | NO | | NULL | | | MediaName | varchar(43) | NO | | | | -| MediaType | enum('jpg','gif') | NO | | jpg | | +| MediaType | enum('none','jpg','gif') | NO | | none | | | MediaTitle | varchar(2047) | NO | | | | | MediaURL | varchar(255) | NO | | | | | NumHits | int(11) | NO | | 0 | | @@ -2703,7 +2703,7 @@ mysql> DESCRIBE tst_questions; "Stem TEXT NOT NULL," // Cns_MAX_BYTES_TEXT "Feedback TEXT NOT NULL," // Cns_MAX_BYTES_TEXT "MediaName VARCHAR(43) NOT NULL DEFAULT ''," // Med_BYTES_NAME - "MediaType ENUM('jpg','gif') NOT NULL DEFAULT 'jpg'," + "MediaType ENUM('none','jpg','gif') NOT NULL DEFAULT 'none'," "MediaTitle VARCHAR(2047) NOT NULL DEFAULT ''," // Med_MAX_BYTES_TITLE "MediaURL VARCHAR(255) NOT NULL DEFAULT ''," // Cns_MAX_BYTES_WWW "NumHits INT NOT NULL DEFAULT 0," diff --git a/swad_forum.c b/swad_forum.c index 9ae5e1090..d99bb250f 100644 --- a/swad_forum.c +++ b/swad_forum.c @@ -538,7 +538,7 @@ static bool For_RemoveForumPst (long PstCod,struct Media *Media) bool ThreadDeleted = false; /***** Remove media file attached to forum post *****/ - Med_RemoveMediaFile (Media->Name,Media->Type); + Med_RemoveMediaFiles (Media->Name,Media->Type); /***** If the post is the only one in its thread, delete that thread *****/ if (For_NumPstsInThrWithPstCod (PstCod,&ThrCod) < 2) diff --git a/swad_game.c b/swad_game.c index 3771613ae..0146f8f04 100644 --- a/swad_game.c +++ b/swad_game.c @@ -3737,7 +3737,7 @@ static void Gam_IncreaseAnswerInDB (long QstCod,unsigned AnsInd) { /***** Increase number of users who have selected the answer AnsInd in the question QstCod *****/ - DB_QueryINSERT ("can not register your answer to the game", + DB_QueryUPDATE ("can not register your answer to the game", "UPDATE gam_answers SET NumUsrs=NumUsrs+1" " WHERE QstCod=%ld AND AnsInd=%u", QstCod,AnsInd); diff --git a/swad_media.c b/swad_media.c index d772a40fe..ba952ed17 100644 --- a/swad_media.c +++ b/swad_media.c @@ -51,7 +51,7 @@ const char *Med_StringsTypeDB[Med_NUM_TYPES] = { - "", // Med_UNKNOWN + "none", // Med_NONE "jpg", // Med_JPG "gif", // Med_GIF }; @@ -79,6 +79,9 @@ extern struct Globals Gbl; static Med_Action_t Med_GetMediaActionFromForm (const char *ParamAction); static void Med_GetAndProcessFileFromForm (struct Media *Media, const char *ParamFile); +static bool Med_DetectIfAnimated (struct Media *Media, + const char PathMedPrivTmp[PATH_MAX + 1], + const char PathFileOrg[PATH_MAX + 1]); static void Med_ProcessJPG (struct Media *Media, const char PathMedPrivTmp[PATH_MAX + 1], @@ -129,7 +132,7 @@ void Med_ResetMediaExceptTitleAndURL (struct Media *Media) Media->Action = Med_ACTION_NO_MEDIA; Media->Status = Med_FILE_NONE; Media->Name[0] = '\0'; - Media->Type = Med_UNKNOWN; + Media->Type = Med_NONE; } /*****************************************************************************/ @@ -190,9 +193,10 @@ void Med_GetMediaDataFromRow (const char *Name, /***** Convert type string to type *****/ Media->Type = Med_GetTypeFromStrInDB (TypeStr); - /***** Set status of image file *****/ - Media->Status = Media->Name[0] ? Med_NAME_STORED_IN_DB : - Med_FILE_NONE; + /***** Set status of media file *****/ + Media->Status = (Media->Name[0] && + Media->Type != Med_NONE) ? Med_NAME_STORED_IN_DB : + Med_FILE_NONE; /***** Copy image title to struct *****/ // Media->Title can be empty or filled with previous value @@ -314,7 +318,7 @@ void Med_GetMediaFromForm (int NumMediaInForm,struct Media *Media, Media->Action = Med_GetMediaActionFromForm (ParamUploadMedia.Action); Media->Status = Med_FILE_NONE; Media->Name[0] = '\0'; - Media->Type = Med_UNKNOWN; + Media->Type = Med_NONE; /***** Secondly, get the media (image/video) name and the file *****/ switch (Media->Action) @@ -327,12 +331,12 @@ void Med_GetMediaFromForm (int NumMediaInForm,struct Media *Media, case Med_FILE_NONE: // No new image/video received Media->Action = Med_ACTION_NO_MEDIA; Media->Name[0] = '\0'; - Media->Type = Med_UNKNOWN; + Media->Type = Med_NONE; break; case Med_FILE_RECEIVED: // New image/video received, but not processed Media->Status = Med_FILE_NONE; Media->Name[0] = '\0'; - Media->Type = Med_UNKNOWN; + Media->Type = Med_NONE; break; default: break; @@ -476,7 +480,7 @@ static void Med_GetAndProcessFileFromForm (struct Media *Media, /* Check extension */ Media->Type = Med_GetTypeFromExtension (PtrExtension); - if (Media->Type == Med_UNKNOWN) + if (Media->Type == Med_NONE) return; /* Check if the file type is image/ or application/octet-stream */ @@ -518,6 +522,11 @@ static void Med_GetAndProcessFileFromForm (struct Media *Media, { Media->Status = Med_FILE_RECEIVED; + /***** Detect if amnimated gif *****/ + if (Media->Type == Med_GIF) + if (!Med_DetectIfAnimated (Media,PathMedPrivTmp,PathFileOrg)) + Media->Type = Med_JPG; + /***** Process media depending on the media file extension *****/ switch (Media->Type) { @@ -537,6 +546,51 @@ static void Med_GetAndProcessFileFromForm (struct Media *Media, unlink (PathFileOrg); } +/*****************************************************************************/ +/********************* Detect if a GIF image is animated *********************/ +/*****************************************************************************/ +// Return true if animated +// Return false if static or error + +static bool Med_DetectIfAnimated (struct Media *Media, + const char PathMedPrivTmp[PATH_MAX + 1], + const char PathFileOrg[PATH_MAX + 1]) + { + char PathFileTxtTmp[PATH_MAX + 1]; + char Command[128 + PATH_MAX * 2]; + int ReturnCode; + FILE *FileTxtTmp; // Temporary file with the output of the command + int NumFrames = 0; + + /***** Build path to temporary text file *****/ + snprintf (PathFileTxtTmp,sizeof (PathFileTxtTmp), + "%s/%s.txt", + PathMedPrivTmp,Media->Name); + + /***** Execute system command to get number of frames in GIF *****/ + snprintf (Command,sizeof (Command), + "identify -format '%%n\n' %s | head -1 > %s", + PathFileOrg,PathFileTxtTmp); + ReturnCode = system (Command); + if (ReturnCode == -1) + return false; // Error + ReturnCode = WEXITSTATUS(ReturnCode); + if (ReturnCode != 0) + return false; // Error + + /***** Read temporary file *****/ + if ((FileTxtTmp = fopen (PathFileTxtTmp,"rb")) == NULL) + return false; // Error + if (fscanf (FileTxtTmp,"%d",&NumFrames) != 1) + return false; // Error + fclose (FileTxtTmp); + + /***** Remove temporary file *****/ + unlink (PathFileTxtTmp); + + return (NumFrames > 1); // NumFrames > 1 ==> Animated + } + /*****************************************************************************/ /************* Process original image generating processed JPG ***************/ /*****************************************************************************/ @@ -576,7 +630,7 @@ static void Med_ProcessGIF (struct Media *Media, const char PathFileOrg[PATH_MAX + 1]) { extern const char *Txt_The_image_could_not_be_processed_successfully; - extern const char *Txt_The_size_of_the_gif_file_exceeds_the_maximum_allowed_X; + extern const char *Txt_The_size_of_the_GIF_file_exceeds_the_maximum_allowed_X; struct stat FileStatus; char PathFilePNGTmp[PATH_MAX + 1]; // Full name of temporary processed file char PathFileGIFTmp[PATH_MAX + 1]; // Full name of temporary processed file @@ -627,7 +681,7 @@ static void Med_ProcessGIF (struct Media *Media, { /* Show warning alert */ Fil_WriteFileSizeBrief ((double) Med_MAX_SIZE_GIF,FileSizeStr); - Ale_ShowAlert (Ale_WARNING,Txt_The_size_of_the_gif_file_exceeds_the_maximum_allowed_X, + Ale_ShowAlert (Ale_WARNING,Txt_The_size_of_the_GIF_file_exceeds_the_maximum_allowed_X, FileSizeStr); } } @@ -785,7 +839,7 @@ void Med_ShowMedia (struct Media *Media, return; if (!Media->Name[0]) return; - if (Media->Type == Med_UNKNOWN) + if (Media->Type == Med_NONE) return; if (Media->Status != Med_NAME_STORED_IN_DB) return; @@ -976,7 +1030,7 @@ static void Med_ShowGIF (struct Media *Media, } /*****************************************************************************/ -/**** Remove private file with an image/video, given the image/video name ****/ +/*** Remove private files with an image/video, given the image/video name ****/ /*****************************************************************************/ void Med_RemoveMediaFilesFromAllRows (unsigned NumMedia,MYSQL_RES *mysql_res) @@ -987,10 +1041,10 @@ void Med_RemoveMediaFilesFromAllRows (unsigned NumMedia,MYSQL_RES *mysql_res) for (NumMed = 0; NumMed < NumMedia; NumMed++) - Med_RemoveMediaFileFromRow (mysql_res); + Med_RemoveMediaFilesFromRow (mysql_res); } -void Med_RemoveMediaFileFromRow (MYSQL_RES *mysql_res) +void Med_RemoveMediaFilesFromRow (MYSQL_RES *mysql_res) { MYSQL_ROW row; @@ -998,10 +1052,10 @@ void Med_RemoveMediaFileFromRow (MYSQL_RES *mysql_res) row = mysql_fetch_row (mysql_res); /***** Remove image file *****/ - Med_RemoveMediaFile (row[0],Med_GetTypeFromStrInDB (row[1])); + Med_RemoveMediaFiles (row[0],Med_GetTypeFromStrInDB (row[1])); } -void Med_RemoveMediaFile (const char *Name,Med_Type_t Type) +void Med_RemoveMediaFiles (const char *Name,Med_Type_t Type) { char PathMedPriv[PATH_MAX + 1]; char FullPathMediaPriv[PATH_MAX + 1]; @@ -1018,34 +1072,28 @@ void Med_RemoveMediaFile (const char *Name,Med_Type_t Type) switch (Type) { case Med_JPG: - /***** Build path to private file *****/ + /***** Remove private JPG file *****/ snprintf (FullPathMediaPriv,sizeof (FullPathMediaPriv), "%s/%s.jpg", PathMedPriv,Name); - - /***** Remove private file *****/ unlink (FullPathMediaPriv); break; case Med_GIF: - /***** Build path to private GIF file *****/ + /***** Remove private GIF file *****/ snprintf (FullPathMediaPriv,sizeof (FullPathMediaPriv), "%s/%s.gif", PathMedPriv,Name); - - /***** Remove private file *****/ unlink (FullPathMediaPriv); - /***** Build path to private PNG file *****/ + /***** Remove private PNG file *****/ snprintf (FullPathMediaPriv,sizeof (FullPathMediaPriv), "%s//%s.png", PathMedPriv,Name); - - /***** Remove private file *****/ unlink (FullPathMediaPriv); break; - case Med_UNKNOWN: + case Med_NONE: Lay_ShowErrorAndExit ("Wrong media type."); break; } @@ -1062,13 +1110,13 @@ Med_Type_t Med_GetTypeFromStrInDB (const char *Str) { Med_Type_t Type; - for (Type = (Med_Type_t) 1; // Skip unknown type + for (Type = (Med_Type_t) 0; Type < Med_NUM_TYPES; Type++) if (!strcasecmp (Str,Med_StringsTypeDB[Type])) return Type; - return Med_UNKNOWN; + return Med_NONE; } /*****************************************************************************/ @@ -1089,7 +1137,7 @@ static Med_Type_t Med_GetTypeFromExtension (const char *Extension) if (!strcasecmp (Extension,"gif")) return Med_GIF; - return Med_UNKNOWN; + return Med_NONE; } /*****************************************************************************/ @@ -1099,9 +1147,8 @@ static Med_Type_t Med_GetTypeFromExtension (const char *Extension) const char *Med_GetStringTypeForDB (Med_Type_t Type) { /***** Check if type is out of valid range *****/ - if (Type < (Med_Type_t) 1 || - Type > (Med_Type_t) (Med_NUM_TYPES - 1)) - return Med_StringsTypeDB[Med_UNKNOWN]; + if (Type > (Med_Type_t) (Med_NUM_TYPES - 1)) + return Med_StringsTypeDB[Med_NONE]; /***** Get string from type *****/ return Med_StringsTypeDB[Type]; diff --git a/swad_media.h b/swad_media.h index 240d61730..9ba37ff38 100644 --- a/swad_media.h +++ b/swad_media.h @@ -91,7 +91,7 @@ typedef enum #define Med_NUM_TYPES 3 typedef enum { - Med_UNKNOWN, + Med_NONE, Med_JPG, Med_GIF, } Med_Type_t; @@ -149,8 +149,8 @@ void Med_ShowMedia (struct Media *Media, const char *ClassContainer,const char *ClassMedia); void Med_RemoveMediaFilesFromAllRows (unsigned NumMedia,MYSQL_RES *mysql_res); -void Med_RemoveMediaFileFromRow (MYSQL_RES *mysql_res); -void Med_RemoveMediaFile (const char *Name,Med_Type_t Type); +void Med_RemoveMediaFilesFromRow (MYSQL_RES *mysql_res); +void Med_RemoveMediaFiles (const char *Name,Med_Type_t Type); Med_Type_t Med_GetTypeFromStrInDB (const char *Str); const char *Med_GetStringTypeForDB (Med_Type_t Type); diff --git a/swad_social.c b/swad_social.c index e5ad1630a..bb903b948 100644 --- a/swad_social.c +++ b/swad_social.c @@ -862,6 +862,7 @@ static void Soc_BuildQueryToGetTimeline (char **Query, static long Soc_GetPubCodFromSession (const char *FieldName) { + extern const char *Txt_The_session_has_expired; MYSQL_RES *mysql_res; MYSQL_ROW row; long PubCod; @@ -870,7 +871,7 @@ static long Soc_GetPubCodFromSession (const char *FieldName) if (DB_QuerySELECT (&mysql_res,"can not get publishing code from session", "SELECT %s FROM sessions WHERE SessionId='%s'", FieldName,Gbl.Session.Id) != 1) - Lay_ShowErrorAndExit ("Error when getting publishing code from session."); + Lay_ShowErrorAndExit (Txt_The_session_has_expired); /***** Get last publishing code *****/ row = mysql_fetch_row (mysql_res); @@ -2456,12 +2457,12 @@ static long Soc_ReceiveSocialPost (void) Media.Quality = Soc_IMAGE_SAVED_QUALITY; Med_GetMediaFromForm (-1,&Media,NULL); - if (Content[0] || // Text not empty - Media.Name[0]) // An image is attached + if (Content[0] || // Text not empty + (Media.Name[0] && Media.Type != Med_NONE)) // A media is attached { /***** Check if image is received and processed *****/ if (Media.Action == Med_ACTION_NEW_MEDIA && // Upload new image - Media.Status == Med_FILE_PROCESSED) // The new image received has been processed + Media.Status == Med_FILE_PROCESSED) // The new image received has been processed /* Move processed image to definitive directory */ Med_MoveMediaToDefinitiveDir (&Media); @@ -3184,8 +3185,8 @@ static long Soc_ReceiveComment (void) Media.Quality = Soc_IMAGE_SAVED_QUALITY; Med_GetMediaFromForm (-1,&Media,NULL); - if (Content[0] || // Text not empty - Media.Name[0]) // An image is attached + if (Content[0] || // Text not empty + (Media.Name[0] && Media.Type != Med_NONE)) // A media is attached { /***** Check if image is received and processed *****/ if (Media.Action == Med_ACTION_NEW_MEDIA && // Upload new image @@ -3878,7 +3879,7 @@ static void Soc_RemoveImgFileFromSocialPost (long PstCod) " WHERE PstCod=%ld", PstCod)) /***** Remove media file *****/ - Med_RemoveMediaFileFromRow (mysql_res); + Med_RemoveMediaFilesFromRow (mysql_res); /***** Free structure that stores the query result *****/ DB_FreeMySQLResult (&mysql_res); @@ -4217,7 +4218,7 @@ static void Soc_RemoveImgFileFromSocialComment (long PubCod) " WHERE PubCod=%ld", PubCod)) /***** Remove media file *****/ - Med_RemoveMediaFileFromRow (mysql_res); + Med_RemoveMediaFilesFromRow (mysql_res); /***** Free structure that stores the query result *****/ DB_FreeMySQLResult (&mysql_res); diff --git a/swad_test.c b/swad_test.c index 315854e32..36765d1d7 100644 --- a/swad_test.c +++ b/swad_test.c @@ -6559,7 +6559,8 @@ static void Tst_InsertOrUpdateQstIntoDB (void) Gbl.Test.Media.URL ? Gbl.Test.Media.URL : ""); /* Update image status */ - if (Gbl.Test.Media.Name[0]) + if (Gbl.Test.Media.Name[0] && + Gbl.Test.Media.Type != Med_NONE) Gbl.Test.Media.Status = Med_NAME_STORED_IN_DB; } else // It's an existing question @@ -6584,7 +6585,8 @@ static void Tst_InsertOrUpdateQstIntoDB (void) Gbl.Test.QstCod,Gbl.CurrentCrs.Crs.CrsCod); /* Update image status */ - if (Gbl.Test.Media.Name[0]) + if (Gbl.Test.Media.Name[0] && + Gbl.Test.Media.Type != Med_NONE) Gbl.Test.Media.Status = Med_NAME_STORED_IN_DB; /* Remove answers and tags from this test question */ @@ -6654,9 +6656,10 @@ static void Tst_InsertAnswersIntoDB (void) "MediaName,MediaType,MediaTitle,MediaURL,Correct)" " VALUES" " (%ld,0,%ld,''," - "'','','','','Y')", + "'','%s','','','Y')", Gbl.Test.QstCod, - Gbl.Test.Answer.Integer); + Gbl.Test.Answer.Integer, + Med_GetStringTypeForDB (Med_NONE)); break; case Tst_ANS_FLOAT: Str_SetDecimalPointToUS (); // To print the floating point as a dot @@ -6669,9 +6672,10 @@ static void Tst_InsertAnswersIntoDB (void) "MediaName,MediaType,MediaTitle,MediaURL,Correct)" " VALUES" " (%ld,%u,'%lg',''," - "'','','','','Y')", + "'','%s','','','Y')", Gbl.Test.QstCod,i, - Gbl.Test.Answer.FloatingPoint[i]); + Gbl.Test.Answer.FloatingPoint[i], + Med_GetStringTypeForDB (Med_NONE)); Str_SetDecimalPointToLocal (); // Return to local system break; case Tst_ANS_TRUE_FALSE: @@ -6681,9 +6685,10 @@ static void Tst_InsertAnswersIntoDB (void) "MediaName,Mediatype,MediaTitle,MediaURL,Correct)" " VALUES" " (%ld,0,'%c',''," - "'','','','','Y')", + "'','%s','','','Y')", Gbl.Test.QstCod, - Gbl.Test.Answer.TF); + Gbl.Test.Answer.TF, + Med_GetStringTypeForDB (Med_NONE)); break; case Tst_ANS_UNIQUE_CHOICE: case Tst_ANS_MULTIPLE_CHOICE: @@ -6711,7 +6716,8 @@ static void Tst_InsertAnswersIntoDB (void) 'N'); /* Update image status */ - if (Gbl.Test.Answer.Options[NumOpt].Media.Name[0]) + if (Gbl.Test.Answer.Options[NumOpt].Media.Name[0] && + Gbl.Test.Answer.Options[NumOpt].Media.Type != Med_NONE) Gbl.Test.Answer.Options[NumOpt].Media.Status = Med_NAME_STORED_IN_DB; } break; @@ -6781,7 +6787,7 @@ static void Tst_RemoveImgFileFromStemOfQst (long CrsCod,long QstCod) " WHERE QstCod=%ld AND CrsCod=%ld", QstCod,CrsCod)) /***** Remove media file *****/ - Med_RemoveMediaFileFromRow (mysql_res); + Med_RemoveMediaFilesFromRow (mysql_res); /***** Free structure that stores the query result *****/ DB_FreeMySQLResult (&mysql_res); @@ -6833,7 +6839,7 @@ static void Tst_RemoveImgFileFromAnsOfQst (long CrsCod,long QstCod,unsigned AnsI " AND tst_answers.AnsInd=%u", CrsCod,QstCod,QstCod,AnsInd)) /***** Remove media file *****/ - Med_RemoveMediaFileFromRow (mysql_res); + Med_RemoveMediaFilesFromRow (mysql_res); /***** Free structure that stores the query result *****/ DB_FreeMySQLResult (&mysql_res); diff --git a/swad_text.c b/swad_text.c index 40821d6f5..7d8b82f26 100644 --- a/swad_text.c +++ b/swad_text.c @@ -46871,7 +46871,7 @@ const char *Txt_The_session_has_expired = "A sessão expirou."; #endif -const char *Txt_The_size_of_the_gif_file_exceeds_the_maximum_allowed_X = // Warning: it is very important to include %s in the following sentences +const char *Txt_The_size_of_the_GIF_file_exceeds_the_maximum_allowed_X = // Warning: it is very important to include %s in the following sentences #if L==1 // ca "La mida del fitxer GIF" " supera el màxim permès (%s)."; diff --git a/swad_web_service.c b/swad_web_service.c index d72510338..5efc9bd49 100644 --- a/swad_web_service.c +++ b/swad_web_service.c @@ -3450,8 +3450,9 @@ static int Svc_SendMessageToUsr (long OriginalMsgCod, "MediaName,MediaType,MediaTitle,MediaURL)" " VALUES" " ('%s','%s'," - "'','','','')", - Subject,Content); + "'','%s','','')", + Subject,Content, + Med_GetStringTypeForDB (Med_NONE)); /* Insert message in sent messages */ DB_QueryINSERT ("can not create message",