From 6f662b8c74ddc6e896e74e6b563e0769bb66fef5 Mon Sep 17 00:00:00 2001 From: Michael Vogel Date: Thu, 28 Jan 2016 01:26:19 +0100 Subject: [PATCH] New avatar picture fields to better cope with changing avatars --- include/Contact.php | 3 +- include/Photo.php | 110 +++++++++++++++++++++++--------------- include/dbstructure.php | 4 ++ include/diaspora.php | 9 +++- include/discover_poco.php | 1 + include/follow.php | 5 +- include/gprobe.php | 4 +- include/ostatus.php | 8 +-- include/socgraph.php | 33 ++++++++++-- mod/contacts.php | 5 +- mod/crepair.php | 5 +- mod/dfrn_confirm.php | 4 ++ mod/item.php | 1 + mod/poco.php | 5 +- mod/wall_upload.php | 5 ++ 15 files changed, 143 insertions(+), 59 deletions(-) diff --git a/include/Contact.php b/include/Contact.php index 86e67bbe86..1c99dd0298 100644 --- a/include/Contact.php +++ b/include/Contact.php @@ -488,9 +488,10 @@ function get_contact($url, $uid = 0) { $photos = import_profile_photo($data["photo"],$uid,$contactid); - q("UPDATE `contact` SET `photo` = '%s', `thumb` = '%s', `micro` = '%s', + q("UPDATE `contact` SET `avatar` = '%s', `photo` = '%s', `thumb` = '%s', `micro` = '%s', `addr` = '%s', `alias` = '%s', `name` = '%s', `nick` = '%s', `name-date` = '%s', `uri-date` = '%s', `avatar-date` = '%s' WHERE `id` = %d", + dbesc($data["photo"]), dbesc($photos[0]), dbesc($photos[1]), dbesc($photos[2]), diff --git a/include/Photo.php b/include/Photo.php index 5fdd682e74..e0cb23008a 100644 --- a/include/Photo.php +++ b/include/Photo.php @@ -720,65 +720,91 @@ function guess_image_type($filename, $fromcurl=false) { } -function import_profile_photo($photo,$uid,$cid) { +function update_contact_avatar($avatar,$uid,$cid) { - $a = get_app(); + $r = q("SELECT `avatar`, `photo`, `thumb`, `micro` FROM `contact` WHERE `id` = %d LIMIT 1", intval($cid)); + if (!$r) + return false; + else + $data = array($r[0]["photo"], $r[0]["thumb"], $r[0]["micro"]); - $r = q("select `resource-id` from photo where `uid` = %d and `contact-id` = %d and `scale` = 4 and `album` = 'Contact Photos' limit 1", - intval($uid), - intval($cid) - ); - if(count($r) && strlen($r[0]['resource-id'])) { - $hash = $r[0]['resource-id']; - } - else { - $hash = photo_new_resource(); - } + if ($r[0]["avatar"] != $avatar) { + $photos = import_profile_photo($avatar,$uid,$cid, true); - $photo_failure = false; + if ($photos) { + q("UPDATE `contact` SET `avatar` = '%s', `photo` = '%s', `thumb` = '%s', `micro` = '%s', `avatar-date` = '%s' WHERE `id` = %d", + dbesc($avatar), dbesc($photos[0]), dbesc($photos[1]), dbesc($photos[2]), + dbesc(datetime_convert()), intval($cid)); + return $photos; + } + } - $filename = basename($photo); - $img_str = fetch_url($photo,true); + return $data; +} - $type = guess_image_type($photo,true); - $img = new Photo($img_str, $type); - if($img->is_valid()) { +function import_profile_photo($photo,$uid,$cid, $quit_on_error = false) { - $img->scaleImageSquare(175); + $a = get_app(); - $r = $img->store($uid, $cid, $hash, $filename, 'Contact Photos', 4 ); + $r = q("select `resource-id` from photo where `uid` = %d and `contact-id` = %d and `scale` = 4 and `album` = 'Contact Photos' limit 1", + intval($uid), + intval($cid) + ); + if(count($r) && strlen($r[0]['resource-id'])) { + $hash = $r[0]['resource-id']; + } else { + $hash = photo_new_resource(); + } - if($r === false) - $photo_failure = true; + $photo_failure = false; - $img->scaleImage(80); + $filename = basename($photo); + $img_str = fetch_url($photo,true); - $r = $img->store($uid, $cid, $hash, $filename, 'Contact Photos', 5 ); + if ($quit_on_error AND ($img_str == "")) + return false; - if($r === false) - $photo_failure = true; + $type = guess_image_type($photo,true); + $img = new Photo($img_str, $type); + if($img->is_valid()) { - $img->scaleImage(48); + $img->scaleImageSquare(175); - $r = $img->store($uid, $cid, $hash, $filename, 'Contact Photos', 6 ); + $r = $img->store($uid, $cid, $hash, $filename, 'Contact Photos', 4 ); - if($r === false) - $photo_failure = true; + if($r === false) + $photo_failure = true; - $photo = $a->get_baseurl() . '/photo/' . $hash . '-4.' . $img->getExt(); - $thumb = $a->get_baseurl() . '/photo/' . $hash . '-5.' . $img->getExt(); - $micro = $a->get_baseurl() . '/photo/' . $hash . '-6.' . $img->getExt(); - } - else - $photo_failure = true; + $img->scaleImage(80); - if($photo_failure) { - $photo = $a->get_baseurl() . '/images/person-175.jpg'; - $thumb = $a->get_baseurl() . '/images/person-80.jpg'; - $micro = $a->get_baseurl() . '/images/person-48.jpg'; - } + $r = $img->store($uid, $cid, $hash, $filename, 'Contact Photos', 5 ); - return(array($photo,$thumb,$micro)); + if($r === false) + $photo_failure = true; + + $img->scaleImage(48); + + $r = $img->store($uid, $cid, $hash, $filename, 'Contact Photos', 6 ); + + if($r === false) + $photo_failure = true; + + $photo = $a->get_baseurl() . '/photo/' . $hash . '-4.' . $img->getExt(); + $thumb = $a->get_baseurl() . '/photo/' . $hash . '-5.' . $img->getExt(); + $micro = $a->get_baseurl() . '/photo/' . $hash . '-6.' . $img->getExt(); + } else + $photo_failure = true; + + if($photo_failure AND $quit_on_error) + return false; + + if($photo_failure) { + $photo = $a->get_baseurl() . '/images/person-175.jpg'; + $thumb = $a->get_baseurl() . '/images/person-80.jpg'; + $micro = $a->get_baseurl() . '/images/person-48.jpg'; + } + + return(array($photo,$thumb,$micro)); } diff --git a/include/dbstructure.php b/include/dbstructure.php index 43dfbd7b35..fd5883911a 100644 --- a/include/dbstructure.php +++ b/include/dbstructure.php @@ -453,6 +453,7 @@ function db_definition() { "keywords" => array("type" => "text", "not null" => "1"), "gender" => array("type" => "varchar(32)", "not null" => "1", "default" => ""), "attag" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), + "avatar" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), "photo" => array("type" => "text", "not null" => "1"), "thumb" => array("type" => "text", "not null" => "1"), "micro" => array("type" => "text", "not null" => "1"), @@ -656,7 +657,10 @@ function db_definition() { "nick" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), "url" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), "nurl" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), + "avatar" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), "photo" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), + "thumb" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), + "micro" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), "connect" => array("type" => "varchar(255)", "not null" => "1", "default" => ""), "created" => array("type" => "datetime", "not null" => "1", "default" => "0000-00-00 00:00:00"), "updated" => array("type" => "datetime", "default" => "0000-00-00 00:00:00"), diff --git a/include/diaspora.php b/include/diaspora.php index b72239c4ce..3f0b4be432 100644 --- a/include/diaspora.php +++ b/include/diaspora.php @@ -740,6 +740,7 @@ function diaspora_request($importer,$xml) { $new_relation = CONTACT_IS_FOLLOWER; $r = q("UPDATE `contact` SET + `avatar` = '%s', `photo` = '%s', `thumb` = '%s', `micro` = '%s', @@ -752,6 +753,7 @@ function diaspora_request($importer,$xml) { `writable` = 1 WHERE `id` = %d ", + dbesc($contact_record['photo']), dbesc($photos[0]), dbesc($photos[1]), dbesc($photos[2]), @@ -2491,12 +2493,15 @@ function diaspora_profile($importer,$xml,$msg) { /// @TODO Update name on item['author-name'] if the name changed. See consume_feed() /// (Not doing this currently because D* protocol is scheduled for revision soon). - $r = q("UPDATE `contact` SET `name` = '%s', `nick` = '%s', `addr` = '%s', `name-date` = '%s', `photo` = '%s', `thumb` = '%s', `micro` = '%s', `avatar-date` = '%s' , `bd` = '%s', `location` = '%s', `about` = '%s', `keywords` = '%s', `gender` = '%s' WHERE `id` = %d AND `uid` = %d", + $r = q("UPDATE `contact` SET `name` = '%s', `nick` = '%s', `addr` = '%s', `name-date` = '%s', + `avatar` = '%s', `photo` = '%s', `thumb` = '%s', `micro` = '%s', `avatar-date` = '%s' , `bd` = '%s', + `location` = '%s', `about` = '%s', `keywords` = '%s', `gender` = '%s' WHERE `id` = %d AND `uid` = %d", dbesc($name), dbesc($nick), dbesc($diaspora_handle), dbesc(datetime_convert()), dbesc($image_url), + dbesc($images[0]), dbesc($images[1]), dbesc($images[2]), dbesc(datetime_convert()), @@ -2516,7 +2521,7 @@ function diaspora_profile($importer,$xml,$msg) { } update_gcontact(array("url" => $contact['url'], "network" => NETWORK_DIASPORA, "generation" => 2, - "photo" => $image_url, "name" => $name, "location" => $location, + "avatar" => $image_url, "name" => $name, "location" => $location, "about" => $about, "birthday" => $birthday, "gender" => $gender, "addr" => $diaspora_handle, "nick" => $nick, "keywords" => $keywords, "hide" => !$searchable, "nsfw" => $nsfw)); diff --git a/include/discover_poco.php b/include/discover_poco.php index a8f670334b..63d1175a71 100644 --- a/include/discover_poco.php +++ b/include/discover_poco.php @@ -222,6 +222,7 @@ function gs_search_user($search) { $contact = probe_url($user->site_address."/".$user->name); if ($contact["network"] != NETWORK_PHANTOM) { $contact["about"] = $user->description; + $contact["avatar"] = $contact["photo"]; update_gcontact($contact); } } diff --git a/include/follow.php b/include/follow.php index 21c05c8f3e..8e6094cb4d 100644 --- a/include/follow.php +++ b/include/follow.php @@ -266,13 +266,16 @@ function new_contact($uid,$url,$interactive = false) { $photos = import_profile_photo($ret['photo'],$uid,$contact_id); - $r = q("UPDATE `contact` SET `photo` = '%s', + $r = q("UPDATE `contact` SET + `avatar` = '%s', + `photo` = '%s', `thumb` = '%s', `micro` = '%s', `name-date` = '%s', `uri-date` = '%s', `avatar-date` = '%s' WHERE `id` = %d", + dbesc($ret['photo']), dbesc($photos[0]), dbesc($photos[1]), dbesc($photos[2]), diff --git a/include/gprobe.php b/include/gprobe.php index dfa9137d7d..8e4d3715c0 100644 --- a/include/gprobe.php +++ b/include/gprobe.php @@ -58,8 +58,10 @@ function gprobe_run(&$argv, &$argc){ if (is_null($result)) Cache::set("gprobe:".$urlparts["host"],serialize($arr)); - if (!in_array($result["network"], array(NETWORK_FEED, NETWORK_PHANTOM))) + if (!in_array($result["network"], array(NETWORK_FEED, NETWORK_PHANTOM))) { + $arr["avatar"] = $arr["photo"]; update_gcontact($arr); + } $r = q("SELECT `id`, `url`, `network` FROM `gcontact` WHERE `nurl` = '%s' ORDER BY `id` LIMIT 1", dbesc(normalise_link($url)) diff --git a/include/ostatus.php b/include/ostatus.php index 4ccd13130d..eeacd40de4 100644 --- a/include/ostatus.php +++ b/include/ostatus.php @@ -166,13 +166,13 @@ function ostatus_fetchauthor($xpath, $context, $importer, &$contact, $onlyfetch) "", "", "", datetime_convert(), 2, $contact["id"], $contact["uid"]); } - if (isset($author["author-avatar"]) AND ($author["author-avatar"] != $r[0]['photo'])) { + if (isset($author["author-avatar"]) AND ($author["author-avatar"] != $r[0]['avatar'])) { logger("Update profile picture for contact ".$contact["id"], LOGGER_DEBUG); $photos = import_profile_photo($author["author-avatar"], $importer["uid"], $contact["id"]); - q("UPDATE `contact` SET `photo` = '%s', `thumb` = '%s', `micro` = '%s', `avatar-date` = '%s' WHERE `id` = %d AND `network` = '%s'", - dbesc($author["author-avatar"]), dbesc($photos[1]), dbesc($photos[2]), + q("UPDATE `contact` SET `avatar` = '%s', `photo` = '%s', `thumb` = '%s', `micro` = '%s', `avatar-date` = '%s' WHERE `id` = %d AND `network` = '%s'", + dbesc($author["author-avatar"]), dbesc($photos[0]), dbesc($photos[1]), dbesc($photos[2]), dbesc(datetime_convert()), intval($contact["id"]), dbesc(NETWORK_OSTATUS)); } @@ -180,7 +180,7 @@ function ostatus_fetchauthor($xpath, $context, $importer, &$contact, $onlyfetch) if ($contact["network"] == NETWORK_OSTATUS) { /// @todo Add the "addr" field $contact["generation"] = 2; - $contact["photo"] = $author["author-avatar"]; + $contact["avatar"] = $author["author-avatar"]; update_gcontact($contact); } } diff --git a/include/socgraph.php b/include/socgraph.php index c545343393..241e2df7f0 100644 --- a/include/socgraph.php +++ b/include/socgraph.php @@ -10,7 +10,7 @@ require_once('include/datetime.php'); require_once("include/Scrape.php"); require_once("include/html2bbcode.php"); - +require_once("include/Contact.php"); /* * poco_load @@ -294,7 +294,7 @@ function poco_check($profile_url, $name, $network, $profile_photo, $about, $loca "alias" => $alias, "name" => $name, "network" => $network, - "photo" => $profile_photo, + "avatar" => $profile_photo, "about" => $about, "location" => $location, "gender" => $gender, @@ -1517,7 +1517,7 @@ function update_gcontact($contact) { if (!$gcontact_id) return false; - $r = q("SELECT `name`, `nick`, `photo`, `location`, `about`, `addr`, `generation`, `birthday`, `gender`, `keywords`, + $r = q("SELECT `name`, `nick`, `avatar`, `photo`, `thumb`, `micro`, `location`, `about`, `addr`, `generation`, `birthday`, `gender`, `keywords`, `hide`, `nsfw`, `network`, `alias`, `notify`, `server_url`, `connect`, `updated`, `url` FROM `gcontact` WHERE `id` = %d LIMIT 1", intval($gcontact_id)); @@ -1552,14 +1552,37 @@ function update_gcontact($contact) { if ($contact["generation"] < $r[0]["generation"]) $update = true; + if (isset($contact["avatar"]) AND (($contact["avatar"] != $r[0]["avatar"]) OR + ($r[0]["photo"] == $r[0]["avatar"]) OR ($r[0]["thumb"] == "") OR ($r[0]["micro"] == ""))) { + + $cid = get_contact($contact["url"]); + + // We always store avatar picture with a contact-id. + // We don't have a contact-id when we use the gcontact table. + // Solution is to use a matching entry in the contact table. (Which is not totally clean) + if (($cid == 0) AND isset($contact["uid"])) + $cid = get_contact($contact["url"], $contact["uid"]); + + $photos = update_contact_avatar($contact["avatar"], 0, $cid); + + if ($photos) { + $contact["photo"] = $photos[0]; + $contact["thumb"] = $photos[1]; + $contact["micro"] = $photos[2]; + } + } + if ($update) { - q("UPDATE `gcontact` SET `photo` = '%s', `name` = '%s', `nick` = '%s', `addr` = '%s', `network` = '%s', + + q("UPDATE `gcontact` SET `avatar` = '%s', `photo` = '%s', `thumb` = '%s', `micro` = '%s', + `name` = '%s', `nick` = '%s', `addr` = '%s', `network` = '%s', `birthday` = '%s', `gender` = '%s', `keywords` = %d, `hide` = %d, `nsfw` = %d, `alias` = '%s', `notify` = '%s', `url` = '%s', `location` = '%s', `about` = '%s', `generation` = %d, `updated` = '%s', `server_url` = '%s', `connect` = '%s' WHERE `nurl` = '%s' AND (`generation` = 0 OR `generation` >= %d)", - dbesc($contact["photo"]), dbesc($contact["name"]), dbesc($contact["nick"]), + dbesc($contact["avatar"]), dbesc($contact["photo"]), dbesc($contact["thumb"]), + dbesc($contact["micro"]), dbesc($contact["name"]), dbesc($contact["nick"]), dbesc($contact["addr"]), dbesc($contact["network"]), dbesc($contact["birthday"]), dbesc($contact["gender"]), dbesc($contact["keywords"]), intval($contact["hide"]), intval($contact["nsfw"]), dbesc($contact["alias"]), dbesc($contact["notify"]), diff --git a/mod/contacts.php b/mod/contacts.php index 21578a3295..1ef201490c 100644 --- a/mod/contacts.php +++ b/mod/contacts.php @@ -295,7 +295,9 @@ function _contact_update_profile($contact_id) { $photos = import_profile_photo($data['photo'], local_user(), $contact_id); - $r = q("UPDATE `contact` SET `photo` = '%s', + $r = q("UPDATE `contact` SET + `avatar` = '%s', + `photo` = '%s', `thumb` = '%s', `micro` = '%s', `name-date` = '%s', @@ -303,6 +305,7 @@ function _contact_update_profile($contact_id) { `avatar-date` = '%s' WHERE `id` = %d", dbesc($data["photo"]), + dbesc($photos[0]), dbesc($photos[1]), dbesc($photos[2]), dbesc(datetime_convert()), diff --git a/mod/crepair.php b/mod/crepair.php index 6f951bdf6e..606c388458 100644 --- a/mod/crepair.php +++ b/mod/crepair.php @@ -82,7 +82,9 @@ function crepair_post(&$a) { $photos = import_profile_photo($photo,local_user(),$contact['id']); - $x = q("UPDATE `contact` SET `photo` = '%s', + $x = q("UPDATE `contact` SET + `avatar` = '%s', + `photo` = '%s', `thumb` = '%s', `micro` = '%s', `name-date` = '%s', @@ -90,6 +92,7 @@ function crepair_post(&$a) { `avatar-date` = '%s' WHERE `id` = %d ", + dbesc($photo), dbesc($photos[0]), dbesc($photos[1]), dbesc($photos[2]), diff --git a/mod/dfrn_confirm.php b/mod/dfrn_confirm.php index d5dbab951e..8528ba9ffd 100644 --- a/mod/dfrn_confirm.php +++ b/mod/dfrn_confirm.php @@ -329,6 +329,7 @@ function dfrn_confirm_post(&$a,$handsfree = null) { $duplex = 0; $r = q("UPDATE `contact` SET + `avatar` = '%s', `photo` = '%s', `thumb` = '%s', `micro` = '%s', @@ -342,6 +343,7 @@ function dfrn_confirm_post(&$a,$handsfree = null) { `hidden` = %d, `network` = '%s' WHERE `id` = %d ", + dbesc($contact['photo']), dbesc($photos[0]), dbesc($photos[1]), dbesc($photos[2]), @@ -695,6 +697,7 @@ function dfrn_confirm_post(&$a,$handsfree = null) { $duplex = 0; $r = q("UPDATE `contact` SET + `avatar` = '%s', `photo` = '%s', `thumb` = '%s', `micro` = '%s', @@ -709,6 +712,7 @@ function dfrn_confirm_post(&$a,$handsfree = null) { `prv` = %d, `network` = '%s' WHERE `id` = %d ", + dbesc($photo), dbesc($photos[0]), dbesc($photos[1]), dbesc($photos[2]), diff --git a/mod/item.php b/mod/item.php index 8c5a479646..bf0ead4932 100644 --- a/mod/item.php +++ b/mod/item.php @@ -1146,6 +1146,7 @@ function handle_tag($a, &$body, &$inform, &$str_tags, $profile_uid, $tag, $netwo if (!$r) { $probed = probe_url($name); if (isset($probed["url"])) { + $probed["avatar"] = $probed["photo"]; update_gcontact($probed); $r = q("SELECT `url`, `name`, `nick`, `network`, `alias`, `notify` FROM `gcontact` WHERE `nurl` = '%s' LIMIT 1", dbesc(normalise_link($probed["url"]))); diff --git a/mod/poco.php b/mod/poco.php index 0a1b392169..3927f125ea 100644 --- a/mod/poco.php +++ b/mod/poco.php @@ -179,6 +179,9 @@ function poco_init(&$a) { $rr['generation'] = 2; } + if ($rr["avatar"] == "") + $rr["avatar"] = $rr["photo"]; + if (($rr['about'] == "") AND isset($rr['pabout'])) $rr['about'] = $rr['pabout']; @@ -258,7 +261,7 @@ function poco_init(&$a) { $entry['updated'] = date("c", strtotime($entry['updated'])); } if($fields_ret['photos']) - $entry['photos'] = array(array('value' => $rr['photo'], 'type' => 'profile')); + $entry['photos'] = array(array('value' => $rr['avatar'], 'type' => 'profile')); if($fields_ret['network']) { $entry['network'] = $rr['network']; if ($entry['network'] == NETWORK_STATUSNET) diff --git a/mod/wall_upload.php b/mod/wall_upload.php index 8bf471d3d2..a1dab53779 100644 --- a/mod/wall_upload.php +++ b/mod/wall_upload.php @@ -158,6 +158,7 @@ function wall_upload_post(&$a, $desktopmode = true) { killme(); } + logger("Check size of picture.", LOGGER_DEBUG); $r = q("select sum(octet_length(data)) as total from photo where uid = %d and scale = 0 and album != 'Contact Photos' ", intval($page_owner_uid) ); @@ -176,6 +177,7 @@ function wall_upload_post(&$a, $desktopmode = true) { } + logger("Picture will be processed.", LOGGER_DEBUG); $imagedata = @file_get_contents($src); $ph = new Photo($imagedata, $filetype); @@ -210,6 +212,7 @@ function wall_upload_post(&$a, $desktopmode = true) { $defperm = '<' . $default_cid . '>'; + logger("Picture will be stored", LOGGER_DEBUG); $r = $ph->store($page_owner_uid, $visitor, $hash, $filename, t('Wall Photos'), 0, 0, $defperm); if(! $r) { @@ -266,6 +269,8 @@ function wall_upload_post(&$a, $desktopmode = true) { return $picture; } + logger("Picture is stored.", LOGGER_DEBUG); + if ($r_json) { echo json_encode(array('ok'=>true)); killme();