Skip to content

Commit 8ae164b

Browse files
authored
Fix timeline media bug (#329)
* Fix timeline media bug * Fix timeline media bug
1 parent 7e9e250 commit 8ae164b

6 files changed

Lines changed: 93 additions & 44 deletions

File tree

src/Instagram/Hydrator/CarouselHydrator.php

Lines changed: 31 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66

77
use Instagram\Exception\InstagramFetchException;
88
use Instagram\Hydrator\UserInfoHydrator;
9-
use Instagram\Model\{Media, Carousel};
9+
use Instagram\Model\{Media, Carousel, Image};
1010
use Instagram\Utils\InstagramHelper;
1111

1212
class CarouselHydrator
@@ -76,28 +76,34 @@ public function carouselMediaHydrator(array $carouselItems): array
7676
{
7777
$carouselMedias = [];
7878
foreach ($carouselItems as $carouselItem) {
79-
$carouselType = $this->getTypeCarousel($carouselItem->media_type);
80-
81-
if ($carouselType == Media::TYPE_IMAGE) {
82-
$carouselMedia = [
83-
'id' => $carouselItem->pk,
84-
'parentId' => $carouselItem->carousel_parent_id,
85-
'type' => $carouselType,
86-
'width' => $carouselItem->original_width,
87-
'height' => $carouselItem->original_height,
88-
];
89-
90-
if (property_exists($carouselItem, 'image_versions2')) {
91-
$carouselMedia['image'] = $carouselItem->image_versions2->candidates;
92-
}
93-
94-
if (property_exists($carouselItem, 'video_versions')) {
95-
$carouselMedia['video'] = $carouselItem->video_versions;
96-
}
97-
98-
if (property_exists($carouselItem, 'accessibility_caption')) {
99-
$carouselMedia['accessibilityCaption'] = $carouselItem->accessibility_caption;
100-
}
79+
$carouselType = $this->getCarouselType($carouselItem->media_type);
80+
81+
$carouselMedia = [
82+
'id' => $carouselItem->pk,
83+
'parentId' => $carouselItem->carousel_parent_id,
84+
'type' => $carouselType,
85+
'width' => $carouselItem->original_width,
86+
'height' => $carouselItem->original_height,
87+
];
88+
89+
if (property_exists($carouselItem, 'image_versions2')) {
90+
$carouselMedia['image'] = $carouselItem->image_versions2->candidates;
91+
}
92+
93+
if (property_exists($carouselItem, 'video_versions')) {
94+
$carouselMedia['video'] = $carouselItem->video_versions;
95+
}
96+
97+
if (property_exists($carouselItem, 'video_duration')) {
98+
$carouselMedia['duration'] = $carouselItem->video_duration;
99+
}
100+
101+
if (property_exists($carouselItem, 'accessibility_caption')) {
102+
$carouselMedia['accessibilityCaption'] = $carouselItem->accessibility_caption;
103+
}
104+
105+
if (property_exists($carouselItem, 'number_of_qualities')) {
106+
$carouselMedia['quality'] = $carouselItem->number_of_qualities;
101107
}
102108

103109
$carouselMedias[] = (object) $carouselMedia;
@@ -108,10 +114,11 @@ public function carouselMediaHydrator(array $carouselItems): array
108114

109115
/**
110116
* @param int $media_type
117+
*
111118
* @return string
112119
* @throws InstagramFetchException
113120
*/
114-
private function getTypeCarousel(int $media_type): string
121+
private function getCarouselType(int $media_type): string
115122
{
116123
switch ($media_type) {
117124
case Media::MEDIA_TYPE_IMAGE:

src/Instagram/Hydrator/ImageHydrator.php

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,17 +35,23 @@ public function imageBaseHydrator(\StdClass $node): Image
3535
$image->setDate(\DateTime::createFromFormat('U', (string) $node->taken_at));
3636
$image->setLikes($node->like_count);
3737
$image->setIsLiked($node->has_liked);
38-
$image->setComments($node->comment_count);
38+
3939
$image->setHeight($node->original_height);
4040
$image->setWidth($node->original_width);
4141

4242
$image->setImage(array_map(function ($node) {
4343
return $node;
4444
}, $node->image_versions2->candidates));
4545

46+
if (property_exists($node, 'comment_count')) {
47+
$image->setComments($node->comment_count);
48+
}
49+
4650
if (property_exists($node, 'caption')) {
47-
$image->setCaption($node->caption->text);
48-
$image->setHashtags(InstagramHelper::buildHashtags($node->caption->text));
51+
if (!empty($node->caption)) {
52+
$image->setCaption($node->caption->text);
53+
$image->setHashtags(InstagramHelper::buildHashtags($node->caption->text));
54+
}
4955
}
5056

5157
if (property_exists($node, 'accessibility_caption')) {

src/Instagram/Hydrator/ReelsHydrator.php

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@ public function reelsBaseHydrator(\StdClass $node): Reels
3535
$reels->setDate(\DateTime::createFromFormat('U', (string) $node->taken_at));
3636
$reels->setLikes($node->like_count);
3737
$reels->setIsLiked($node->has_liked);
38-
$reels->setComments($node->comment_count);
3938
$reels->setViews($node->view_count);
4039
$reels->setPlays($node->play_count);
4140
$reels->setDuration($node->video_duration);
@@ -51,6 +50,10 @@ public function reelsBaseHydrator(\StdClass $node): Reels
5150
return $node;
5251
}, $node->video_versions));
5352

53+
if (property_exists($node, 'comment_count')) {
54+
$reels->setComments($node->comment_count);
55+
}
56+
5457
if (property_exists($node, 'caption')) {
5558
if (!empty($node->caption)) {
5659
$reels->setCaption($node->caption->text);

src/Instagram/Hydrator/TimelineFeedHydrator.php

Lines changed: 24 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -48,9 +48,31 @@ public function hydrateTimelineFeed(\StdClass $feed): void
4848
}
4949

5050
foreach ($feed->feed_items as $feedItem) {
51-
$timeline = $this->timelineHydrator->timelineBaseHydrator($feedItem->media_or_ad);
52-
$this->timelineFeed->addTimeline($timeline);
51+
if (property_exists($feedItem, 'media_or_ad')) {
52+
// Timeline Feed
53+
if (!property_exists($feedItem->media_or_ad, 'label')) {
54+
$timeline = $this->timelineHydrator->timelineBaseHydrator($feedItem->media_or_ad);
55+
$this->timelineFeed->addTimeline($timeline);
56+
}
57+
58+
// Sponsored Feed
59+
if (!property_exists($feedItem, 'label')) {
60+
}
61+
}
62+
63+
// Suggested User Feed
64+
if (property_exists($feedItem, 'suggested_users')) {
65+
}
5366
}
67+
68+
// get additionals info
69+
$additionalInfo = [];
70+
$additionalInfo['pullToRefresh'] = $feed->pull_to_refresh_window_ms;
71+
$additionalInfo['preloadDistance'] = $feed->preload_distance;
72+
$additionalInfo['lastHeadLoad'] = \DateTime::createFromFormat('U', (string) $feed->last_head_load_ms);
73+
$additionalInfo['hideLikeAndViewCounts'] = boolval($feed->hide_like_and_view_counts);
74+
$additionalInfo['clientFeedChangelistApplied'] = $feed->client_feed_changelist_applied;
75+
$this->timelineFeed->setAdditionalInfo((object) $additionalInfo);
5476
}
5577

5678
/**

src/Instagram/Model/TimelineFeed.php

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,11 @@ class TimelineFeed
2626
*/
2727
private $newFeedPostExist = false;
2828

29+
/**
30+
* @var \stdClass
31+
*/
32+
private $additionalInfo;
33+
2934
/**
3035
* @return array
3136
*/
@@ -89,4 +94,20 @@ public function setNewFeedPostExist(bool $newFeedPostExist): void
8994
{
9095
$this->newFeedPostExist = $newFeedPostExist;
9196
}
97+
98+
/**
99+
* @return \stdClass
100+
*/
101+
public function getAdditionalInfo(): stdClass
102+
{
103+
return $this->additionalInfo;
104+
}
105+
106+
/**
107+
* @param \stdClass $additionalInfo
108+
*/
109+
public function setAdditionalInfo(\stdClass $additionalInfo): void
110+
{
111+
$this->additionalInfo = $additionalInfo;
112+
}
92113
}

src/Instagram/Transport/TimelineDataFeed.php

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -41,13 +41,8 @@ public function fetchDataNewFeedPostExist(): array
4141
$endpoint = 'https://i.instagram.com/api/v1/feed/new_feed_posts_exist/';
4242

4343
$csrfToken = '';
44-
45-
/** @var SetCookie $cookie */
46-
foreach ($this->session->getCookies() as $cookie) {
47-
if ($cookie->getName() === 'csrftoken') {
48-
$csrfToken = $cookie->getValue();
49-
break;
50-
}
44+
if (!empty($this->session->getCookies()->getCookieByName("csrftoken"))) {
45+
$csrfToken = $this->session->getCookies()->getCookieByName("csrftoken")->getValue();
5146
}
5247

5348
$options = [
@@ -89,13 +84,8 @@ public function fetchDataTimelineFeed(string $maxId = null): array
8984
$endpoint = Endpoints::TIMELINE_URL;
9085

9186
$csrfToken = '';
92-
93-
/** @var SetCookie $cookie */
94-
foreach ($this->session->getCookies() as $cookie) {
95-
if ($cookie->getName() === 'csrftoken') {
96-
$csrfToken = $cookie->getValue();
97-
break;
98-
}
87+
if (!empty($this->session->getCookies()->getCookieByName("csrftoken"))) {
88+
$csrfToken = $this->session->getCookies()->getCookieByName("csrftoken")->getValue();
9989
}
10090

10191
$options = [

0 commit comments

Comments
 (0)