22 changed files with 0 additions and 5970 deletions
@ -1,29 +0,0 @@
|
||||
FROM node:14.2-alpine |
||||
MAINTAINER Jørgen Sverre Lien Sellæg <jorgen@guut.org> |
||||
|
||||
ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true \ |
||||
PUPPETEER_EXECUTABLE_PATH=/usr/bin/chromium-browser \ |
||||
PATH="$PATH:/app/bin" |
||||
|
||||
RUN apk add --no-cache \ |
||||
chromium \ |
||||
bash \ |
||||
nss \ |
||||
freetype \ |
||||
freetype-dev \ |
||||
harfbuzz \ |
||||
ca-certificates \ |
||||
ttf-freefont \ |
||||
&& mkdir /app \ |
||||
&& chown node:node /app |
||||
|
||||
WORKDIR "/app" |
||||
|
||||
USER node |
||||
|
||||
COPY . /app |
||||
|
||||
RUN yarn |
||||
|
||||
CMD ["scrape"] |
||||
|
||||
@ -1,21 +0,0 @@
|
||||
MIT License |
||||
|
||||
Copyright (c) 2020 Jørgen Lien Sellæg |
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy |
||||
of this software and associated documentation files (the "Software"), to deal |
||||
in the Software without restriction, including without limitation the rights |
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell |
||||
copies of the Software, and to permit persons to whom the Software is |
||||
furnished to do so, subject to the following conditions: |
||||
|
||||
The above copyright notice and this permission notice shall be included in all |
||||
copies or substantial portions of the Software. |
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE |
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, |
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE |
||||
SOFTWARE. |
||||
@ -1,43 +0,0 @@
|
||||
# Facebook page events scraper |
||||
|
||||
Now you can get JSON representation of all events hosted by a Facebook page. |
||||
|
||||
## Disclaimer |
||||
|
||||
Please note that terms and conditions apply from Facebook and this script should |
||||
only be used if written consent is provided by Facebook. |
||||
|
||||
## Dependencies |
||||
|
||||
```txt |
||||
bash |
||||
node >= v10 |
||||
yarn |
||||
google-chrome / chromium |
||||
``` |
||||
|
||||
NOTE: You might want to set environment variables to use an existing chrome |
||||
install. (Voluntary) |
||||
|
||||
```sh |
||||
export PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true |
||||
export PUPPETEER_EXECUTABLE_PATH=/bin/google-chrome |
||||
``` |
||||
|
||||
## Usage |
||||
|
||||
```sh |
||||
./bin/scrape PlanetRammstein |
||||
./bin/scrape --skip-upcoming-events --past-events PlanetRammstein |
||||
``` |
||||
|
||||
### Usage with docker |
||||
|
||||
```sh |
||||
docker build --tag facebook-page-events-scraper . |
||||
docker run \ |
||||
--rm \ |
||||
--cap-add SYS_ADMIN \ |
||||
facebook-page-events-scraper \ |
||||
scrape PlanetRammstein |
||||
``` |
||||
@ -1,12 +0,0 @@
|
||||
module.exports = { |
||||
presets: [ |
||||
[ |
||||
'@babel/preset-env', |
||||
{ |
||||
targets: { |
||||
node: 'current', |
||||
}, |
||||
}, |
||||
], |
||||
], |
||||
}; |
||||
@ -1,18 +0,0 @@
|
||||
#!/usr/bin/env bash |
||||
|
||||
PATH="$PATH:$HOME/src/garbit/lib/facebook-event-scraper/bin" |
||||
|
||||
if [ "$1" == "" ]; then |
||||
echo "This script takes in a path to a JSON file containing an Array."; |
||||
exit 0; |
||||
fi |
||||
|
||||
cat $1 \ |
||||
| get-hosts-from-event-nodes \ |
||||
| flatten-array \ |
||||
| get-pages-from-hosts \ |
||||
| unique-by-id \ |
||||
| remove-profile-picture \ |
||||
| remove-pageID \ |
||||
| remove-typename |
||||
|
||||
@ -1,28 +0,0 @@
|
||||
#!/usr/bin/env node |
||||
const pathOr = require('ramda/src/pathOr'); |
||||
let input = []; |
||||
|
||||
// YOLO |
||||
let ids = eval(process.argv.slice(2).pop()).map((id) => `${id}`); |
||||
|
||||
process.stdin.resume(); |
||||
process.stdin.setEncoding('utf8'); |
||||
|
||||
process.stdin.on('data', (data) => { |
||||
input.push(data); |
||||
}); |
||||
|
||||
process.stdin.on('end', () => { |
||||
const str = input.join(''); |
||||
const arr = JSON.parse(str); |
||||
|
||||
const output = arr.reduce((acc, elem) => { |
||||
if (ids.includes(elem.id)) { |
||||
return acc; |
||||
} else { |
||||
return [...acc, elem]; |
||||
} |
||||
}, []); |
||||
|
||||
console.log(JSON.stringify(output)); |
||||
}); |
||||
@ -1,21 +0,0 @@
|
||||
#!/usr/bin/env node |
||||
|
||||
const flatten = require('ramda/src/flatten'); |
||||
|
||||
let input = []; |
||||
|
||||
process.stdin.resume(); |
||||
process.stdin.setEncoding('utf8'); |
||||
|
||||
process.stdin.on('data', (data) => { |
||||
input.push(data); |
||||
}); |
||||
|
||||
process.stdin.on('end', () => { |
||||
const str = input.join(''); |
||||
let events = JSON.parse(str); |
||||
|
||||
events = flatten(events); |
||||
|
||||
console.log(JSON.stringify(events)); |
||||
}); |
||||
@ -1,18 +0,0 @@
|
||||
#!/usr/bin/env node |
||||
let input = []; |
||||
|
||||
process.stdin.resume(); |
||||
process.stdin.setEncoding('utf8'); |
||||
|
||||
process.stdin.on('data', (data) => { |
||||
input.push(data); |
||||
}); |
||||
|
||||
process.stdin.on('end', () => { |
||||
const str = input.join(''); |
||||
const pages = JSON.parse(str); |
||||
|
||||
pages.forEach(({ id }, index) => { |
||||
console.log(`pages[${index}]="${id}"`); |
||||
}); |
||||
}); |
||||
@ -1,25 +0,0 @@
|
||||
#!/usr/bin/env node |
||||
|
||||
const pathOr = require('ramda/src/pathOr'); |
||||
|
||||
let input = []; |
||||
|
||||
process.stdin.resume(); |
||||
process.stdin.setEncoding('utf8'); |
||||
|
||||
process.stdin.on('data', (data) => { |
||||
input.push(data); |
||||
}); |
||||
|
||||
process.stdin.on('end', () => { |
||||
const str = input.join(''); |
||||
|
||||
const events = JSON.parse(str); |
||||
|
||||
const s = events.reduce((acc, event) => { |
||||
const pages = pathOr([], ['hosts', 'edges'], event); |
||||
return [...acc, pages]; |
||||
}, []); |
||||
|
||||
console.log(JSON.stringify(s)); |
||||
}); |
||||
@ -1,24 +0,0 @@
|
||||
#!/usr/bin/env node |
||||
|
||||
const pathOr = require('ramda/src/pathOr'); |
||||
|
||||
let input = []; |
||||
|
||||
process.stdin.resume(); |
||||
process.stdin.setEncoding('utf8'); |
||||
|
||||
process.stdin.on('data', (data) => { |
||||
input.push(data); |
||||
}); |
||||
|
||||
process.stdin.on('end', () => { |
||||
const str = input.join(''); |
||||
|
||||
const events = JSON.parse(str); |
||||
|
||||
const pages = events |
||||
.map(({ node }) => node) |
||||
.filter(({ __typename }) => __typename == 'Page'); |
||||
|
||||
console.log(JSON.stringify(pages)); |
||||
}); |
||||
@ -1,7 +0,0 @@
|
||||
#!/usr/bin/env bash |
||||
|
||||
PATH="$PATH:$HOME/src/garbit/lib/facebook-event-scraper/bin" |
||||
|
||||
extract-unique-pages-from-event-nodes "$1" \ |
||||
| filter-by-ids \ |
||||
"[119117068112852,170097818488]" |
||||
@ -1,18 +0,0 @@
|
||||
#!/usr/bin/env node |
||||
let input = []; |
||||
|
||||
process.stdin.resume(); |
||||
process.stdin.setEncoding('utf8'); |
||||
|
||||
process.stdin.on('data', (data) => { |
||||
input.push(data); |
||||
}); |
||||
|
||||
process.stdin.on('end', () => { |
||||
const str = input.join(''); |
||||
const events = JSON.parse(str); |
||||
|
||||
let uniquePages = []; |
||||
|
||||
console.log(JSON.stringify(events.map(({ pageID, ...event }) => event))); |
||||
}); |
||||
@ -1,15 +0,0 @@
|
||||
#!/usr/bin/env node |
||||
let input = []; |
||||
|
||||
process.stdin.resume(); |
||||
process.stdin.setEncoding('utf8'); |
||||
process.stdin.on('data', (data) => input.push(data)); |
||||
|
||||
process.stdin.on('end', () => { |
||||
const str = input.join(''); |
||||
const events = JSON.parse(str); |
||||
|
||||
console.log( |
||||
JSON.stringify(events.map(({ profilePicture, ...event }) => event)), |
||||
); |
||||
}); |
||||
@ -1,21 +0,0 @@
|
||||
#!/usr/bin/env node |
||||
|
||||
const pathOr = require('ramda/src/pathOr'); |
||||
|
||||
let input = []; |
||||
|
||||
process.stdin.resume(); |
||||
process.stdin.setEncoding('utf8'); |
||||
|
||||
process.stdin.on('data', (data) => { |
||||
input.push(data); |
||||
}); |
||||
|
||||
process.stdin.on('end', () => { |
||||
const str = input.join(''); |
||||
const events = JSON.parse(str); |
||||
|
||||
let uniquePages = []; |
||||
|
||||
console.log(JSON.stringify(events.map(({ __typename, ...event }) => event))); |
||||
}); |
||||
@ -1,89 +0,0 @@
|
||||
#!/bin/bash |
||||
|
||||
readonly BIN_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )" |
||||
readonly RUN_DIR=$(pwd) |
||||
|
||||
function usage { |
||||
cat <<- EOF |
||||
./scrape [options] <page> |
||||
|
||||
Scrape facebook event pages. |
||||
|
||||
page Facebook page id. Scrape all events of a |
||||
specific facebook page. |
||||
OPTIONS: |
||||
-h --help -? print usage |
||||
--events File in JSON format that contains an array |
||||
of prevously parsed events. |
||||
-o --output Output events into this path instead of |
||||
stdout. |
||||
--skip-upcoming-events Default: The scraper will automatically |
||||
scrape upcoming events, with this option |
||||
enabled they will be skipped. |
||||
--past-events (experimental) Default: The scraper will not scrape past |
||||
events by default. Enabling this option |
||||
makes the scraper include past events. |
||||
Please note that this might take a while |
||||
depending on the number of past events. |
||||
--no-headless The scraper will not run in headless mode. |
||||
|
||||
NOTE: |
||||
Events and pages needs to be public. Private events or pages are not yet |
||||
supported. |
||||
|
||||
EXAMPLES: |
||||
# Select files with options |
||||
./scrape -o events.json --events=events.json livesentralen |
||||
|
||||
# You can redirect standard output into a file |
||||
./scrape tyventrondheim > events.json |
||||
EOF |
||||
} |
||||
|
||||
function parse_args { |
||||
if [ "$1" = "" ]; then |
||||
usage |
||||
exit 0 |
||||
fi |
||||
} |
||||
|
||||
function install_node_dependencies { |
||||
if ! [ -d node_modules ]; then |
||||
yarn |
||||
fi |
||||
} |
||||
|
||||
function check_dependencies { |
||||
local missing; |
||||
missing=false; |
||||
|
||||
if [ ! $(command -v node) ]; then |
||||
echo "Dependency missing. Please install node.js and make it available to the path as 'node'." |
||||
missing=true |
||||
fi |
||||
|
||||
if [ ! $(command -v yarn) ]; then |
||||
echo "Dependency missing. Please install yarn and make it available to the path as 'yarn'." |
||||
missing=true |
||||
fi |
||||
|
||||
install_node_dependencies |
||||
|
||||
if [ "${missing}" != "false" ]; then |
||||
exit 1; |
||||
fi |
||||
|
||||
return 0; |
||||
} |
||||
|
||||
function scrape { |
||||
node src/scrape.js "$@" || usage |
||||
} |
||||
|
||||
cd "$BIN_DIR"/.. |
||||
|
||||
check_dependencies \ |
||||
&& parse_args "$@" \ |
||||
&& scrape "$@" |
||||
|
||||
cd "$RUN_DIR" |
||||
@ -1,14 +0,0 @@
|
||||
#!/usr/bin/env node |
||||
let input = []; |
||||
|
||||
process.stdin.resume(); |
||||
process.stdin.setEncoding('utf8'); |
||||
process.stdin.on('data', (data) => input.push(data)); |
||||
process.stdin.on('end', () => { |
||||
const str = input.join(''); |
||||
const events = JSON.parse(str); |
||||
|
||||
console.log( |
||||
JSON.stringify(events.map(({ profilePicture, ...event }) => event)), |
||||
); |
||||
}); |
||||
@ -1,27 +0,0 @@
|
||||
#!/usr/bin/env node |
||||
|
||||
const pathOr = require('ramda/src/pathOr'); |
||||
|
||||
let input = []; |
||||
|
||||
process.stdin.resume(); |
||||
process.stdin.setEncoding('utf8'); |
||||
|
||||
process.stdin.on('data', (data) => { |
||||
input.push(data); |
||||
}); |
||||
|
||||
process.stdin.on('end', () => { |
||||
const str = input.join(''); |
||||
const events = JSON.parse(str); |
||||
|
||||
let uniquePages = []; |
||||
|
||||
events.forEach((page) => { |
||||
if (uniquePages.findIndex(({ id = null }) => id === page.id) === -1) { |
||||
uniquePages.push(page); |
||||
} |
||||
}); |
||||
|
||||
console.log(JSON.stringify(uniquePages)); |
||||
}); |
||||
@ -1,773 +0,0 @@
|
||||
[ |
||||
{ |
||||
"id": "348882696889506", |
||||
"name": "Orions Belte — Lokal Klubb", |
||||
"url": "https://www.facebook.com/events/348882696889506/", |
||||
"event_creator": { |
||||
"__typename": "Page", |
||||
"id": "191245541651071", |
||||
"pay_to_access_onboarding_info": { |
||||
"creator": { |
||||
"has_active_claimed_ad_coupon": null, |
||||
"pending_ad_coupon_content": null, |
||||
"id": "191245541651071_pay_to_access_creator" |
||||
}, |
||||
"id": "UE9FQ3JlYXRvck9uYm9hcmRpbmdJbmZvOjE5MTI0NTU0MTY1MTA3MQ==" |
||||
} |
||||
}, |
||||
"day_time_sentence": "FRI, AUG 13 AT 11:00 AM UNK", |
||||
"is_canceled": false, |
||||
"created_for_group": null, |
||||
"available_actors": null, |
||||
"rsvp_button_renderer": { |
||||
"__typename": "PublicRsvpStyleRenderer", |
||||
"event": { |
||||
"id": "348882696889506", |
||||
"connection_style": "INTERESTED", |
||||
"can_viewer_join": false, |
||||
"can_viewer_watch": false, |
||||
"can_viewer_unwatch": false, |
||||
"viewer_watch_status": "UNWATCHED", |
||||
"event_connection_data_privacy_scope": null, |
||||
"privacy_scope_for_toast": null |
||||
}, |
||||
"__module_operation_EventCometUniversalRSVPButton_event": { |
||||
"__dr": "PublicEventCometRSVPButtonRenderer_rsvpStyleRenderer$normalization.graphql" |
||||
}, |
||||
"__module_component_EventCometUniversalRSVPButton_event": { |
||||
"__dr": "PublicEventCometRSVPButtonRenderer.react" |
||||
} |
||||
}, |
||||
"rsvp_button_group_renderer": { |
||||
"__typename": "PublicRsvpStyleRenderer", |
||||
"event": { |
||||
"id": "348882696889506", |
||||
"connection_style": "INTERESTED", |
||||
"can_viewer_join": false, |
||||
"can_viewer_watch": false, |
||||
"viewer_watch_status": "UNWATCHED", |
||||
"is_past": false |
||||
}, |
||||
"__module_operation_EventCometUniversalRSVPButtonGroup_event": { |
||||
"__dr": "PublicEventCometRSVPButtonGroupRenderer_rsvpStyleRenderer$normalization.graphql" |
||||
}, |
||||
"__module_component_EventCometUniversalRSVPButtonGroup_event": { |
||||
"__dr": "PublicEventCometRSVPButtonGroupRenderer.react" |
||||
} |
||||
}, |
||||
"privacy_scope_for_toast": null, |
||||
"rsvp_style": "PUBLIC_RSVP_STYLE", |
||||
"viewer_guest_status": null, |
||||
"viewer_watch_status": "UNWATCHED", |
||||
"event_kind": "PUBLIC_TYPE", |
||||
"can_viewer_invite": false, |
||||
"can_page_viewer_invite_as_user": false, |
||||
"eventUrl": "https://www.facebook.com/events/348882696889506/", |
||||
"can_boost_event_renderer": null, |
||||
"can_viewer_see_rsvp_button": false, |
||||
"can_viewer_share": false, |
||||
"can_viewer_create_repeat_event": false, |
||||
"header_action_menu_items": [], |
||||
"is_viewer_admin": false, |
||||
"if_viewer_can_publish_draft_event": null, |
||||
"online_event_setup": null, |
||||
"paid_online_event_context": null, |
||||
"parent_if_exists_or_self": { "id": "348882696889506" }, |
||||
"event_for_edit_flow": { |
||||
"if_viewer_can_edit": null, |
||||
"id": "348882696889506" |
||||
}, |
||||
"is_eligible_for_poe_view_as_visitor_button": false, |
||||
"discovery_categories": [{ "glyph_token": "music" }], |
||||
"event_connected_users": { "count": 0, "edges": [] }, |
||||
"social_context": { "text": "33 people interested" }, |
||||
"__typename": "Event", |
||||
"ticketUrl": "http://www.tikkio.com/lokalbar", |
||||
"hosts": { |
||||
"edges": [ |
||||
{ |
||||
"node": { |
||||
"__typename": "Page", |
||||
"name": "Polar Artist", |
||||
"pageID": "121444301228925", |
||||
"about": { |
||||
"text": "International music management and live booking agency", |
||||
"ranges": [] |
||||
}, |
||||
"category": "Künstlervermittlung", |
||||
"city": null, |
||||
"profilePicture": { |
||||
"uri": "https://scontent-vie1-1.xx.fbcdn.net/v/t1.18169-1/p100x100/13226716_1192511330788878_2675807659535641780_n.png?_nc_cat=108&ccb=1-3&_nc_sid=1eb0c7&_nc_ohc=hekFCEl8ChsAX_1TFQ7&_nc_ht=scontent-vie1-1.xx&oh=5a1621b48159069d414ba2ee32f438df&oe=612BC18F" |
||||
}, |
||||
"url": "https://www.facebook.com/polarartist/", |
||||
"id": "121444301228925" |
||||
} |
||||
}, |
||||
{ |
||||
"node": { |
||||
"__typename": "Page", |
||||
"name": "Lokal Bar - Scene - Klubb", |
||||
"pageID": "191245541651071", |
||||
"about": { "text": "——— FRIROMMET I DIN BY ———", "ranges": [] }, |
||||
"category": "Bar", |
||||
"city": { "name": "Trondheim", "id": "110429825645017" }, |
||||
"profilePicture": { |
||||
"uri": "https://scontent-vie1-1.xx.fbcdn.net/v/t1.6435-1/p100x100/68638643_486313585477597_4139052235034198016_n.png?_nc_cat=106&ccb=1-3&_nc_sid=1eb0c7&_nc_ohc=yIL4_Rogc4cAX9j8Fwb&_nc_ht=scontent-vie1-1.xx&oh=f5e126836f7592dee1b6441ce38b58ab&oe=61293641" |
||||
}, |
||||
"url": "https://www.facebook.com/lokal.trhm/", |
||||
"id": "191245541651071" |
||||
} |
||||
} |
||||
] |
||||
}, |
||||
"place": { |
||||
"__typename": "Page", |
||||
"name": "Lokal Bar - Scene - Klubb", |
||||
"pageID": "191245541651071", |
||||
"about": { "text": "——— FRIROMMET I DIN BY ———", "ranges": [] }, |
||||
"category": "Bar", |
||||
"city": { "name": "Trondheim", "id": "110429825645017" }, |
||||
"profilePicture": { |
||||
"uri": "https://scontent-vie1-1.xx.fbcdn.net/v/t1.6435-1/p100x100/68638643_486313585477597_4139052235034198016_n.png?_nc_cat=106&ccb=1-3&_nc_sid=1eb0c7&_nc_ohc=yIL4_Rogc4cAX9j8Fwb&_nc_ht=scontent-vie1-1.xx&oh=f5e126836f7592dee1b6441ce38b58ab&oe=61293641" |
||||
}, |
||||
"url": "https://www.facebook.com/lokal.trhm/", |
||||
"id": "191245541651071" |
||||
}, |
||||
"is_arena_event": false, |
||||
"unified_tournament": null, |
||||
"arenas": { "nodes": [] }, |
||||
"remote_learning_class": null, |
||||
"fundraiser_charity": null, |
||||
"tz_display_name": "UTC+02", |
||||
"viewer_in_event_tz": false, |
||||
"start_timestamp": 1628877600, |
||||
"end_timestamp": 1628888400, |
||||
"linked_group_card": null, |
||||
"event_linked_group_link_action_data": { |
||||
"linkable_groups": { "is_empty": null } |
||||
}, |
||||
"live_virtual_event_info": null, |
||||
"liveVideos": null, |
||||
"event_to_event_tours": { "nodes": [] }, |
||||
"aboutTabTools": null, |
||||
"paidAccessTabTools": null, |
||||
"event_description": { |
||||
"text": "— dørene åpner 20:00\n— konsertstart 21:00\n— id 20\n\n🎫 billetter i salg fra mandag 12. august\n😷 lokal.bar/smittevern \n\n——\n\nDet var duket for slippturné rundt \"Villa Amorini\" tidligere i år, men dessverre spøkte det for konserten i Trondheim pga smitteoppblussing. Nå har vi ny dato klar på den andre siden av sommeren, og Orions Belte har i tillegg gitt ut den fantastiske live-skiva \"The Scenic Route!\"\n\n——\n\nHusker du den gangen dørvakta løp etter de fulle ungdommene langs kaia? Når han stuper etter dem uti vannet skraper han seg opp på magen, men han tar dem igjen til slutt og returnerer til klubben med en våt villstyring under hver arm. Samtidig fortsetter bandet å spille inne på klubben, og vokalisten står på galleriet og håper at lysekrona holder i det han hopper mot den. Det gjør den ikke. Husker du nachspielene som aldri tok slutt, og den evige kampen om å unngå besøk av politiet og skjenkekontrollen? Nei? Ingenting?\nDette var klubbscenen på nittitallet i Bergen, og Villa Amorini var stedet der alt skjedde.\n\n——" |
||||
}, |
||||
"share_url": "https://facebook.com/events/s/orions-belte-lokal-klubb/348882696889506/", |
||||
"is_eligible_for_poe_visit_dashboard_card": false, |
||||
"event_if_remote_learning_course_classes": null, |
||||
"associated_videos": null, |
||||
"is_online": false, |
||||
"has_learning_space_thread": false, |
||||
"has_messenger_room": false, |
||||
"has_fb_live": false, |
||||
"has_third_party": false, |
||||
"faq_items": { "nodes": [] }, |
||||
"can_viewer_see_nit_card": false, |
||||
"nit_card_title": null, |
||||
"nit_card_body": null, |
||||
"nit_card_button_text": null, |
||||
"nit_card_uri": null, |
||||
"event_lineups": { |
||||
"edges": [], |
||||
"page_info": { "end_cursor": null, "has_next_page": false } |
||||
}, |
||||
"event_notable_sources": { "count": 0, "nodes": [] }, |
||||
"suggested_event_cuts_of_event": { |
||||
"nodes": [ |
||||
{ |
||||
"cut_type": "FRIENDS_EVENTS", |
||||
"displayed_text": "Populair bij vrienden", |
||||
"events": { "count": 0, "nodes": [] } |
||||
} |
||||
] |
||||
}, |
||||
"can_viewer_message": false, |
||||
"ticket_settings": { "nodes": [] }, |
||||
"event_hosts_that_can_view_guestlist": [ |
||||
{ |
||||
"__typename": "Page", |
||||
"id": "191245541651071", |
||||
"viewer": { "actor": { "__typename": "LoggedOutUser", "id": "0" } }, |
||||
"url": "https://www.facebook.com/lokal.trhm/", |
||||
"name": "Lokal Bar - Scene - Klubb", |
||||
"past_event_count": { "count": 405 }, |
||||
"page_about_fields": { "blurb": "——— FRIROMMET I DIN BY ———" }, |
||||
"page_likers": { "global_likers_count": 3670 }, |
||||
"profile_uri": { |
||||
"uri": "https://scontent-amt2-1.xx.fbcdn.net/v/t1.6435-1/p200x200/68638643_486313585477597_4139052235034198016_n.png?_nc_cat=106&ccb=1-3&_nc_sid=1eb0c7&_nc_ohc=yIL4_Rogc4cAX8Xtuqr&_nc_ht=scontent-amt2-1.xx&oh=a0f6b1025b961c07084cb88196193892&oe=612B1A30" |
||||
}, |
||||
"cover_url": { |
||||
"photo": { |
||||
"image": { |
||||
"uri": "https://scontent-amt2-1.xx.fbcdn.net/v/t31.18172-8/s960x960/30425394_210293716412920_4586078545182596007_o.png?_nc_cat=109&ccb=1-3&_nc_sid=e3f864&_nc_ohc=eY6iGKrBrx4AX-Ja9PW&_nc_oc=AQnLkP6ysKuxZ1ilhjCb59LwXq0oZvA1JUvCqMfueuet7tIVi35Qg8GgeD_dgog_yqA&_nc_ht=scontent-amt2-1.xx&oh=1076b4497c15a5777d68ab303f6f3bd4&oe=612AEEF1" |
||||
}, |
||||
"id": "210293716412920" |
||||
} |
||||
}, |
||||
"is_viewer_fan": false, |
||||
"can_viewer_like": false, |
||||
"should_show_page_like_warning": false |
||||
}, |
||||
{ |
||||
"__typename": "Page", |
||||
"id": "121444301228925", |
||||
"viewer": { "actor": { "__typename": "LoggedOutUser", "id": "0" } }, |
||||
"url": "https://www.facebook.com/polarartist/", |
||||
"name": "Polar Artist", |
||||
"past_event_count": { "count": 560 }, |
||||
"page_about_fields": { |
||||
"blurb": "International music management and live booking agency" |
||||
}, |
||||
"page_likers": { "global_likers_count": 2778 }, |
||||
"profile_uri": { |
||||
"uri": "https://scontent-ams4-1.xx.fbcdn.net/v/t1.18169-1/p200x200/13226716_1192511330788878_2675807659535641780_n.png?_nc_cat=108&ccb=1-3&_nc_sid=1eb0c7&_nc_ohc=hekFCEl8ChsAX9ZTm2M&_nc_ht=scontent-ams4-1.xx&oh=dd5f134c856f0a48d5a7fd494fd489b2&oe=6128F92E" |
||||
}, |
||||
"cover_url": { |
||||
"photo": { |
||||
"image": { |
||||
"uri": "https://scontent-ams4-1.xx.fbcdn.net/v/t1.6435-9/s960x960/170848750_5706897106016922_6014426456866089959_n.jpg?_nc_cat=108&ccb=1-3&_nc_sid=e3f864&_nc_ohc=P3Gc1aa6buIAX9ojrI8&_nc_oc=AQnMaCiqlBMbOUzmrOGtylpCTmegia6A-_otZtuiAr0h3zXfuYOTQyRZSbx2EHtUwyg&_nc_ht=scontent-ams4-1.xx&oh=a29b89a03f3f0eedc5e3fa9ec15889a5&oe=612A8003" |
||||
}, |
||||
"id": "5706897096016923" |
||||
} |
||||
}, |
||||
"is_viewer_fan": false, |
||||
"can_viewer_like": false, |
||||
"should_show_page_like_warning": false |
||||
} |
||||
], |
||||
"can_viewer_see_transparency_card": true, |
||||
"transparency": { |
||||
"name_change_history_info": { "has_name_changed": false }, |
||||
"date_change_history_info": { "has_date_changed": false } |
||||
} |
||||
}, |
||||
{ |
||||
"id": "405702597560924", |
||||
"name": "Linni — Lokal Klubb", |
||||
"url": "https://www.facebook.com/events/405702597560924/", |
||||
"event_creator": { |
||||
"__typename": "Page", |
||||
"id": "191245541651071", |
||||
"pay_to_access_onboarding_info": { |
||||
"creator": { |
||||
"has_active_claimed_ad_coupon": null, |
||||
"pending_ad_coupon_content": null, |
||||
"id": "191245541651071_pay_to_access_creator" |
||||
}, |
||||
"id": "UE9FQ3JlYXRvck9uYm9hcmRpbmdJbmZvOjE5MTI0NTU0MTY1MTA3MQ==" |
||||
} |
||||
}, |
||||
"day_time_sentence": "SAT, AUG 28 AT 10:30 AM UNK", |
||||
"is_canceled": false, |
||||
"created_for_group": null, |
||||
"available_actors": null, |
||||
"rsvp_button_renderer": { |
||||
"__typename": "PublicRsvpStyleRenderer", |
||||
"event": { |
||||
"id": "405702597560924", |
||||
"connection_style": "INTERESTED", |
||||
"can_viewer_join": false, |
||||
"can_viewer_watch": false, |
||||
"can_viewer_unwatch": false, |
||||
"viewer_watch_status": "UNWATCHED", |
||||
"event_connection_data_privacy_scope": null, |
||||
"privacy_scope_for_toast": null |
||||
}, |
||||
"__module_operation_EventCometUniversalRSVPButton_event": { |
||||
"__dr": "PublicEventCometRSVPButtonRenderer_rsvpStyleRenderer$normalization.graphql" |
||||
}, |
||||
"__module_component_EventCometUniversalRSVPButton_event": { |
||||
"__dr": "PublicEventCometRSVPButtonRenderer.react" |
||||
} |
||||
}, |
||||
"rsvp_button_group_renderer": { |
||||
"__typename": "PublicRsvpStyleRenderer", |
||||
"event": { |
||||
"id": "405702597560924", |
||||
"connection_style": "INTERESTED", |
||||
"can_viewer_join": false, |
||||
"can_viewer_watch": false, |
||||
"viewer_watch_status": "UNWATCHED", |
||||
"is_past": false |
||||
}, |
||||
"__module_operation_EventCometUniversalRSVPButtonGroup_event": { |
||||
"__dr": "PublicEventCometRSVPButtonGroupRenderer_rsvpStyleRenderer$normalization.graphql" |
||||
}, |
||||
"__module_component_EventCometUniversalRSVPButtonGroup_event": { |
||||
"__dr": "PublicEventCometRSVPButtonGroupRenderer.react" |
||||
} |
||||
}, |
||||
"privacy_scope_for_toast": null, |
||||
"rsvp_style": "PUBLIC_RSVP_STYLE", |
||||
"viewer_guest_status": null, |
||||
"viewer_watch_status": "UNWATCHED", |
||||
"event_kind": "PUBLIC_TYPE", |
||||
"can_viewer_invite": false, |
||||
"can_page_viewer_invite_as_user": false, |
||||
"eventUrl": "https://www.facebook.com/events/405702597560924/", |
||||
"can_boost_event_renderer": null, |
||||
"can_viewer_see_rsvp_button": false, |
||||
"can_viewer_share": false, |
||||
"can_viewer_create_repeat_event": false, |
||||
"header_action_menu_items": [], |
||||
"is_viewer_admin": false, |
||||
"if_viewer_can_publish_draft_event": null, |
||||
"online_event_setup": null, |
||||
"paid_online_event_context": null, |
||||
"parent_if_exists_or_self": { "id": "405702597560924" }, |
||||
"event_for_edit_flow": { |
||||
"if_viewer_can_edit": null, |
||||
"id": "405702597560924" |
||||
}, |
||||
"is_eligible_for_poe_view_as_visitor_button": false, |
||||
"discovery_categories": [], |
||||
"event_connected_users": { "count": 0, "edges": [] }, |
||||
"social_context": { "text": "Music · 144 people" }, |
||||
"__typename": "Event", |
||||
"ticketUrl": "http://www.tikkio.com/lokalbar", |
||||
"hosts": { |
||||
"edges": [ |
||||
{ |
||||
"node": { |
||||
"__typename": "Page", |
||||
"name": "Linje2", |
||||
"pageID": "1022549294549528", |
||||
"about": { "text": "", "ranges": [] }, |
||||
"category": "Concert Tour", |
||||
"city": null, |
||||
"profilePicture": { |
||||
"uri": "https://scontent.frix7-1.fna.fbcdn.net/v/t1.18169-1/p100x100/27657023_1037770509694073_6986473411550183445_n.jpg?_nc_cat=104&ccb=1-3&_nc_sid=1eb0c7&_nc_ohc=NVayHfJoB0QAX9Sb2F2&_nc_ht=scontent.frix7-1.fna&oh=430f746f19f54a1e4f016ee82e9fcd81&oe=612933BB" |
||||
}, |
||||
"url": "https://www.facebook.com/linje2booking/", |
||||
"id": "1022549294549528" |
||||
} |
||||
}, |
||||
{ |
||||
"node": { |
||||
"__typename": "Page", |
||||
"name": "Linni", |
||||
"pageID": "801499590006231", |
||||
"about": { |
||||
"text": "Levemann i lekeland, rapper, danser, elsker, flammegutt, neonsurfer & eventyrer. Sjekk ut albumene Minimum & Maksimum mens du venter på Medium.", |
||||
"ranges": [] |
||||
}, |
||||
"category": "Artist", |
||||
"city": null, |
||||
"profilePicture": { |
||||
"uri": "https://scontent.frix7-1.fna.fbcdn.net/v/t1.6435-1/p100x100/187990303_2015135801975931_8549619315634067253_n.jpg?_nc_cat=111&ccb=1-3&_nc_sid=1eb0c7&_nc_ohc=snsN8dQm8vsAX9QzJ_B&_nc_ht=scontent.frix7-1.fna&oh=093b4d791ff2e7d91d7bdf493ba0a9bb&oe=612B9710" |
||||
}, |
||||
"url": "https://www.facebook.com/ygmglinni/", |
||||
"id": "801499590006231" |
||||
} |
||||
}, |
||||
{ |
||||
"node": { |
||||
"__typename": "Page", |
||||
"name": "Lokal Bar - Scene - Klubb", |
||||
"pageID": "191245541651071", |
||||
"about": { "text": "——— FRIROMMET I DIN BY ———", "ranges": [] }, |
||||
"category": "Bar", |
||||
"city": { "name": "Trondheim, Norway", "id": "110429825645017" }, |
||||
"profilePicture": { |
||||
"uri": "https://scontent.frix7-1.fna.fbcdn.net/v/t1.6435-1/p100x100/68638643_486313585477597_4139052235034198016_n.png?_nc_cat=106&ccb=1-3&_nc_sid=1eb0c7&_nc_ohc=yIL4_Rogc4cAX-LWpHb&_nc_ht=scontent.frix7-1.fna&oh=273b8e61292048bb416b9eb814a5875b&oe=61293641" |
||||
}, |
||||
"url": "https://www.facebook.com/lokal.trhm/", |
||||
"id": "191245541651071" |
||||
} |
||||
} |
||||
] |
||||
}, |
||||
"place": { |
||||
"__typename": "Page", |
||||
"name": "Lokal Bar - Scene - Klubb", |
||||
"pageID": "191245541651071", |
||||
"about": { "text": "——— FRIROMMET I DIN BY ———", "ranges": [] }, |
||||
"category": "Bar", |
||||
"city": { "name": "Trondheim, Norway", "id": "110429825645017" }, |
||||
"profilePicture": { |
||||
"uri": "https://scontent.frix7-1.fna.fbcdn.net/v/t1.6435-1/p100x100/68638643_486313585477597_4139052235034198016_n.png?_nc_cat=106&ccb=1-3&_nc_sid=1eb0c7&_nc_ohc=yIL4_Rogc4cAX-LWpHb&_nc_ht=scontent.frix7-1.fna&oh=273b8e61292048bb416b9eb814a5875b&oe=61293641" |
||||
}, |
||||
"url": "https://www.facebook.com/lokal.trhm/", |
||||
"id": "191245541651071" |
||||
}, |
||||
"is_arena_event": false, |
||||
"unified_tournament": null, |
||||
"arenas": { "nodes": [] }, |
||||
"remote_learning_class": null, |
||||
"fundraiser_charity": null, |
||||
"tz_display_name": "UTC+02", |
||||
"viewer_in_event_tz": false, |
||||
"start_timestamp": 1630171800, |
||||
"end_timestamp": 1630186200, |
||||
"linked_group_card": null, |
||||
"event_linked_group_link_action_data": { |
||||
"linkable_groups": { "is_empty": null } |
||||
}, |
||||
"live_virtual_event_info": null, |
||||
"liveVideos": null, |
||||
"event_to_event_tours": { "nodes": [] }, |
||||
"aboutTabTools": null, |
||||
"paidAccessTabTools": null, |
||||
"event_description": { |
||||
"text": "— to konserter, kl 20 og kl 22\n— dørene åpner 30 minutter tidligere\n— id 20\n\n🎫 billetter i salg fra mandag 19. august\n😷 lokal.bar/smittevern\n\n——\n\nJonas Grieg aka LINNI er en av de mest produktive artistene vi har sett her til lands. Etter 'Minimum' / 'Medium' / 'Maksimum' trilogien, 'Silkesvarten', sideprosjektet Neste Planet og nye låter med Yoguttene har han i år gitt ut fantastiske 'Saga'... men det stopper ikke der.\n\nRett over sommeren kommer 'Nightridah', et tech/house inspirert album som skapt for å sette fyr på klubbgulv.\n\nFørstesingelen 'Barakuda' gir masse mersmak, vi har lenge hatt lyst til å invitere Linni til Lokal, og nå er timingen perfekt.\n\nBEGRENSET KAPASITET på 50 stoler per konsert, derfor setter vi opp to omganger kl 19 og kl 21.\n\nSkulle det bli lettelser på arrangementsføringer innen den tid så åpner vi gjerne opp for mer.\n\n——" |
||||
}, |
||||
"share_url": "https://facebook.com/events/s/linni-lokal-klubb/405702597560924/", |
||||
"is_eligible_for_poe_visit_dashboard_card": false, |
||||
"event_if_remote_learning_course_classes": null, |
||||
"associated_videos": null, |
||||
"is_online": false, |
||||
"has_learning_space_thread": false, |
||||
"has_messenger_room": false, |
||||
"has_fb_live": false, |
||||
"has_third_party": false, |
||||
"can_viewer_see_nit_card": false, |
||||
"nit_card_title": null, |
||||
"nit_card_body": null, |
||||
"nit_card_button_text": null, |
||||
"nit_card_uri": null, |
||||
"event_lineups": { |
||||
"edges": [], |
||||
"page_info": { "end_cursor": null, "has_next_page": false } |
||||
}, |
||||
"faq_items": { "nodes": [] }, |
||||
"event_notable_sources": { "count": 0, "nodes": [] }, |
||||
"can_viewer_see_transparency_card": true, |
||||
"transparency": { |
||||
"name_change_history_info": { "has_name_changed": false }, |
||||
"date_change_history_info": { "has_date_changed": false } |
||||
}, |
||||
"suggested_event_cuts_of_event": { |
||||
"nodes": [ |
||||
{ |
||||
"cut_type": "FRIENDS_EVENTS", |
||||
"displayed_text": "Popular With Friends", |
||||
"events": { "count": 0, "nodes": [] } |
||||
} |
||||
] |
||||
}, |
||||
"can_viewer_message": false, |
||||
"ticket_settings": { "nodes": [] }, |
||||
"event_hosts_that_can_view_guestlist": [ |
||||
{ |
||||
"__typename": "Page", |
||||
"id": "1022549294549528", |
||||
"viewer": { "actor": { "__typename": "LoggedOutUser", "id": "0" } }, |
||||
"url": "https://www.facebook.com/linje2booking/", |
||||
"name": "Linje2", |
||||
"past_event_count": { "count": 42 }, |
||||
"page_about_fields": { "blurb": null }, |
||||
"page_likers": { "global_likers_count": 581 }, |
||||
"profile_uri": { |
||||
"uri": "https://scontent.frix7-1.fna.fbcdn.net/v/t1.18169-1/p200x200/27657023_1037770509694073_6986473411550183445_n.jpg?_nc_cat=104&ccb=1-3&_nc_sid=1eb0c7&_nc_ohc=NVayHfJoB0QAX-Yv-OS&_nc_ht=scontent.frix7-1.fna&oh=fa10477e5711ecbf738347536805c981&oe=6128FB1A" |
||||
}, |
||||
"cover_url": { |
||||
"photo": { |
||||
"image": { |
||||
"uri": "https://scontent.frix7-1.fna.fbcdn.net/v/t1.6435-9/51655236_1320357664768688_6674026990665728000_n.png?_nc_cat=108&ccb=1-3&_nc_sid=e3f864&_nc_ohc=41HI-euomVsAX-1S9Z7&_nc_ht=scontent.frix7-1.fna&oh=81ec56779b118f153f9ad7e6964bd4b9&oe=612B17E7" |
||||
}, |
||||
"id": "1320357658102022" |
||||
} |
||||
}, |
||||
"is_viewer_fan": false, |
||||
"can_viewer_like": false, |
||||
"should_show_page_like_warning": false |
||||
}, |
||||
{ |
||||
"__typename": "Page", |
||||
"id": "801499590006231", |
||||
"viewer": { "actor": { "__typename": "LoggedOutUser", "id": "0" } }, |
||||
"url": "https://www.facebook.com/ygmglinni/", |
||||
"name": "Linni", |
||||
"past_event_count": { "count": 15 }, |
||||
"page_about_fields": { |
||||
"blurb": "Levemann i lekeland, rapper, danser, elsker, flammegutt, neonsurfer & eventyrer. Sjekk ut albumene Minimum & Maksimum mens du venter på Medium." |
||||
}, |
||||
"page_likers": { "global_likers_count": 954 }, |
||||
"profile_uri": { |
||||
"uri": "https://scontent.frix7-1.fna.fbcdn.net/v/t1.6435-1/p200x200/187990303_2015135801975931_8549619315634067253_n.jpg?_nc_cat=111&ccb=1-3&_nc_sid=1eb0c7&_nc_ohc=snsN8dQm8vsAX9-cdBk&_nc_ht=scontent.frix7-1.fna&oh=d3659ca1a9fc4f4c825c96c9a2af6356&oe=612BCB27" |
||||
}, |
||||
"cover_url": { |
||||
"photo": { |
||||
"image": { |
||||
"uri": "https://scontent.frix7-1.fna.fbcdn.net/v/t1.6435-9/s960x960/188465145_2015133865309458_4721806180284182920_n.jpg?_nc_cat=105&ccb=1-3&_nc_sid=e3f864&_nc_ohc=GQXjmMizm8gAX9ecKWM&_nc_ht=scontent.frix7-1.fna&oh=acbae08d2620d08026593bfdb4437f2e&oe=6128E619" |
||||
}, |
||||
"id": "2015133861976125" |
||||
} |
||||
}, |
||||
"is_viewer_fan": false, |
||||
"can_viewer_like": false, |
||||
"should_show_page_like_warning": false |
||||
}, |
||||
{ |
||||
"__typename": "Page", |
||||
"id": "191245541651071", |
||||
"viewer": { "actor": { "__typename": "LoggedOutUser", "id": "0" } }, |
||||
"url": "https://www.facebook.com/lokal.trhm/", |
||||
"name": "Lokal Bar - Scene - Klubb", |
||||
"past_event_count": { "count": 405 }, |
||||
"page_about_fields": { "blurb": "——— FRIROMMET I DIN BY ———" }, |
||||
"page_likers": { "global_likers_count": 3670 }, |
||||
"profile_uri": { |
||||
"uri": "https://scontent.frix7-1.fna.fbcdn.net/v/t1.6435-1/p200x200/68638643_486313585477597_4139052235034198016_n.png?_nc_cat=106&ccb=1-3&_nc_sid=1eb0c7&_nc_ohc=yIL4_Rogc4cAX_DUOf6&_nc_ht=scontent.frix7-1.fna&oh=fed660991a9130d02caa7073b32adcaf&oe=612B1A30" |
||||
}, |
||||
"cover_url": { |
||||
"photo": { |
||||
"image": { |
||||
"uri": "https://scontent.frix7-1.fna.fbcdn.net/v/t31.18172-8/s960x960/30425394_210293716412920_4586078545182596007_o.png?_nc_cat=109&ccb=1-3&_nc_sid=e3f864&_nc_ohc=eY6iGKrBrx4AX_wtK4N&_nc_oc=AQkBdMEEkgps95apQEW4AxiYdXj1SHiOQaw22FV2ER3yicGG1TrKGetG83r4wOKSfiA&_nc_ht=scontent.frix7-1.fna&oh=34c8d6afddc2914e595b53d38297a02d&oe=612AEEF1" |
||||
}, |
||||
"id": "210293716412920" |
||||
} |
||||
}, |
||||
"is_viewer_fan": false, |
||||
"can_viewer_like": false, |
||||
"should_show_page_like_warning": false |
||||
} |
||||
] |
||||
}, |
||||
{ |
||||
"id": "760253917947304", |
||||
"name": "Hilma Nikolaisen — Lokal Klubb", |
||||
"url": "https://www.facebook.com/events/760253917947304/", |
||||
"event_creator": { |
||||
"__typename": "Page", |
||||
"id": "191245541651071", |
||||
"pay_to_access_onboarding_info": { |
||||
"creator": { |
||||
"has_active_claimed_ad_coupon": null, |
||||
"pending_ad_coupon_content": null, |
||||
"id": "191245541651071_pay_to_access_creator" |
||||
}, |
||||
"id": "UE9FQ3JlYXRvck9uYm9hcmRpbmdJbmZvOjE5MTI0NTU0MTY1MTA3MQ==" |
||||
} |
||||
}, |
||||
"day_time_sentence": "FRI, SEP 17 AT 11:00 AM UNK", |
||||
"is_canceled": false, |
||||
"created_for_group": null, |
||||
"available_actors": null, |
||||
"rsvp_button_renderer": { |
||||
"__typename": "PublicRsvpStyleRenderer", |
||||
"event": { |
||||
"id": "760253917947304", |
||||
"connection_style": "INTERESTED", |
||||
"can_viewer_join": false, |
||||
"can_viewer_watch": false, |
||||
"can_viewer_unwatch": false, |
||||
"viewer_watch_status": "UNWATCHED", |
||||
"event_connection_data_privacy_scope": null, |
||||
"privacy_scope_for_toast": null |
||||
}, |
||||
"__module_operation_EventCometUniversalRSVPButton_event": { |
||||
"__dr": "PublicEventCometRSVPButtonRenderer_rsvpStyleRenderer$normalization.graphql" |
||||
}, |
||||
"__module_component_EventCometUniversalRSVPButton_event": { |
||||
"__dr": "PublicEventCometRSVPButtonRenderer.react" |
||||
} |
||||
}, |
||||
"rsvp_button_group_renderer": { |
||||
"__typename": "PublicRsvpStyleRenderer", |
||||
"event": { |
||||
"id": "760253917947304", |
||||
"connection_style": "INTERESTED", |
||||
"can_viewer_join": false, |
||||
"can_viewer_watch": false, |
||||
"viewer_watch_status": "UNWATCHED", |
||||
"is_past": false |
||||
}, |
||||
"__module_operation_EventCometUniversalRSVPButtonGroup_event": { |
||||
"__dr": "PublicEventCometRSVPButtonGroupRenderer_rsvpStyleRenderer$normalization.graphql" |
||||
}, |
||||
"__module_component_EventCometUniversalRSVPButtonGroup_event": { |
||||
"__dr": "PublicEventCometRSVPButtonGroupRenderer.react" |
||||
} |
||||
}, |
||||
"privacy_scope_for_toast": null, |
||||
"rsvp_style": "PUBLIC_RSVP_STYLE", |
||||
"viewer_guest_status": null, |
||||
"viewer_watch_status": "UNWATCHED", |
||||
"event_kind": "PUBLIC_TYPE", |
||||
"can_viewer_invite": false, |
||||
"can_page_viewer_invite_as_user": false, |
||||
"eventUrl": "https://www.facebook.com/events/760253917947304/", |
||||
"can_boost_event_renderer": null, |
||||
"can_viewer_see_rsvp_button": false, |
||||
"can_viewer_share": false, |
||||
"can_viewer_create_repeat_event": false, |
||||
"header_action_menu_items": [], |
||||
"is_viewer_admin": false, |
||||
"if_viewer_can_publish_draft_event": null, |
||||
"online_event_setup": null, |
||||
"paid_online_event_context": null, |
||||
"parent_if_exists_or_self": { "id": "760253917947304" }, |
||||
"event_for_edit_flow": { |
||||
"if_viewer_can_edit": null, |
||||
"id": "760253917947304" |
||||
}, |
||||
"is_eligible_for_poe_view_as_visitor_button": false, |
||||
"discovery_categories": [{ "glyph_token": "music" }], |
||||
"event_connected_users": { "count": 0, "edges": [] }, |
||||
"social_context": { "text": "45 people interested" }, |
||||
"__typename": "Event", |
||||
"ticketUrl": "http://billetter.lokal.bar/tikkio", |
||||
"hosts": { |
||||
"edges": [ |
||||
{ |
||||
"node": { |
||||
"__typename": "Page", |
||||
"name": "Polar Artist", |
||||
"pageID": "121444301228925", |
||||
"about": { |
||||
"text": "International music management and live booking agency", |
||||
"ranges": [] |
||||
}, |
||||
"category": "Agent artistique", |
||||
"city": null, |
||||
"profilePicture": { |
||||
"uri": "https://scontent-frt3-1.xx.fbcdn.net/v/t1.18169-1/p100x100/13226716_1192511330788878_2675807659535641780_n.png?_nc_cat=108&ccb=1-3&_nc_sid=1eb0c7&_nc_ohc=hekFCEl8ChsAX-tRWR-&_nc_ht=scontent-frt3-1.xx&oh=1057f7937afa7f43344706b906c395e9&oe=612BC18F" |
||||
}, |
||||
"url": "https://www.facebook.com/polarartist/", |
||||
"id": "121444301228925" |
||||
} |
||||
}, |
||||
{ |
||||
"node": { |
||||
"__typename": "Page", |
||||
"name": "Lokal Bar - Scene - Klubb", |
||||
"pageID": "191245541651071", |
||||
"about": { "text": "——— FRIROMMET I DIN BY ———", "ranges": [] }, |
||||
"category": "Bar", |
||||
"city": { "name": "Trondheim", "id": "110429825645017" }, |
||||
"profilePicture": { |
||||
"uri": "https://scontent-frt3-1.xx.fbcdn.net/v/t1.6435-1/p100x100/68638643_486313585477597_4139052235034198016_n.png?_nc_cat=106&ccb=1-3&_nc_sid=1eb0c7&_nc_ohc=yIL4_Rogc4cAX-QElEm&_nc_ht=scontent-frt3-1.xx&oh=53baa2ad424aac815f700522c1c462d3&oe=61293641" |
||||
}, |
||||
"url": "https://www.facebook.com/lokal.trhm/", |
||||
"id": "191245541651071" |
||||
} |
||||
} |
||||
] |
||||
}, |
||||
"place": { |
||||
"__typename": "Page", |
||||
"name": "Lokal Bar - Scene - Klubb", |
||||
"pageID": "191245541651071", |
||||
"about": { "text": "——— FRIROMMET I DIN BY ———", "ranges": [] }, |
||||
"category": "Bar", |
||||
"city": { "name": "Trondheim", "id": "110429825645017" }, |
||||
"profilePicture": { |
||||
"uri": "https://scontent-frt3-1.xx.fbcdn.net/v/t1.6435-1/p100x100/68638643_486313585477597_4139052235034198016_n.png?_nc_cat=106&ccb=1-3&_nc_sid=1eb0c7&_nc_ohc=yIL4_Rogc4cAX-QElEm&_nc_ht=scontent-frt3-1.xx&oh=53baa2ad424aac815f700522c1c462d3&oe=61293641" |
||||
}, |
||||
"url": "https://www.facebook.com/lokal.trhm/", |
||||
"id": "191245541651071" |
||||
}, |
||||
"is_arena_event": false, |
||||
"unified_tournament": null, |
||||
"arenas": { "nodes": [] }, |
||||
"remote_learning_class": null, |
||||
"fundraiser_charity": null, |
||||
"tz_display_name": "UTC+02", |
||||
"viewer_in_event_tz": false, |
||||
"start_timestamp": 1631901600, |
||||
"end_timestamp": 0, |
||||
"linked_group_card": null, |
||||
"event_linked_group_link_action_data": { |
||||
"linkable_groups": { "is_empty": null } |
||||
}, |
||||
"live_virtual_event_info": null, |
||||
"liveVideos": null, |
||||
"event_to_event_tours": { "nodes": [] }, |
||||
"aboutTabTools": null, |
||||
"paidAccessTabTools": null, |
||||
"event_description": { |
||||
"text": "NY KONSERTDATO ⤳ 17.09.21\nbillettsalg annonseres mot sommeren\ndørene åpner 20:00\nkonsertstart 21:00\nid 18\n\n——\n\nHilma Nikolaisen er tilbake med sitt tredje album «Heritage», som har blitt en nedstrippet men selvsikker og ikke minst livslystig halvtime med herlig musikk. Vi ønsker henne hjertelig velkommen tilbake til Trondheim med denne intime konsertkvelden!\n\nEtter to kritikerroste album kunne Hilma Nikolaisen lett fortsatt i samme retning. Groovy gitarrock bygget på kontante riff og fengende psykedeliske ekskursjoner har hun tross alt perfeksjonert. I stedet har hun med Heritage tatt et overraskende skritt til siden.\n\nDet nye albumets nedstrippede og tilnærmet akustiske lydbilde har vært et ytterst bevisst valg, og ikke et resultat av tidens traurige, pandemiske begrensninger. Resultatet har blitt Nikolaisens mest tydelige og gjennomarbeidede album, og muligens også det mest umiddelbare.\n\nSingelen «Maybe Today (Satan)» åpner albumet og setter anslaget. Nostalgisk fingerspill på en nedarvet Santana nylongitar fra 1975, et kor av tverrfløyter og en melodi som nærmest er bacharachsk i sin utsøkte enkelhet.\n\n\"Hilma Nikolaisens beste soloplate er her.\" – Audun Vinger, DN Magasinet\n\n——" |
||||
}, |
||||
"share_url": "https://facebook.com/events/s/hilma-nikolaisen-lokal-klubb/760253917947304/", |
||||
"is_eligible_for_poe_visit_dashboard_card": false, |
||||
"event_if_remote_learning_course_classes": null, |
||||
"associated_videos": null, |
||||
"is_online": false, |
||||
"has_learning_space_thread": false, |
||||
"has_messenger_room": false, |
||||
"has_fb_live": false, |
||||
"has_third_party": false, |
||||
"can_viewer_see_nit_card": false, |
||||
"nit_card_title": null, |
||||
"nit_card_body": null, |
||||
"nit_card_button_text": null, |
||||
"nit_card_uri": null, |
||||
"event_notable_sources": { "count": 0, "nodes": [] }, |
||||
"event_lineups": { |
||||
"edges": [], |
||||
"page_info": { "end_cursor": null, "has_next_page": false } |
||||
}, |
||||
"faq_items": { "nodes": [] }, |
||||
"suggested_event_cuts_of_event": { |
||||
"nodes": [ |
||||
{ |
||||
"cut_type": "FRIENDS_EVENTS", |
||||
"displayed_text": "Beliebt bei Freunden", |
||||
"events": { "count": 0, "nodes": [] } |
||||
} |
||||
] |
||||
}, |
||||
"can_viewer_message": false, |
||||
"ticket_settings": { "nodes": [] }, |
||||
"event_hosts_that_can_view_guestlist": [ |
||||
{ |
||||
"__typename": "Page", |
||||
"id": "191245541651071", |
||||
"viewer": { "actor": { "__typename": "LoggedOutUser", "id": "0" } }, |
||||
"url": "https://www.facebook.com/lokal.trhm/", |
||||
"name": "Lokal Bar - Scene - Klubb", |
||||
"past_event_count": { "count": 405 }, |
||||
"page_about_fields": { "blurb": "——— FRIROMMET I DIN BY ———" }, |
||||
"page_likers": { "global_likers_count": 3670 }, |
||||
"profile_uri": { |
||||
"uri": "https://scontent.frix7-1.fna.fbcdn.net/v/t1.6435-1/p200x200/68638643_486313585477597_4139052235034198016_n.png?_nc_cat=106&ccb=1-3&_nc_sid=1eb0c7&_nc_ohc=yIL4_Rogc4cAX-n-CJE&_nc_ht=scontent.frix7-1.fna&oh=723fc198b1c979dbfbd8c68cafeab2ee&oe=612B1A30" |
||||
}, |
||||
"cover_url": { |
||||
"photo": { |
||||
"image": { |
||||
"uri": "https://scontent.frix7-1.fna.fbcdn.net/v/t31.18172-8/s960x960/30425394_210293716412920_4586078545182596007_o.png?_nc_cat=109&ccb=1-3&_nc_sid=e3f864&_nc_ohc=eY6iGKrBrx4AX8KjQUJ&_nc_oc=AQmahJMBcGqH2Z4ZlhYoYvjZ2tVF2xGwPPJBPucmPXwxM_hW3GzRk16qHjxtCDZPrG4&_nc_ht=scontent.frix7-1.fna&oh=9e83fac8ea96f0ea0c62f9999e8a51d0&oe=612AEEF1" |
||||
}, |
||||
"id": "210293716412920" |
||||
} |
||||
}, |
||||
"is_viewer_fan": false, |
||||
"can_viewer_like": false, |
||||
"should_show_page_like_warning": false |
||||
}, |
||||
{ |
||||
"__typename": "Page", |
||||
"id": "121444301228925", |
||||
"viewer": { "actor": { "__typename": "LoggedOutUser", "id": "0" } }, |
||||
"url": "https://www.facebook.com/polarartist/", |
||||
"name": "Polar Artist", |
||||
"past_event_count": { "count": 560 }, |
||||
"page_about_fields": { |
||||
"blurb": "International music management and live booking agency" |
||||
}, |
||||
"page_likers": { "global_likers_count": 2778 }, |
||||
"profile_uri": { |
||||
"uri": "https://scontent.frix7-1.fna.fbcdn.net/v/t1.18169-1/p200x200/13226716_1192511330788878_2675807659535641780_n.png?_nc_cat=108&ccb=1-3&_nc_sid=1eb0c7&_nc_ohc=hekFCEl8ChsAX8rrxzZ&_nc_ht=scontent.frix7-1.fna&oh=c3c888d6f602307bd538cd3354c9dbae&oe=6128F92E" |
||||
}, |
||||
"cover_url": { |
||||
"photo": { |
||||
"image": { |
||||
"uri": "https://scontent.frix7-1.fna.fbcdn.net/v/t1.6435-9/s960x960/170848750_5706897106016922_6014426456866089959_n.jpg?_nc_cat=108&ccb=1-3&_nc_sid=e3f864&_nc_ohc=P3Gc1aa6buIAX-SK6ox&_nc_oc=AQmAK6z3gO7_CXG6OVVrIIgkXT2lrFTmxewufu6tRLt9_58eO0BtTvNOS_EgEnEdo0g&_nc_ht=scontent.frix7-1.fna&oh=00ad207b73c7d828c589a6ad4fd8c6de&oe=612A8003" |
||||
}, |
||||
"id": "5706897096016923" |
||||
} |
||||
}, |
||||
"is_viewer_fan": false, |
||||
"can_viewer_like": false, |
||||
"should_show_page_like_warning": false |
||||
} |
||||
], |
||||
"can_viewer_see_transparency_card": true, |
||||
"transparency": { |
||||
"name_change_history_info": { "has_name_changed": true }, |
||||
"date_change_history_info": { "has_date_changed": true } |
||||
} |
||||
} |
||||
] |
||||
@ -1,22 +0,0 @@
|
||||
{ |
||||
"license": "MIT", |
||||
"dependencies": { |
||||
"https-proxy-agent": "^5.0.0", |
||||
"minimist": "^1.2.5", |
||||
"node-fetch": "^2.6.1", |
||||
"ramda": "^0.27.0" |
||||
}, |
||||
"devDependencies": { |
||||
"@babel/core": "^7.10.1", |
||||
"@babel/preset-env": "^7.10.1", |
||||
"babel-jest": "^26.0.1", |
||||
"eslint": "^7.4.0", |
||||
"eslint-config-prettier": "^6.11.0", |
||||
"jest": "^26.0.1" |
||||
}, |
||||
"scripts": { |
||||
"test": "jest", |
||||
"watch": "jest --watch" |
||||
}, |
||||
"sourceType": "module" |
||||
} |
||||
@ -1,95 +0,0 @@
|
||||
import { parse_args } from '../src/logic'; |
||||
|
||||
const process = require('process'); |
||||
const process_mock = jest.spyOn(process, 'exit').mockImplementation(() => true); |
||||
|
||||
describe('test parse args', () => { |
||||
it.only('parses help options', () => { |
||||
const res = parse_args(['livesentralen']); |
||||
expect(res.page_id).toEqual( |
||||
'https://www.facebook.com/livesentralen/events/', |
||||
); |
||||
}); |
||||
it.only('parses help options', () => { |
||||
const res = parse_args(['"livesentralen"']); |
||||
expect(res.page_id).toEqual( |
||||
'https://www.facebook.com/livesentralen/events/', |
||||
); |
||||
}); |
||||
['-?', '--help', '-h'].forEach((param) => { |
||||
it('parses help options', () => { |
||||
const res = parse_args([param]); |
||||
expect(process_mock).toHaveBeenCalledWith(1); |
||||
}); |
||||
}); |
||||
|
||||
it('parses event option', () => { |
||||
const res = parse_args(['--events=events.json']); |
||||
expect(res.events).toEqual('events.json'); |
||||
}); |
||||
|
||||
it('parses event option', () => { |
||||
const res = parse_args(['--events="events.json"']); |
||||
expect(res.events).toEqual('events.json'); |
||||
}); |
||||
|
||||
it('sets events to null if no option is passed', () => { |
||||
const res = parse_args(['']); |
||||
expect(res.events).toEqual(null); |
||||
}); |
||||
|
||||
it('sets output to null if no option is passed', () => { |
||||
const res = parse_args(['']); |
||||
expect(res.output).toEqual(null); |
||||
}); |
||||
|
||||
it('passes output if it is set with --output', () => { |
||||
const res = parse_args(['--output=jacobi']); |
||||
expect(res.output).toEqual('jacobi'); |
||||
}); |
||||
|
||||
it('passes output if it is set with --output', () => { |
||||
const res = parse_args(['--output="jacobi"']); |
||||
expect(res.output).toEqual('jacobi'); |
||||
}); |
||||
|
||||
it('passes output if it is set with -o', () => { |
||||
const res = parse_args(['-o', 'jacobi']); |
||||
expect(res.output).toEqual('jacobi'); |
||||
}); |
||||
|
||||
it('passes output if it is set with -o', () => { |
||||
const res = parse_args(['-o', '"jacobi"']); |
||||
expect(res.output).toEqual('jacobi'); |
||||
}); |
||||
|
||||
it('parses skip upcoming events option', () => { |
||||
const res = parse_args(['--skip-upcoming-events']); |
||||
expect(res.get_upcoming_events).toEqual(false); |
||||
}); |
||||
|
||||
it('sets the correct default value for getting upcoming events', () => { |
||||
const res = parse_args([]); |
||||
expect(res.get_upcoming_events).toEqual(true); |
||||
}); |
||||
|
||||
it('sets the correct default value for getting upcoming events', () => { |
||||
const res = parse_args([]); |
||||
expect(res.get_past_events).toEqual(false); |
||||
}); |
||||
|
||||
it('parses skip upcoming events option', () => { |
||||
const res = parse_args(['--past-events']); |
||||
expect(res.get_past_events).toEqual(true); |
||||
}); |
||||
|
||||
it('parses no-headless option to true', () => { |
||||
const res = parse_args(['']); |
||||
expect(res.headless).toBe(true); |
||||
}); |
||||
|
||||
it('parses no-headless option to false', () => { |
||||
const res = parse_args(['--no-headless']); |
||||
expect(res.headless).toBe(false); |
||||
}); |
||||
}); |
||||
@ -1,72 +0,0 @@
|
||||
import { read_previous_events } from '../src/logic'; |
||||
|
||||
beforeEach(jest.restoreAllMocks); |
||||
|
||||
const fs = require('fs').promises; |
||||
const filesystem = require('fs'); |
||||
const process = require('process'); |
||||
|
||||
describe('read_previous_event', () => { |
||||
[null, undefined].forEach((path) => |
||||
it(`it should return an empty array if path is ${path}`, () => { |
||||
expect.assertions(1); |
||||
read_previous_events(path).then((res) => expect(res).toEqual([])); |
||||
}), |
||||
); |
||||
|
||||
it(`it should return an empty array if path does not exist`, () => { |
||||
const exist = jest |
||||
.spyOn(filesystem, 'existsSync') |
||||
.mockImplementation(() => false); |
||||
expect.assertions(3); |
||||
return read_previous_events().then((res) => { |
||||
expect(res).toEqual([]); |
||||
expect(exist).toHaveBeenCalledTimes(1); |
||||
expect(exist).toHaveBeenCalledWith(undefined); |
||||
}); |
||||
}); |
||||
|
||||
it(`it should return an empty array if parse says so`, () => { |
||||
jest.spyOn(filesystem, 'existsSync').mockImplementation(() => true); |
||||
const mock = jest |
||||
.spyOn(fs, 'readFile') |
||||
.mockImplementation(() => Promise.resolve('[]')); |
||||
expect.assertions(3); |
||||
const path = 'directory'; |
||||
return read_previous_events(path).then((res) => { |
||||
expect(mock).toHaveBeenCalledTimes(1); |
||||
expect(mock).toHaveBeenCalledWith(path, { encoding: 'utf-8' }); |
||||
expect(res).toEqual([]); |
||||
}); |
||||
}); |
||||
|
||||
it(`it should end process if file cannot be read`, () => { |
||||
jest.spyOn(filesystem, 'existsSync').mockImplementation(() => true); |
||||
const exit = jest.spyOn(process, 'exit').mockImplementation(() => true); |
||||
const error = jest.spyOn(console, 'error').mockImplementation(() => true); |
||||
const mock = jest |
||||
.spyOn(fs, 'readFile') |
||||
.mockImplementation(() => Promise.reject('ERROR')); |
||||
expect.assertions(2); |
||||
const path = 'directory'; |
||||
return read_previous_events(path).then((res) => { |
||||
expect(exit).toHaveBeenCalledWith(1); |
||||
expect(error).toHaveBeenCalledWith('ERROR'); |
||||
}); |
||||
}); |
||||
|
||||
it(`it should end process if JSON cannot be parsed`, () => { |
||||
jest.spyOn(filesystem, 'existsSync').mockImplementation(() => true); |
||||
const exit = jest.spyOn(process, 'exit').mockImplementation(() => true); |
||||
const error = jest.spyOn(console, 'error').mockImplementation(() => true); |
||||
const mock = jest |
||||
.spyOn(fs, 'readFile') |
||||
.mockImplementation(() => Promise.resolve('ERROR')); |
||||
expect.assertions(2); |
||||
const path = 'directory'; |
||||
return read_previous_events(path).then((res) => { |
||||
expect(exit).toHaveBeenCalledWith(1); |
||||
expect(error).toHaveBeenCalledTimes(1); |
||||
}); |
||||
}); |
||||
}); |
||||
Loading…
Reference in new issue